讀shp檔案 如何使用Python處理shp檔案

2021-10-14 20:34:39 字數 3135 閱讀 2490

涉及到空間資料處理的時候,為了比較清晰方便的看出空間資料所處的區域,通常都需要將省市邊界線加到地圖中。

python中也提供了大量的shp檔案處理方法,有底層的一些庫,也有一些封裝比較完整的庫。比如:

•fiona[1]:基於ogr的封裝,提供了更簡潔的api•pyshp[2]:純python實現的shape檔案處理庫,支援shp,shx和dbf檔案的讀寫•ogr:gdal中的用於處理邊界檔案的模組•geopandas[3]:基於fiona進行了封裝

pip install fiona
import fionashps = fiona.open('chn_adm2.shp')
>>> shps.schema
>>> shps.encoding  'utf-8'
>>> shps.crs  >>> shps.crs_kwt  'geogcs["gcs_wgs_1984",datum["wgs_1984",spheroid["wgs_84",6378137.0,298.257223563]],primem["greenwich",0.0],unit["degree",0.0174532925199433],authority["epsg","4326"]]
>>> shp = next(iter(shps))
>>> shp.keys()dict_keys(['type', 'id', 'geometry', 'properties'])
>>> shp.get('type')>>> shp.get('id')>>> shp.get('geometry')
shps 變數包含了一些方法可以獲取shape檔案中的每個邊界,比如.next.iterms等。

.next方法將在 fiona 2.0版本中移除,可改用 next(iter(shps))進行單個迭代,或者使用 shps.iterms 進行迴圈迭代。

fiona中提供了shp檔案的讀取方法,但是並沒有提供視覺化方法,如果使用fiona處理,還需要單獨進行畫圖的操作。

構建shp檔案的操作很少使用,但有時候可能需要從已有的shp檔案中提取乙個子區域。

subshp = fiona.open('subshp.shp', mode='w',                     crs=shps.crs, crs_wkt=shps.crs_wkt,                     driver=shps.driver,                     encoding=shps.encoding,                     schema=shps.schema)
fiona預設的方式是讀,只需要改為寫,然後提供原始檔中的一些資訊即可。

>>> shp = next(iter(shps))>>> subshp.write(shp)  ## 寫入字段》 subshp.flush()  ## 更新檔案》 subshp.close()  ## 關閉檔案
上述方法只是從原始檔中隨意選擇了乙個子區域,可以根據需要選擇特定的區域,然後寫入檔案即可。

⚠️:不要忘記更新檔案。

pip install pyshp
import shapefileshps = shapefile.reader('chn_adm2.shp')
讀取後返回的shps中也包含了很多方法,其中.fields包含了shape檔案中的一些字段資訊,類似 fiona 中的.schema方法:

>>> shps.fields[('deletionflag', 'c', 1, 0), ['id_0', 'n', 10, 0], ['iso', 'c', 3, 0], ['name_0', 'c', 75, 0], ['id_1', 'n', 10, 0], ['name_1', 'c', 75, 0], ['id_2', 'n', 10, 0], ['name_2', 'c', 75, 0], ['hasc_2', 'c', 15, 0], ['ccn_2', 'n', 10, 0], ['cca_2', 'c', 254, 0], ['type_2', 'c', 50, 0], ['engtype_2', 'c', 50, 0], ['nl_name_2', 'c', 75, 0], ['varname_2', 'c', 150, 0]]
>>> shps.numrecords  # shape檔案中包含了多少個記錄數,即子檔案數
>>> shp = shps.shaperecord()
>>> shp.record  # 返回列表[49,'chn','china',1,'anhui',1,'anqing','',0,'','dìjíshì','prefecture city','安慶市','ānqìng']
類似 fiona 中獲取shape子檔案的屬性資訊,但fiona返回為字典。

>>> shp.shape.points # 包含了經緯度座標》 shp.shape.bbox  # shape子檔案範圍
上述兩個庫,均可以進行shape檔案的讀寫操作,但並沒有提供視覺化的方法。如果想看圖的時候可以使用arcgis或者qgis,匯入檔案即可。或者使用geopandas進行處理,geopandas提供了shape檔案的處理和視覺化,具有更為簡便的api。

pip install geopandas
import geopandasshps = geopandas.read_file('chn_adm1.shp')shps.plot()
[1]fiona:[2]pyshp:[3]geopandas: 

如何用expect讀檔案

之前我寫expect指令碼喜歡在bash中嵌入here document來實現,因為這樣往expect指令碼中傳shell變數比較方便。結果最近發現有個問題,當我用while讀檔案的時候,變數值全部為空。這是因為here document中把變數當作是bash的變數,而不是expect中的變數。所以...

如何匯出SHP檔案中的點座標?(ArcGIS10)

行政區域座標,網上流傳較廣的版本是包括海域的,假如你僅僅想要把陸地邊界繪出,那麼怎麼辦呢?現在講一下用arcgis 10從shp線 面檔案中獲取對應區域的座標呢?點圖層忽略第一步 首先用在arcmap中新增相應圖層,然後開始操作 1 地理資料 arctoolbox 資料管理工具 要素 要素折點轉點 ...

如何使用pytho幫助函式和文件

python 幫助 toc 在查詢函式用法時遇到一些小問題,在此記錄,逐漸補充。參考部落格 python基礎31 help 來檢視幫助 在互動命令列下可查詢內建函式的詳細資訊 可用的檢視 help modules 檢視python所有的modules help modules yourstr 單看p...