如何校验GeoJSON的完整性及合法性?
前几天在赶GIS大屏开发的时候遇到一个极其诡异的问题,开发环境好好的,但一到线上环境地图就崩了,显示不出来。前前后后排查了一圈,终于发现原来正式环境的GeoJSON数据有问题,数据组在处理导出GeoJSON的时候可能手动编辑了下误删了一些内容导致GeoJSON数据不完整,由于之前也没做完整检验,导致地图加载不出来。
问题找到之后,就想着搞一个校验工具,避免后续出现类似的问题,网上的方法大约试了一下,总结了几种比较靠谱的和大家分享下。核心思路是:尝试将每个 GeoJSON 文件转换为 ArcGIS 的格式(如要素类),如果转换成功则认为文件合法,如果转换失败则捕获错误并记录。
方法一:使用地理处理工具手动批量处理(适合少量文件)
这种方法利用了地理处理工具的错误处理机制,但需要手动设置。
先将你需要检查的所有 GeoJSON 文件放在同一个文件夹中,然后打开 “地理处理” 窗格 (Analysis > Tools),搜索并找到 JSON To Features 工具。这是转换 GeoJSON 的官方工具,对格式要求严格,非常适合用于检测合法性。在工具界面中,点击 输入 JSON 参数旁边的文件夹图标。找到 GeoJSON 文件夹,选择多个文件(按住 Ctrl 或 Shift 键)。最后设置一个输出位置,点击运行。

这种方法的优点是无需编程,利用现有工具,但对于大量文件,手动操作繁琐,且输出很多可能不需要的临时要素类。
方法二:使用 Python 脚本进行自动化批量检测(推荐)
这是最强大、最自动化的方法。可以创建一个 Python 脚本,在 ArcGIS Pro 的 Python 窗口或 Notebook 中运行。
脚本思路:
- 遍历指定文件夹中的所有
.geojson/.json文件。 - 对每个文件,尝试使用
arcpy.management.JSONToFeatures进行转换。 - 使用
try-except语句捕获错误。 - 将成功和失败的文件信息记录到一份日志文件中。
示例脚本:
import arcpy
import os
# 设置工作空间(包含GeoJSON文件的文件夹)
geo_json_folder = r"C:\Path\To\Your\GeoJSON\Folder"
# 设置一个临时输出地理数据库(用于尝试转换)
temp_gdb = r"C:\Path\To\Your\Temp\Validation.gdb"
# 设置日志文件路径
log_file_path = os.path.join(geo_json_folder, "GeoJSON_Validation_Log.txt")
# 确保临时GDB存在
if not arcpy.Exists(temp_gdb):
arcpy.management.CreateFileGDB(os.path.dirname(temp_gdb), os.path.basename(temp_gdb))
# 获取文件夹中所有GeoJSON文件
geo_json_files = [f for f in os.listdir(geo_json_folder) if f.endswith(('.geojson', '.json'))]
# 打开日志文件准备写入
with open(log_file_path, 'w') as log_file:
log_file.write("GeoJSON文件合法性检测报告\n")
log_file.write("=" * 50 + "\n")
for file_name in geo_json_files:
file_path = os.path.join(geo_json_folder, file_name)
# 设置临时输出要素类名称
output_fc_name = os.path.splitext(file_name)[0] # 去掉扩展名
output_fc = os.path.join(temp_gdb, output_fc_name)
try:
# 尝试转换GeoJSON到要素类
# 这是最关键的一步,转换失败则会抛出异常
arcpy.conversion.JSONToFeatures(file_path, output_fc)
# 如果成功,写入日志
status_msg = f"SUCCESS: {file_name} 是合法的GeoJSON文件。\n"
print(status_msg)
log_file.write(status_msg)
# 可选:删除成功转换的临时要素类以节省空间
arcpy.management.Delete(output_fc)
except arcpy.ExecuteError as e:
# 如果转换失败,捕获ArcGIS错误
error_msg = f"FAILED: {file_name} 不是合法的GeoJSON文件。错误信息: {str(e)}\n"
print(error_msg)
log_file.write(error_msg)
except Exception as e:
# 捕获其他可能的异常(如文件无法读取等)
error_msg = f"ERROR: 处理 {file_name} 时发生未知错误。错误信息: {str(e)}\n"
print(error_msg)
log_file.write(error_msg)
print(f"检测完成!详细报告已保存至: {log_file_path}")
脚本运行完毕后,会在你的 GeoJSON 文件夹中生成一个名为 GeoJSON_Validation_Log.txt 的文本文件,里面清晰记录了每个文件的检测结果和具体的错误信息。
方法三:使用第三方库进行快速语法检查(更轻量)
如果你的检测重点在于 “语法合法性” 而非 “ArcGIS兼容性”,可以使用专门的 JSON/GeoJSON 库,速度更快,且不会产生临时数据。
import os
import json
geo_json_folder = r"C:\Path\To\Your\GeoJSON\Folder"
log_file_path = os.path.join(geo_json_folder, "GeoJSON_Syntax_Only_Log.txt")
geo_json_files = [f for f in os.listdir(geo_json_folder) if f.endswith(('.geojson', '.json'))]
with open(log_file_path, 'w') as log_file:
log_file.write("GeoJSON文件语法检测报告(仅基础JSON语法)\n")
log_file.write("=" * 60 + "\n")
for file_name in geo_json_files:
file_path = os.path.join(geo_json_folder, file_name)
try:
with open(file_path, 'r', encoding='utf-8') as f:
# 尝试加载和解析JSON内容
data = json.load(f)
# 可选:进行一些基本的GeoJSON结构检查(例如,必须有"type"和"features"属性)
if data.get("type") == "FeatureCollection" and "features" in data:
status_msg = f"SUCCESS: {file_name} 语法合法且基本结构完整。\n"
else:
status_msg = f"WARNING: {file_name} 语法合法,但可能不是标准的FeatureCollection。\n"
print(status_msg)
log_file.write(status_msg)
except json.JSONDecodeError as e:
error_msg = f"FAILED: {file_name} JSON语法错误。错误信息: {e.msg} (at line {e.lineno}, column {e.colno})\n"
print(error_msg)
log_file.write(error_msg)
except Exception as e:
error_msg = f"ERROR: 读取 {file_name} 时发生未知错误。错误信息: {str(e)}\n"
print(error_msg)
log_file.write(error_msg)
print(f"语法检测完成!详细报告已保存至: {log_file_path}")
总结与建议
最后对三个方法做个总结:
- 如果你追求极致的简单快捷,只为快速查看少量数据,请选择方法一(直接拖放/添加数据)。
- 如果你追求可靠的数据质量与自动化,为正式的编辑和分析做准备,请选择方法二(使用Python脚本转换检测)。
- 如果你追求纯粹的效率,仅需快速验证文件基础语法,请选择方法三(使用第三方库检查)。
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。