在地理信息系统(GIS)领域,数据格式之间的转换是一项常见的需求。例如,将 Shapefile 格式转换为 GeoJSON 格式,对于上传数据到 Google Earth Engine (GEE) 尤其有用。本文将通过一个 Python 脚本的示例,实现批量将 Shapefile 文件转换为 GeoJSON 文件。
准备工作
在开始之前,请确保已安装了 Python 和 arcpy
库。arcpy
是 Esri ArcGIS 提供的 Python 库,它允许开发者自动化 ArcGIS 的地理数据处理功能。
脚本解析
导入必要的库
import os
import arcpy
这里导入了 os
库来处理文件路径和文件列表,以及 arcpy
库来执行地理数据的转换。
定义转换函数
def convert_to_geojson(shp_path, geojson_path):
"""
将 Shapefile 转换为 GeoJSON 格式。
:param shp_path: Shapefile 文件路径
:param geojson_path: GeoJSON 文件保存路径
"""
arcpy.env.overwriteOutput = True # 允许覆盖已有输出文件
arcpy.conversion.FeaturesToJSON(
in_features=shp_path,
out_json_file=geojson_path,
format_json="NOT_FORMATTED",
geoJSON="GEOJSON",
outputToWGS84="WGS84",
use_field_alias="USE_FIELD_NAME"
)
print(f'{geojson_path} 转换完成!')
此函数接受两个参数:shp_path
表示 Shapefile 的路径,geojson_path
表示输出的 GeoJSON 文件路径。函数内部使用 arcpy.conversion.FeaturesToJSON
方法来执行转换,并设置了几个参数来控制输出的格式和坐标系统。
获取特定扩展名的文件列表
def get_files_with_extension(directory, extension):
"""
获取指定目录下所有具有特定扩展名的文件。
:param directory: 目录路径
:param extension: 文件扩展名
:return: 包含指定扩展名文件名的列表
"""
directory = os.path.normpath(directory)
all_files = os.listdir(directory)
files_with_extension = [file for file in all_files if file.endswith(extension)]
return files_with_extension
该函数用于获取指定目录下所有具有特定扩展名的文件,并返回一个包含这些文件名的列表。
主程序
if __name__ == '__main__':
shp_folder_path = "xxx"
json_folder_path = "xxx"
shp_files = get_files_with_extension(directory=shp_folder_path, extension='.shp')
print(f"找到 '.shp' 文件: {shp_files}")
for shp_name in shp_files:
geo_name = f"{shp_name.split('.')[0]}.geojson"
feature_shp = os.path.join(shp_folder_path, shp_name)
feature_geojson = os.path.join(json_folder_path, geo_name)
convert_to_geojson(shp=feature_shp, geojson=feature_geojson)
在主程序部分,我们首先设置了 Shapefile 和 GeoJSON 文件的存储路径。接着,我们调用 get_files_with_extension
函数来获取所有 Shapefile 文件,并遍历这些文件,为每个文件调用 convert_to_geojson
函数进行转换。
案例代码
# -*- coding: utf-8 -*-
"""
此脚本用于批量将指定文件夹下的 Shapefile (.shp) 文件转换为 GeoJSON 文件。
生成的 GeoJSON 文件将保存在指定的目标文件夹中。
"""
import os
import arcpy
def Model(shp, json): # a_Feature to json
"""
将 Shapefile 转换为 GeoJSON 文件。
参数:
shp (str): 输入的 Shapefile 文件路径。
json (str): 输出的 GeoJSON 文件路径。
"""
# 允许覆盖输出文件
arcpy.env.overwriteOutput = True
# 转换 Shapefile 为 GeoJSON
arcpy.conversion.FeaturesToJSON(
in_features=shp,
out_json_file=json,
format_json="NOT_FORMATTED",
geoJSON="GEOJSON",
outputToWGS84="WGS84",
use_field_alias="USE_FIELD_NAME"
)
print(f'{json} conversion completed!')
def get_files_with_extension(directory, extension):
"""
获取指定文件夹中具有特定扩展名的所有文件名。
参数:
directory (str): 文件夹路径。
extension (str): 文件扩展名(包括点,例如 '.shp')。
返回:
list: 包含指定扩展名文件名的列表。
"""
# 规范化目录路径
directory = os.path.normpath(directory)
# 获取文件夹中的所有文件
all_files = os.listdir(directory)
# 筛选出指定扩展名的文件
files_with_extension = [file for file in all_files if file.endswith(extension)]
# 返回结果
return files_with_extension
if __name__ == '__main__':
# 设置全局环境变量
shp_folder_path = fr"E:\temp"
json_folder_path = fr"E:\Geojson"
# 获取指定文件夹下所有后缀为 .shp 的文件名列表
shp_files = get_files_with_extension(directory=shp_folder_path, extension='.shp')
print(f"find '.shp' file: {shp_files}")
# 遍历所有 .shp 文件
for shp_name in shp_files:
# 生成对应的 GeoJSON 文件名
geo_name = shp_name.split('.')[0] + '.geojson'
# 构建完整的文件路径
feature_shp = os.path.join(shp_folder_path, shp_name)
feature_geojson = os.path.join(json_folder_path, geo_name)
# 调用 Model 函数批量转换 Shapefile 为 GeoJSON
Model(shp=feature_shp, json=feature_geojson)
小结
通过上述脚本,我们实现了一个简单而有效的批量转换工具,可以将 Shapefile 文件转换为 GeoJSON 格式。这对于需要将地理数据上传至 GEE 的用户而言,是一个非常有用的工具。自动化此过程能够显著节省时间和精力,尤其是在处理大量数据时。
术语 | 解释 |
---|---|
Shapefile | 一种地理矢量数据存储格式,由 ESRI 开发,用于存储矢量地理信息。 |
GeoJSON | 一种开放标准的格式,用来表示地理空间对象。 |
Google Earth Engine (GEE) | 由 Google 提供的一个基于云端的平台,用于大规模地理空间数据分析。 |
arcpy | Esri ArcGIS 的 Python API,提供了与 ArcGIS 进行交互的能力。 |
arcpy.conversion.FeaturesToJSON | 一个函数,用于将矢量特征转换成 JSON 或 GeoJSON 格式。 |
如果这对您有所帮助,希望点赞支持一下作者! 😊
详细全文-点击查看