简介:这份中亚五国矢量图数据集面向GIS从业者、地理科研人员及区域研究学习者,提供哈萨克斯坦、乌兹别克斯坦、吉尔吉斯斯坦、塔吉克斯坦和土库曼斯坦五国的Shapefile格式地理数据,可用于地图制作、土地利用规划、区域发展分析及政治边界、交通网络等空间研究。资源包共8个文件,约545KB,涵盖shp主文件、shx索引、dbf属性表、prj坐标系统、cpg字符编码、shp.xml元数据以及sbx、sbn地理索引等配套文件,各类型协同保证几何形状、属性信息与投影定义的完整可用。目前已有189人学习下载。数据兼容ArcGIS、QGIS等主流软件,可直接打开编辑,便于结合其他数据源开展空间分析与专题制图,是研究中亚地区自然资源与地缘格局的实用基础资料。
1. 中亚五国矢量图 shp 格式:从数据获取到落库的完整路径
做区域空间分析时,中亚五国(哈萨克斯坦、吉尔吉斯斯坦、塔吉克斯坦、土库曼斯坦、乌兹别克斯坦)的矢量边界是绕不开的基础数据。很多同行第一次接触这个需求,往往是在做跨境物流路径规划、能源管线缓冲区分析或者区域经济对比时,发现手头只有全球国界数据,精度不够,属性字段也不全。这时候就需要一份专门针对中亚五国的 shp 格式矢量图。shp 作为 Esri 定义的经典矢量格式,兼容性极好,QGIS、ArcGIS、GeoServer、PostGIS 都能直接读写,这也是它至今仍是交付首选的原因。这篇文章面向需要把这份数据真正用起来的从业者,从数据来源、字段结构、坐标系统、格式转换到入库发布,把每一步的参数和坑都讲清楚。如果你只是想要一个能直接拖进 QGIS 的 shp 文件,看完第二章就能动手;如果你要把它做成服务或者参与空间计算,后面几章的细节更值得细读。
2. 中亚五国 shp 数据从哪里来:三种可靠获取路径
2.1 为什么优先选 Natural Earth 与 OSM 派生数据
中亚五国的矢量边界数据,常见来源有三类:全球公共领域数据集、开源地图派生数据、以及商业地图厂商的行政区划产品。对于大多数项目,我一般会从 Natural Earth 的 1:10m 或 1:50m 文化矢量层入手。它的 Admin 0 – Countries 图层里包含了中亚五国的国界,属性字段有 NAME、ISO_A3、ADMIN 等,坐标参考是 WGS84 经纬度。精度上,1:10m 适合国家级展示和区域级分析,1:50m 适合小比例尺底图。如果项目需要更细的行政边界,比如州级或省级,就要转向 OSM 派生数据,比如 Geofabrik 按区域切分的 shapefile 包,或者用 osm2pgsql 导入 PostGIS 后按 admin_level 过滤。商业数据精度更高,但授权和成本需要单独评估,这里不展开。
选择数据源时,核心看三个指标:边界精度是否满足你的最小分析单元、属性字段是否包含你需要的编码体系、许可是否允许你的分发场景。Natural Earth 是公共领域,几乎无限制;OSM 派生数据是 ODbL,署名和相同方式共享的要求要留意。我见过不少项目前期图省事随便下了一份,后期要发布服务时才发现许可有问题,返工成本很高。
2.2 用 GDAL 命令行裁剪与合并中亚五国范围
拿到全球或大区域数据后,第一步是按中亚五国的范围做裁剪和筛选。假设你下载了 Natural Earth 的 ne_10m_admin_0_countries.shp,可以用 ogr2ogr 配合 SQL 筛选出五个国家,再裁剪到合适范围。下面是一段可复现的命令:
# 从全球国界中筛选中亚五国,输出新的 shp ogr2ogr -f "ESRI Shapefile" \ -where "ADMIN IN ('Kazakhstan','Kyrgyzstan','Tajikistan','Turkmenistan','Uzbekistan')" \ central_asia_5.shp \ ne_10m_admin_0_countries.shp # 查看结果要素数量和字段 ogrinfo -so central_asia_5.shp central_asia_5这段命令的逻辑是:-where子句用属性过滤,只保留五个国家的记录;-f指定输出格式为 Shapefile;最后两个参数是输出文件和源文件。执行后应该得到 5 个要素。如果数量不对,先检查 ADMIN 字段的拼写是否与数据源一致,Natural Earth 不同版本字段名可能有差异,用ogrinfo -al -so先看字段列表。裁剪范围可以用-clipsrc指定一个包围盒,比如-clipsrc 46 35 88 56,但注意这会裁掉边界外的部分,如果只是筛选国家,不需要额外裁剪。
2.3 从 OSM 提取行政边界的参数配置
如果需要州级或更细的边界,OSM 路线更合适。以 Geofabrik 提供的中亚区域 extract 为例,下载 .osm.pbf 后,用 osm2pgsql 导入 PostGIS,再按 admin_level 筛选。导入时的关键参数:
osm2pgsql -d gis -U postgres -H localhost \ --create --slim --hstore --multi-geometry \ --cache 2000 \ central-asia-latest.osm.pbf--slim保留中间表,方便后续增量更新;--hstore把标签存成 hstore 列,便于按 admin_level 过滤;--multi-geometry支持多部件几何;--cache单位是 MB,根据机器内存调整。导入完成后,用 SQL 提取行政边界:
CREATE TABLE central_asia_admin AS SELECT name, admin_level, way FROM planet_osm_polygon WHERE admin_level IN ('4','6') AND boundary = 'administrative';admin_level 4 通常对应国家级,6 对应州级,具体分级各国不同,需要对照 OSM wiki 的国别页面确认。提取后记得建空间索引:CREATE INDEX ON central_asia_admin USING GIST (way);,否则后续空间查询会非常慢。
3. shp 文件结构与坐标系统:字段、编码与投影的实操要点
3.1 shp 文件组的组成与字段命名限制
一个完整的 shp 数据集不是单个文件,而是一组:.shp 存几何,.shp.xml 存元数据,.dbf 存属性,.prj 存投影,.shx 存索引,.cpg 存字符编码。交付时这几个文件必须一起给,缺一个都可能打不开或者属性乱码。我遇到过只拷了 .shp 和 .dbf 的情况,结果中文属性全变问号,就是因为缺 .cpg 文件,软件不知道用 UTF-8 还是 GBK 解码。
shp 的 .dbf 字段名有 10 个字符限制,这是格式本身的硬约束。如果你从 PostGIS 或 GeoJSON 转过来,字段名超过 10 字符会被截断,比如 “admin_level” 变成 “admin_leve”,容易造成后续脚本读取失败。常见做法是在导出前把字段名改成短名,或者在转换后用 ogr2ogr 的-sql做别名映射。另外 .dbf 对字段类型也有限制,日期和布尔类型支持不好,建议统一转成字符串或整数。
3.2 WGS84 与 Web 墨卡托的选用场景
坐标系统选错是新手最容易翻车的地方。Natural Earth 和 OSM 原始数据都是 WGS84 地理坐标系(EPSG:4326),单位是度。如果你要做面积计算、缓冲区分析,直接在地理坐标系上算会得到错误结果,因为度和米的换算随纬度变化。正确做法是先投影到合适的投影坐标系。中亚五国跨了多个 UTM 带,如果做全国级分析,可以用 Albers 等积投影,自定义中央经线和标准纬线;如果只做局部,按 UTM 带选 EPSG 326xx 系列。
Web 墨卡托(EPSG:3857)适合做 Web 地图展示,但不适合面积量算,因为它在高纬度变形严重。我一般会保留两份:一份 4326 用于存储和交换,一份按分析需求投影后的用于计算。转换命令:
# 从 WGS84 转到 Albers 等积投影(示例参数,需按实际范围调整) ogr2ogr -f "ESRI Shapefile" \ -t_srs "+proj=aea +lat_1=40 +lat_2=55 +lat_0=45 +lon_0=70 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs" \ central_asia_5_albers.shp \ central_asia_5.shp+lat_1和+lat_2是标准纬线,+lon_0是中央经线,+units=m保证输出单位是米。参数需要根据你的分析范围微调,标准纬线一般取范围南北边界的近似值。
3.3 属性表字段设计与编码统一
属性表设计要围绕你的查询需求来。如果只是展示,保留 NAME、ISO_A3 就够;如果要做统计关联,建议加上 ISO 数字码、行政区划代码、面积字段。面积字段可以在投影后计算,用$area表达式或者 PostGIS 的 ST_Area。编码方面,.cpg 文件里写 “UTF-8” 是通用做法,但如果你的下游系统只认 GBK,就要在导出时用-lco ENCODING=GBK参数。我一般统一用 UTF-8,避免跨平台乱码。
提示:shp 的 .dbf 文件对中文支持依赖 .cpg,交付前用 QGIS 打开检查属性表,确认没有乱码再打包。
4. 格式转换与入库:shp 到 GeoJSON、PostGIS 的完整流程
4.1 shp 转 GeoJSON 的参数与精度控制
很多 Web 端和 API 场景需要 GeoJSON,转换用 ogr2ogr 一行命令:
ogr2ogr -f "GeoJSON" \ -lco COORDINATE_PRECISION=6 \ central_asia_5.geojson \ central_asia_5.shpCOORDINATE_PRECISION=6控制小数位数,6 位大约对应 0.1 米精度,对国家级数据足够,还能减小文件体积。如果不设,GDAL 默认可能输出 15 位,文件会大很多。转换后检查一下要素数量是否一致,有时候几何无效会导致要素丢失,可以用ogrinfo -so对比。
4.2 用 PostGIS 建立空间库并导入 shp
PostGIS 是空间分析的标配,导入 shp 用 shp2pgsql 或者 ogr2ogr 都行。我习惯用 shp2pgsql,因为可以生成 SQL 脚本,方便审查:
# 生成建表和插入的 SQL shp2pgsql -s 4326 -I -W UTF-8 -D \ central_asia_5.shp \ public.central_asia_5 > central_asia_5.sql # 执行导入 psql -d gis -U postgres -f central_asia_5.sql-s 4326指定 SRID,-I创建空间索引,-W UTF-8指定编码,-D使用 dump 格式(比默认的 insert 快)。导入后验证:
SELECT name, ST_IsValid(geom), ST_Area(ST_Transform(geom, 3857)) FROM central_asia_5;ST_IsValid 返回 false 的几何需要修复,可以用 ST_MakeValid。面积计算记得先转投影,3857 只是示例,实际用等积投影更准。
4.3 发布为 WMS/WFS 服务的配置要点
如果要把数据发布成服务,GeoServer 是常见选择。新建数据存储时选 PostGIS,配置连接参数,然后发布图层。关键配置:边界框要手动确认,别用自动计算的,有时候会偏;坐标系统选 EPSG:4326 用于展示,EPSG:3857 用于切片;WFS 的 maxFeatures 限制要调大,否则默认可能只返回 1000 条。发布后用 GetCapabilities 请求验证服务是否正常。
注意:发布前确认数据许可允许你以服务形式对外提供,公共领域和 ODbL 的要求不同。
5. 避坑与排查:中亚五国 shp 处理中的五个血泪教训
5.1 边界重叠与缝隙:现象、原因与修复
现象:把五国数据叠加后,发现相邻边界有细缝或者重叠,做区域合并时面积对不上。原因通常是不同来源的数据边界不共享节点,或者简化算法导致拓扑破坏。解决:用 GRASS 的 v.clean 或者 PostGIS 的 ST_SnapToGrid 做节点吸附,再重建拓扑。如果只是展示,缝隙影响不大;如果做空间叠加分析,必须先修复。
5.2 属性乱码:编码不一致的排查路径
现象:QGIS 打开属性表中文显示为乱码。原因:.cpg 缺失或编码声明与实际不符。解决:先确认源数据编码,用ogrinfo -al -so看是否有 ENCODING 信息;没有 .cpg 就手动创建一个,内容写 “UTF-8”;如果源数据是 GBK,导出时用-lco ENCODING=GBK转换。排查顺序是:看 .cpg → 看 QGIS 图层属性里的编码设置 → 用 ogr2ogr 重新导出。
5.3 坐标偏移:投影参数写错的典型表现
现象:数据叠加到在线底图上,整体偏移几百米。原因:投影参数写错,比如中央经线不对,或者把 4326 当成了 3857。解决:用已知地物对比,比如某个城市的坐标,反推投影参数。常见错误是 Albers 的+lon_0设成了 0,实际应该设在中亚范围附近。排查时先用gdalsrsinfo看 .prj 内容,确认参数。
5.4 字段截断:dbf 10 字符限制的规避方法
现象:导入 PostGIS 后发现字段名少了几个字母。原因:shp 的 .dbf 字段名限制 10 字符。解决:导出前用-sql "SELECT name AS nm, admin_level AS adm_lvl FROM ..."做别名,或者导入后重命名。如果下游脚本依赖原字段名,要在转换层做映射,别直接改数据库字段。
5.5 大文件性能:索引与简化策略
现象:加载慢,空间查询卡死。原因:没有空间索引,或者几何节点太多。解决:PostGIS 里建 GIST 索引;展示用数据可以用-simplify参数做几何简化,比如ogr2ogr -simplify 0.01,容差根据比例尺定。简化会损失精度,分析用数据不要简化。
6. 进阶技巧:用 Python 批量校验与自动化交付
6.1 用 GeoPandas 做几何有效性检查
批量处理时,手动检查不现实。用 GeoPandas 可以快速校验:
import geopandas as gpd gdf = gpd.read_file("central_asia_5.shp") print(gdf.crs) print(gdf.is_valid) invalid = gdf[~gdf.is_valid] if not invalid.empty: gdf["geometry"] = gdf.buffer(0) gdf.to_file("central_asia_5_fixed.shp", encoding="UTF-8")buffer(0)是修复自相交几何的常用技巧,但会改变几何类型,修复后要重新检查。is_valid返回布尔序列,直接筛选出无效要素。
6.2 自动化导出多格式与元数据生成
交付时往往需要 shp、GeoJSON、PostGIS 三份。写一个脚本串起来:
import subprocess formats = { "shp": ["-f", "ESRI Shapefile", "out.shp"], "geojson": ["-f", "GeoJSON", "out.geojson"], } for name, args in formats.items(): subprocess.run(["ogr2ogr"] + args + ["central_asia_5.shp"], check=True)元数据可以用ogrinfo -al -so的输出重定向到文本,或者用 GDAL 的 Python 绑定写 .shp.xml。我一般会生成一个 README,记录数据来源、坐标系统、字段说明、许可信息,和 shp 文件一起打包。
6.3 一个我常犯的错误:忽略 .prj 的版本差异
最后说一个我踩过的坑。有次交付后对方反馈坐标不对,查了半天发现是 .prj 文件里的 WKT 版本不同,老版本软件不认新 WKT。后来我养成习惯,导出时用-lco SRS_WKT=1强制输出兼容格式,或者直接附一份 EPSG 代码说明。这个细节不起眼,但跨软件协作时能省很多沟通成本。希望帮到你。
本文还有配套的精品资源,点击获取