S57海圖資料中包含了大量的圖層,在目前ArcMap軟體作為必備的GIS軟體之一,所以還是shp格式處理起來可能比較方便(這裡的方便僅僅是對於某些人覺得shp最常見,用的最廣泛而言,其實我本人覺得shp不好的地方就是一個資料要多個檔案組成,有點不爽)。所以可能需要把S57的資料轉為shp資料。下面使用gdal提供的ogr2ogr工具來進行轉換,希望對大家有用。
首先我們使用ogrinfo查看s57的資料中包含的圖層等資訊,因為後面轉換的時候需要這個資訊。1所示。
圖1 S57資料中包含的圖層
知道了s57資料中包含的圖層,下面就可以使用ogr2ogr工具來將s57中的圖層轉為shp資料,命令列如下:
C:\gdal\bin>ogr2ogr.exe -f "ESRI Shapefile" D:\s57polygon.shp D:\s57\C1100102.000 Area
圖2 使用OGR2OGR轉換為shp格式
從可以看出,shp資料的屬性工作表中不支援StringList和IntegerList格式的屬性值報錯了。其他的還是都正確的。
今天還發現一個問題,同樣的s57資料,同樣的gdal庫,在我的電腦上就出現異常了。這個s57的資料中其實是有25個圖層,比如使用QGIS開啟是就是對的,3所示,而我使用GDALinfo查看卻是只有5個圖層,1所示,但是這個資料我在另外一台電腦顯示的卻是25個圖層與QGIS一致,這個問題目前還沒找到造成的原因,後續待查。目前大致可以肯定的是,將25個圖層讀取為5個圖層,貌似分類是DSID一個,點,線,面和中繼資料四個圖層。也就是把25個圖層按照圖層類型給重新歸類了,這點可以從圖2轉出來的資料進行驗證。
圖3 QGIS開啟的s57資料顯示的圖層個數
用QGIS開啟圖2將面狀資料轉為shp載入進去,還有把s57所有的面狀資料載入進去,圖4所示,可以發現兩者還是有很大的差異的,但是我在公司的電腦讀取的25個圖層,然後轉一個就OK。
圖4 載入shp資料顯示輪廓
圖5 載入s57面狀資料顯示輪廓
……………………………………………………分割線…2013-07-13………………………………………………………………………
上文中的開啟S57的資料圖層變成5個,原因已經查明,就是沒有設定GDAL_DATA的目錄導致。在程式開始中使用下面的代碼即可讀取到S57的圖層。
CPLSetConfigOption("GDAL_DATA","C:\warmerda\bld\data");
如果使用的ogrinfo的命令列工具,在命令列中加入下面的參數也可以。
--config GDAL_DATA C:\warmerda\bld\data