Shapefile 与 GeoJSON 之间的转换:Python 实践

image-20240203142735158

引言

在处理地理信息系统(GIS)数据时,我们经常会遇到各种数据格式。其中,Shapefile 和 GeoJSON 是两种常见的地理数据格式。Shapefile 是一种广泛使用的地理数据格式,由 ESRI 开发。GeoJSON 是一种基于 JSON 的地理数据格式,适合在网络中传输和存储。

在本文中,我们将介绍如何使用 Python 的 geopandas 和 GDAL 库将 Shapefile 格式的文件转换为 GeoJSON 格式,以及如何将 GeoJSON 格式的文件转换为 Shapefile 格式。

我爱学习.gif

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_gpdgeojson2shp)进行Shapefile和GeoJSON之间转换的步骤流程:

Shapefile 转 GeoJSON

  1. 指定输入和输出文件:确定你需要转换的Shapefile文件(shp_file)和转换后GeoJSON文件的存放路径(geojson_file)。
  2. 检查输出文件是否存在:如果输出文件已经存在,那么删除它以准备写入新的GeoJSON数据。
  3. 读取Shapefile文件:使用geopandas库的read_file函数来读取Shapefile文件。
  4. 获取坐标参考系统(CRS):获取Shapefile文件的坐标参考系统。
  5. 转换数据:将读取的Shapefile数据转换为GeoSeries对象,并保持原始的坐标参考系统。
  6. 写入GeoJSON文件:将转换后的GeoSeries对象写入GeoJSON文件。
  7. 确认转换成功:输出成功的消息。

GeoJSON 转 Shapefile

  1. 指定输入和输出文件:确定你需要转换的GeoJSON文件(geojson)和转换后Shapefile文件的存放路径(shp_path)。
  2. 设置编码:通过GDAL的SetConfigOption函数,设置Shapefile的编码为GBK。
  3. 获取驱动:获取GeoJSON和ESRI Shapefile的驱动。
  4. 打开GeoJSON文件:使用驱动打开GeoJSON文件。
  5. 复制数据源:将GeoJSON文件的数据源复制到新的Shapefile文件中。

结语

以上就是如何在 Python 中进行 Shapefile 和 GeoJSON 数据格式之间的转换。希望这篇文章对你的 GIS 数据处理工作有所帮助!如果你有任何问题或者建议,欢迎留言。

我爱学习.gif