基于GDAL和GeoPandas实现Shape转GeoJson功能小积累,现有两种shape转geojson的方法:
1、基于GDAL
import gdal
import ogr
import os
def gdal_ShapeToGeojson(shp_file, geojson_file):
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
src_ds = ogr.Open(shp_file)
src_layer = src_ds.GetLayer(0)
# 创建结果Geojson
baseName = os.path.basename(geojson_file)
dst_driver = ogr.GetDriverByName('GeoJSON')
dst_ds = dst_driver.CreateDataSource(geojson_file)
if dst_ds.GetLayer(baseName):
dst_ds.DeleteLayer(baseName)
dst_layer = dst_ds.CreateLayer(baseName, src_layer.GetSpatialRef())
dst_layer.CreateFields(src_layer.schema)
dst_feat = ogr.Feature(dst_layer.GetLayerDefn())
# 生成结果文件
for feature in src_layer:
dst_feat.SetGeometry(feature.geometry())
for j in range(feature.GetFieldCount()):
dst_feat.SetField(j, feature.GetField(j))
dst_layer.CreateFeature(dst_feat)
del dst_ds
del src_ds
print("转换成功。")
2、基于GeoPandas
import geopandas
def geopandas_ShapeToGeojson(shp_file, geojson_file):
if os.path.exists(geojson_file):
os.remove(geojson_file)
out_data = geopandas.read_file(shp_file)
crs = out_data.crs
out_data = geopandas.GeoSeries(out_data.geometry, crs=crs)
out_data.to_file(geojson_file, driver='GeoJSON', encoding="utf-8")