shp系列(一)——利用C++進行shp檔案的讀(開啟)與寫(建立)開言
部落格背景和目的
最近在用C++寫一個底層的東西,需要讀取和建立shp檔案。雖然接觸shp檔案已經幾年了,但是對於shp檔案內到底包含什麼東西一直是一知半解。以前使用shp檔案都是利用軟體(如ArcGIS)直接開啟,儲存;建立檔案則需要專門利用ArcToolBox等建立圖形。
網上有現成的有關shp檔案的庫,如GDAL等,可以結合這些庫來讀寫shp檔案。但是由於程式設計環境問題、庫的版本、編譯、引用等等問題,在現有情況下無法正常使用,加之使用現有的庫不能讓我從底層完全瞭解shp檔案的組織方式,遂決心一點點地自己動手寫讀和寫(建立)的方法。
在嘗試解決這個問題的時候,我瀏覽了網上眾多有關shp檔案讀寫的部落格和資料,發現大多部落格對於shp檔案的情況和讀取過程有詳細的記錄,但是幾乎沒有寫(建立)底層shp檔案的程式碼示例。雖然“寫”與“讀”類似,但是其中還是有很多“陷阱”。為了記錄自己的探索歷程,同時給後面的人提供經驗和參考,故寫此部落格,希望能給讀者提供幫助。
shp檔案基本情況
shp是shapefile的縮寫,關於shapefile的歷史和特點我不過多敘述,網上隨便一搜都有詳細內容,我著重敘述幾點:
- 一個完整的shapefile檔案至少包含shp檔案、dbf檔案和shx檔案,它們都是同名的,檔案的字尾格式是.shp、.dbf和.shx。也就是說,缺少其中任何一項,都無法直接用ArcGIS開啟。
- shp檔案主要包含圖形座標資料,由檔案頭和實體資訊組成。
- dbf檔案主要記錄要素的屬性資訊,實際上是一個表,在ArcGIS中開啟後實際上就是屬性表。
- shx檔案是索引檔案,記錄主檔案(shp檔案)中每條記錄距離主檔案開始位置的偏移量和每條記錄的長度。
- shp的讀寫意味著shp、dbf和shx的讀寫,利用C++程式讀的過程中如果只是需要圖形和屬性,shx不是必需的;但是寫的時候為了使輸出的shp能被廣泛使用,必須要寫(建立)shx檔案。
- shp等三個檔案都是二進位制檔案,變數有big和little區分,還涉及16進位制和10進位制的轉換。
程式設計環境
C++ 、VS2010、MFC
其他工具
推薦一個檢查shp、shx和dbf檔案的神器——shapechk.exe,這個工具可以檢查shp檔案是否有問題、能檢查和生成shx和dbf。資源見下方。
閱讀資料
《shape白皮書.pdf》英文版shapefile說明的翻譯版。
《shp檔案詳細格式.doc》 詳細解讀shp格式,並且有讀取檔案的原始碼。
工具和參考資料下載連結:https://pan.baidu.com/s/1YLwqTFfqLYguQntk7PrpGw
提取碼: cshy
雖然有以上參考資料,但是實際程式設計中仍會有許多問題,眾多問題將在後面的部落格中一一敘述。