Python+GIS — shapefile轉geojson(核心代碼只需2行)

背景

geojson是地圖可視化系統中最常用的地理數據格式,幾乎所有主流地圖可視化庫或框架都支持geojson數據的加載。geojson數據通常是由其他數據轉換而來的,最常見的就是ESRI Shpfile數據轉geojson,專業GIS軟件中諸如QGIS,FME等都支持二者的互相轉換,但這些軟件不僅過於龐大,而且專業性較強,作爲一個GIS專業的我也不願使用。之前用java寫過二者轉換的工具,但代碼實在過於繁瑣。直到使用了python的geopandas庫。

步驟

1. 安裝geopandas

最簡單的方式:

conda install geopandas

也可以使用pip進行安裝,但需要把其他的一些依賴庫事先安裝好(numpy, pandas, shapely, fiona, pyproj等),這個不做贅述。

2. 代碼

import geopandas as gpd

def shp2gj(input_file, output_file):
    data = gpd.read_file(input_file)
    data.to_file(output_file, driver="GeoJSON", encoding='utf-8') # 指定utf-8編碼,防止中文亂碼
    print('Success: File '+input_file.split('\\') [-1] + ' conversion completed')

兩個參數,input_file(輸入的文件,xxx.shp),output_file(輸出的文件,xxx.json)。主要代碼只有兩行:讀數據(read_file),寫數據(to_file);寫數據時指定 driver="GeoJSON" 即可;爲防止中文亂碼,指定 encoding='utf-8'

3. 擴展

上述代碼將shapefile轉爲geojson。同樣也可以將shapefile或geojson轉爲其他格式,如:將geojson轉爲shapefile,只需把driver參數改爲ESRI Shapefile即可。

data = gpd.read_file(r'yourPath\xxx.json')
data.to_file(r'yourPath\xxx.shp', driver="ESRI Shapefile", encoding='utf-8') # 指定utf-8編碼,防止中文亂碼

有時geojson沒有空間參考,需要指定空間參考:

import geopandas as gpd
from fiona.crs import from_epsg

data = gpd.read_file(r'yourPath\xxx.josn')
data.crs = from_epsg(4326) # 指定空間參考爲4326(WGS84座標)
data.to_file(r'yourPath\xxx.shp', driver="ESRI Shapefile", encoding='utf-8')

driver支持的數據類型可通過如下代碼查看:

>>> import fiona
>>> fiona.supported_drivers
{'ESRI Shapefile': 'raw', 'ARCGEN': 'r', 'PCIDSK': 'r', 'SUA': 'r', 
'DGN': 'raw', 'SEGY': 'r', 'MapInfo File': 'raw', 'GeoJSON': 'rw', 'PDS': 'r', 
'FileGDB': 'raw', 'GPX': 'raw', 'DXF': 'raw', 'GMT': 'raw', 'Idrisi': 'r', 
'GPKG': 'rw', 'OpenFileGDB': 'r', 'BNA': 'raw', 'AeronavFAA': 'r', 
'GPSTrackMaker': 'raw'}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章