Python+GIS — shapefile转geojson(核心代码只需2行)

背景

  geojson是地图可视化系统中最经常使用的地理数据格式,几乎全部主流地图可视化库或框架都支持geojson数据的加载。geojson数据一般是由其余数据转换而来的,最多见的就是ESRI Shpfile数据转geojson,专业GIS软件中诸如QGIS,FME等都支持两者的互相转换,但这些软件不只过于庞大,并且专业性较强,做为一个GIS专业的我也不肯使用。以前用java写过两者转换的工具,但代码实在过于繁琐。直到使用了python的geopandas库。java

步骤

1. 安装geopandas

最简单的方式:python

conda install geopandas

也可使用pip进行安装,但须要把其余的一些依赖库事先安装好(numpy, pandas, shapely, fiona, pyproj等),这个不作赘述。json

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支持的数据类型可经过以下代码查看:code

>>> 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'}
相关文章
相关标签/搜索