1. 准备工作获取行政区划CSV数据全国行政区划数据通常包含省、市、区县三级结构有些数据集还会包含乡镇街道四级数据。这类数据一般以CSV格式提供包含行政区名称、编码、边界坐标等信息。我常用的数据源是高德开放平台提供的行政区划数据解压后你会看到类似这样的CSV结构id,pid,name,geo,polygon 110000,0,北京市,116.405285 39.904989,116.405285 39.904989,116.405285 39.904989,... 110100,110000,北京市,116.405285 39.904989,116.405285 39.904989,116.405285 39.904989,...关键字段说明id行政区划唯一标识pid父级行政区划IDname行政区名称geo中心点坐标经度 纬度polygon边界坐标串多个点用逗号分隔实测发现高德数据的坐标系默认使用GCJ-02火星坐标系如果需要WGS-84坐标后续转换时需要特别注意坐标系转换问题。建议先检查数据版本我遇到过2022版数据中台湾地区的边界坐标存在缺失的情况需要特别注意数据完整性。2. 工具选型AreaCity-Geo转换工具详解经过多次对比测试我最终选择了AreaCity-Geo作为核心转换工具。这个开源工具的优势在于一键多格式输出支持同时生成SHP、GeoJSON和SQL坐标系转换内置GCJ-02转WGS-84功能批量处理可处理全国级别的海量数据安装方法很简单从GitHub克隆仓库后git clone https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov.git cd AreaCity-JsSpider-StatsGov/AreaCity-Geo工具目录结构说明├── AreaCity-Geo.exe # Windows可执行文件 ├── config.json # 配置文件 ├── sample_data # 示例数据 └── output # 输出目录配置文件config.json的关键参数{ input: ok_geo.csv, output: { shp: true, geojson: true, sql: true }, coord: { source: GCJ-02, target: WGS-84 } }3. 实战转换从CSV到三大格式3.1 生成SHP格式SHP是ArcGIS等专业GIS软件的通用格式。转换命令./AreaCity-Geo -c config.json输出文件说明.shp主体图形数据.shx图形索引文件.dbf属性数据表.prj坐标系定义文件我在QGIS中加载生成的SHP时发现两个常见问题中文乱码需要在QGIS图层属性中设置编码为UTF-8坐标系未识别手动指定为WGS-84(EPSG:4326)3.2 生成GeoJSON格式GeoJSON是Web地图开发的标配格式。转换时会自动处理以下特性将CSV中的坐标字符串转为标准的GeoJSON几何体保留所有属性字段支持FeatureCollection格式示例输出片段{ type: FeatureCollection, features: [ { type: Feature, properties: { id: 110000, name: 北京市 }, geometry: { type: Polygon, coordinates: [[[116.405285,39.904989],...]] } } ] }性能提示全国级别的GeoJSON文件可能超过100MB建议前端使用时按需加载或转换为矢量切片。3.3 生成SQL文件对于需要入库的场景工具支持生成多种数据库的SQLMySQL需5.7支持空间函数PostgreSQLPostGIS扩展SQL Server生成的SQL包含CREATE TABLE admin_boundary ( id INT PRIMARY KEY, name VARCHAR(50), geom GEOMETRY(POLYGON, 4326) ); INSERT INTO admin_boundary VALUES (110000, 北京市, ST_GeomFromText(POLYGON((116.405285 39.904989,...))));踩坑记录MySQL 5.6及以下版本不支持直接存储多边形数据建议使用PostgreSQLPostGIS方案。4. 坐标系转换的深度处理当需要将GCJ-02转WGS-84时工具内部使用以下算法def gcj02_to_wgs84(lng, lat): # 火星坐标系转WGS84核心算法 ee 0.00669342162296594323 a 6378245.0 dlat transform_lat(lng - 105.0, lat - 35.0) dlng transform_lng(lng - 105.0, lat - 35.0) radlat lat / 180.0 * math.pi magic math.sin(radlat) magic 1 - ee * magic * magic sqrtmagic math.sqrt(magic) dlat (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * math.pi) dlng (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * math.pi) return lng - dlng, lat - dlat精度验证通过对比高德API的转换结果工具输出的WGS-84坐标误差在±0.0001度范围内完全满足业务需求。5. 常见问题解决方案Q1转换后几何图形变形检查原始CSV的坐标串格式是否正确确认目标坐标系设置尝试用QGIS修复几何Vector Geometry Tools Fix GeometriesQ2数据库导入失败PostgreSQL需先执行CREATE EXTENSION postgis;MySQL需确保使用InnoDB引擎检查SQL文件编码应为UTF-8Q3乡镇数据缺失确认下载的数据包是否包含四级数据ok_geo4_*.csv检查父级ID关联是否正确性能优化建议对于省级应用建议按行政区划代码分片处理使用--threads参数启用多线程工具v1.2版本支持大数据量时先拆分CSV再并行处理6. 进阶应用场景6.1 与前端地图框架结合在ECharts中使用生成的GeoJSON$.get(output/boundary.geojson, function(geoJson) { echarts.registerMap(china, geoJson); chart.setOption({ series: [{ type: map, map: china }] }); });6.2 空间数据库查询示例PostgreSQL空间查询-- 查询包含指定点的行政区 SELECT name FROM admin_boundary WHERE ST_Contains(geom, ST_Point(116.4, 39.9)); -- 计算两个区域的相交部分 SELECT ST_AsGeoJSON(ST_Intersection(a.geom, b.geom)) FROM admin_boundary a, admin_boundary b WHERE a.id110000 AND b.id120000;6.3 自动化更新方案建议的自动化处理流程每月从高德同步最新CSV用AreaCity-Geo自动转换通过CI/CD自动部署到生产环境版本化管理历史数据可以编写简单的Shell脚本实现#!/bin/bash wget -O latest_data.csv ${UPDATE_URL} ./AreaCity-Geo -c config.json pg_restore -d gis_db output/admin_boundary.sql经过多个项目的实战验证这套方案能稳定处理千万级节点的行政区划数据转换。特别是在某省级政务项目中成功将处理时间从传统手工操作的8小时缩短到15分钟以内。