Shapefile 与 GeoJSON 之间的转换:Python 实践
Shapefile 与 GeoJSON 之间的转换:Python 实践
ytkz引言
在处理地理信息系统(GIS)数据时,我们经常会遇到各种数据格式。其中,Shapefile 和 GeoJSON 是两种常见的地理数据格式。Shapefile 是一种广泛使用的地理数据格式,由 ESRI 开发。GeoJSON 是一种基于 JSON 的地理数据格式,适合在网络中传输和存储。
在本文中,我们将介绍如何使用 Python 的 geopandas 和 GDAL 库将 Shapefile 格式的文件转换为 GeoJSON 格式,以及如何将 GeoJSON 格式的文件转换为 Shapefile 格式。
Shapefile 转 GeoJSON
以下是一个使用 geopandas 库将 Shapefile 文件转换为 GeoJSON 文件的函数:
import os
import geopandas as gpd
def shp2geojson_gpd(shp_file, geojson_file):
"""
将shapefile格式的文件转化为geojson
:param shp_file: 需要转换的shapefile文件名,投影信息可以缺失,也可以指定
:param geojson_file: 转换输出的geojson文件名
"""
if os.path.exists(geojson_file):
os.remove(geojson_file)
out_data = gpd.read_file(shp_file)
crs = out_data.crs
out_data = gpd.GeoSeries(out_data.geometry, crs=crs)
out_data.to_file(geojson_file, driver='GeoJSON', encoding="utf-8")
print("successfully convert shapefile to geojson")
这个函数首先检查输出的 GeoJSON 文件是否已经存在,如果存在则删除。然后,使用 geopandas 的 read_file
函数读取 Shapefile 文件,并保留其坐标参考系统(CRS)。最后,使用 to_file
函数将数据写入 GeoJSON 文件。
GeoJSON 转 Shapefile
以下是一个使用 GDAL 库将 GeoJSON 文件转换为 Shapefile 文件的函数:
from osgeo import gdal, ogr
def geojson2shp(geojson, shp_path):
gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
geoj_driver = ogr.GetDriverByName("GeoJSON")
g_ds = geoj_driver.Open(geojson)
dv = ogr.GetDriverByName("ESRI Shapefile")
dv.CopyDataSource(g_ds, shp_path)
这个函数首先设置 Shapefile 的编码为 GBK,然后使用 GDAL 的 GetDriverByName
函数获取 GeoJSON 和 ESRI Shapefile 的驱动。接着,打开 GeoJSON 文件,并使用 CopyDataSource
函数将数据复制到 Shapefile 文件。
流程
以下是使用上述两个函数(shp2geojson_gpd
和geojson2shp
)进行Shapefile和GeoJSON之间转换的步骤流程:
Shapefile 转 GeoJSON
- 指定输入和输出文件:确定你需要转换的Shapefile文件(
shp_file
)和转换后GeoJSON文件的存放路径(geojson_file
)。 - 检查输出文件是否存在:如果输出文件已经存在,那么删除它以准备写入新的GeoJSON数据。
- 读取Shapefile文件:使用geopandas库的
read_file
函数来读取Shapefile文件。 - 获取坐标参考系统(CRS):获取Shapefile文件的坐标参考系统。
- 转换数据:将读取的Shapefile数据转换为GeoSeries对象,并保持原始的坐标参考系统。
- 写入GeoJSON文件:将转换后的GeoSeries对象写入GeoJSON文件。
- 确认转换成功:输出成功的消息。
GeoJSON 转 Shapefile
- 指定输入和输出文件:确定你需要转换的GeoJSON文件(
geojson
)和转换后Shapefile文件的存放路径(shp_path
)。 - 设置编码:通过GDAL的
SetConfigOption
函数,设置Shapefile的编码为GBK。 - 获取驱动:获取GeoJSON和ESRI Shapefile的驱动。
- 打开GeoJSON文件:使用驱动打开GeoJSON文件。
- 复制数据源:将GeoJSON文件的数据源复制到新的Shapefile文件中。
结语
以上就是如何在 Python 中进行 Shapefile 和 GeoJSON 数据格式之间的转换。希望这篇文章对你的 GIS 数据处理工作有所帮助!如果你有任何问题或者建议,欢迎留言。