天天看點

一種激進的觀點:不要再用 shp 格式了

原文出自:switchfromshapefile.org

譯者注:本文略偏激,但是我大部分贊同不要再用 shp 格式的思想,積極擁抱新的生産力。

<code>ESRI Shapefile</code> 簡稱 shp 格式,是由 ESRI 公開的一種矢量資料格式,它已經有30多年的曆史了。

盡管這些年它為各行各業提供了巨大的生産力,但是它在現在這個需求越來越變态的行業中已經略顯力不從心。

作為 GIS IT 行業的一員,是時候停止使用 shp 格式并引入新格式了。

列舉了一些為什麼它的占有率如此之高的原因:

各種軟體幾乎都内置支援

雖然格式是 ESRI 專有,但是其規範是公開的

在大多數場景中它夠用

索引檔案 (*.shx)為主檔案(*.shp)提供良好的讀取性能

檔案體積不大,它在未使用 zip 壓縮時都要比其他格式要小一些(尤其是文本類型的格式)

原因可就多多了:

無坐标系定義(憋急,待會你看下面仔細的介紹)

是一種多檔案格式

屬性名限制在10個字元

DBF檔案限制了最多255個屬性

限制了資料類型,隻能是 float、integer、date、text(text最多254字元)

并不指明編碼格式

單檔案最大2GB

無拓撲

幾何類型在一個檔案中是單一的

複雜的資料結構是存不了的

無法存儲帶紋理材質的三維資料;無法存儲參數化對象等

投影的定義

必須在要素級别挨個指定幾何類型,而不是在資料層面就指定

無空值

...

預設情況下,shp 格式是不帶坐标系定義的,必須額外使用一個 <code>*.prj</code> 檔案來定義。但是這裡要說清楚,<code>*.prj</code> 并非 shp 格式規範裡的内容,是額外加上去的。

你至少要三個檔案才能完整使用一個 shp 格式 —— <code>*.shx</code> + <code>*.shp</code> + <code>*.dbf</code>。

你甚至見過更多的檔案,例如上面提到的 prj,還有 cfg,等等等等。通常,你需要進行 zip 打包或者挨個發送,才能保證資料完整,相信新手都有傳少檔案導緻烏龍的情況。

是以,在一些古老的高校中仍然推崇使用拼音首字母來寫屬性,你用英文單詞還随時可能爆掉。

其實,255個屬性放在先進的場景下也足夠了,譯者并不覺得是什麼缺點。

僅支援 <code>float</code>、<code>integer</code>、<code>char</code>、<code>date</code> 四種。對于 <code>blob</code>、<code>數組</code>、<code>圖像</code> 就不支援了。

一定有朋友在剛接觸時,發現 shp 的屬性表是亂碼的,這就是編碼問題,原先編輯時用的是 gb 編碼,換一台機器變成了 utf8,或者反過來,就會導緻顯示亂碼,這個是曆史遺留問題。

<code>.shp</code> 和 <code>.dbf</code> 檔案最大 2GB,雖然 GDAL 的驅動克服了這個限制可以達到 4GB

譯者覺得即使是 2GB,對于單份可編輯型資料來說也很大了。

它不存儲複雜的幾何關系。

一個 shp 檔案,隻能是一種幾何類型的檔案。

譯者覺得保持檔案單一性也挺好的,并不認為一個資料檔案裡有多種幾何類型是什麼優點。

鍊式資料結構,不支援層級資料的存儲等。

multipatch 雖然是三維幾何形狀,但是并不支援存儲三維資料所需的紋理、材質資訊。

通常,定義坐标系的 <code>.prj</code> 檔案使用的是 <code>ESRI WKT</code> 來定義坐标系統投影資訊,這個與 <code>EPSG</code> 的定義是不相容的。

例如 <code>multi-polygon</code> 和 <code>multi-polyline</code>。

無法在屬性字段裡寫“沒有資料”。不過譯者覺得這是個好事。

目前有完全能替代 shp 檔案格式的格式嗎?似乎沒有,畢竟瘦死的駱駝比馬大,在 shp 格式還沒有完全阻礙到生産之前,新格式并沒有那麼重要。

列舉幾個:

GeoPackage

FlatGeobuf

GeoJSON

GML

SpatialLite

CSV

KML

譯者注:早些年我就寫過 gpkg 格式的部落格,百度搜即可,很容易找到。

主要特點:

以 SQLite 為基礎

單檔案

支援矢量和栅格

有官方拓展

多軟體支援

譯者注:我也寫過這個格式,好好找找,能找到的~

使用 FlatBuffers 二進制編碼

支援矢量資料

序列化和流式傳輸相當高效率

性能優秀

多程式設計語言、多軟體支援

這個不必多說,用過都知道,短小精悍,但是缺點也很明顯。

這可能不太算一種 shp 格式的替代品,因為 GML 格式相對來說複雜得多,軟體支援率也不算很廣泛。

SpatialLite 與 GeoPackage 一樣是基于 SQLite 拓展而來,但是它隻支援矢量資料。不過能用 SpatialLite 的場景,一般也支援 GeoPackage,SpatialLite 隻是特定場合的 shp 格式替代品。

就是一文本表格,它不一定是地理資料,但是它存儲地理資料的時候,最大的特點就是簡單,對非 GIS 行業的人來說特别友好。

kml 是因谷歌地球的歡迎而起家的一種矢量資料格式,最大的特點就是能把樣式也帶進資料裡。其本質是一種 XML 文本檔案。僅支援 WGS84 坐标系。

作為一種 shp 替代品,GeoDatabase 格式完全稱職。但是它并不開源,且資料格式為 ArcGIS 專有。

特點:

面向對象的資料存儲格式

存儲媒體是多個散列檔案

支援極為複雜的資料模型

專有格式且是閉源格式

繼續閱讀