arcgis矢量数据转为标准geojson格式
简单获取geojson格式的方法:
1.arcmap10.6版本及以上,矢量数据可以直接导出标准的geojson格式数据;
2.arcgispro右键要素可以知道导出为标准的geojson格式数据;
3.发布 Feature Service 后,浏览器直接访问:
https://<server>/arcgis/rest/services/<name>/FeatureServer/0/query
?where=1=1
&outFields=*
&f=geojson
返回即是 标准 GeoJSON,可 wget
或 axios
拉取。
如果是arcmap10.6版本以下怎么办?
1.先导出为Esri FeatureSet JSON 格式,导出方法如下图所示:
这时候你会得到一个.json文件,把.json文件放到一个文件夹里面命名为'raw',如果是多个也可以直接放到该文件夹下面,最后使用python进行数据转换,python代码如下:
#!/usr/bin/env python3
"""
esri2geojson.py
批量把 Esri FeatureSet JSON 转成标准 GeoJSON
用法:python esri2geojson.py -i 原始文件夹 -o 输出文件夹
示例:python esri2geojson.py -i raw -o geojson
"""
import json, pathlib, argparse, sysdef esri_featureset_to_geojson(esri: dict) -> dict:"""将单个 Esri FeatureSet 转换为 GeoJSON FeatureCollectionArgs:esri (dict): 包含 Esri FeatureSet 数据的字典Returns:dict: 符合 GeoJSON 标准的 FeatureCollection 字典"""# 构造 GeoJSON FeatureCollection 结构return {"type": "FeatureCollection", # GeoJSON 类型标识"features": [ # 要素集合{"type": "Feature", # 单个要素类型标识"geometry": { # 几何信息"type": "Polygon", # 几何类型,这里固定为多边形"coordinates": f["geometry"]["rings"] # 从 Esri 数据中提取坐标环},"properties": f["attributes"] # 从 Esri 数据中提取属性信息}# 遍历所有要素进行转换for f in esri.get("features", [])]}def convert_file(src: pathlib.Path, dst: pathlib.Path):"""转换单个文件从 Esri FeatureSet 格式到 GeoJSON 格式Args:src (pathlib.Path): 源文件路径(Esri FeatureSet JSON)dst (pathlib.Path): 目标文件路径(GeoJSON)"""try:# 以 UTF-8 编码打开源文件with src.open(encoding="utf-8") as f:esri = json.load(f) # 加载 Esri JSON 数据# 调用转换函数将 Esri 数据转换为 GeoJSON 格式geojson = esri_featureset_to_geojson(esri)# 确保目标文件的父目录存在,如果不存在则创建dst.parent.mkdir(parents=True, exist_ok=True)# 以 UTF-8 编码写入目标文件with dst.open("w", encoding="utf-8") as f:# 将 GeoJSON 数据以格式化方式写入文件json.dump(geojson, f, ensure_ascii=False, indent=2)# 打印成功信息print(f"✅ 已转换:{src.name} -> {dst}")except Exception as e:# 捕获并打印错误信息print(f"❌ 失败:{src.name} {e}", file=sys.stderr)def main():"""主函数,处理命令行参数并执行批量转换"""# 创建命令行参数解析器parser = argparse.ArgumentParser(description="批量 Esri FeatureSet -> GeoJSON")# 添加必需的输入目录参数parser.add_argument("-i", "--input", required=True, help="输入文件夹")# 添加必需的输出目录参数parser.add_argument("-o", "--output", required=True, help="输出文件夹")# 解析命令行参数args = parser.parse_args()# 获取并解析输入和输出目录路径in_dir = pathlib.Path(args.input).expanduser().resolve()out_dir = pathlib.Path(args.output).expanduser().resolve()# 检查输入路径是否为有效目录if not in_dir.is_dir():sys.exit("输入路径不是文件夹")# 查找输入目录下所有 JSON 文件json_files = list(in_dir.glob("*.json"))# 如果没有找到 JSON 文件则退出if not json_files:sys.exit("目录下未找到 *.json 文件")# 遍历所有 JSON 文件并进行转换for json_file in json_files:# 构造目标文件路径,保持相同文件名但扩展名改为 .geojsongeo_file = out_dir / (json_file.stem + ".geojson")# 调用单文件转换函数convert_file(json_file, geo_file)# 打印完成信息print("全部完成!")if __name__ == "__main__":main()
python代码文件命名为‘esri2geojson.py’,和raw文件夹所在的文件夹放一起,假设都在‘abc’文件夹下面,则直接在abc文件夹下面的地址栏输入cmd,输入如下命令:
python esri2geojson.py -i raw -ogeojson
其中raw是存放需要进行数据转换.json文件所在的文件夹,geojson是转换完成之后的数据文件夹,执行完之后会发现在abc文件夹下面多了一个子文件夹'geojson',里面存放的是转换之后对应的.geosjon数据。