
简介一套以国家测绘地理信息局公布的标准世界地图编号GS20161666为参考绘制的2019版世界地图shp底图面向需要发表期刊论文、制作专题地图或开展GIS数据处理的科研与制图人员。资源内含详细与简单两个版本简单版保留国境线和城市便于快速出图详细版覆盖大洲、国境线、城市、行政区划、湖泊、河流、经纬线等要素图层并包含国界九段线、南海诸岛等边界要素可按需删减组合。压缩包共177个文件约60.75MB主要文件类型有shp/dbf/shx空间数据、prj投影文件、sbx/sbn空间索引、cpg字符编码、mxd地图工程、docx/doc说明文档及jpg预览图适合在ArcGIS、QGIS等平台直接打开和二次编辑。已有7330人学习下载。该底图已实际用于两篇C刊投稿并顺利通过期刊图形审查对需满足地图规范、或希望快速转为中国为中心世界地图的读者具有直接参考价值。1. 为什么世界地图要“以中国为中心”shp数据不是拿来就能画大多数公开渠道下载到的世界地图shp格式数据画出来中国都在版面的最右侧亚洲东海岸经常被裁掉半边放到汇报材料里非常吃亏。这份资源就是来解决这个问题的它包含标准经纬度坐标的世界地图shp底图以及配套的坐标转换脚本能一键把地图重投影为以中国区域为中心的显示效果。适合做项目PPT示意、论文底图、投标附图凡是需要中国在画面中央的地图排版都能用上。核心工作其实就是改一个参数地图投影里的中央经线。2. 先摸清这份shp底细GDAL检查坐标系、图层字段和几何完整性拿到资源包后不要急着去转换。我用ogrinfo做了个快速体检确认每个shp文件的数据类型、坐标系、字段列表和坐标范围。这一步能避开后面很多“坐标系未知”或“几何翻车”的问题尤其是.prj文件缺失的情况。2.1 目录里常见哪些shp文件通常资源包里会有shapefile/目录里面至少包含这些基础层countries.shp世界国家多边形带国名、ISO代码、大洲字段provinces.shp部分国家的省级行政区划用于局部放大rivers.shp世界主要河流线cities.shp主要城市点带人口和经纬度graticule.shp经纬网线转出后会单独用于底图标示每个shp旁边一定有同名的.dbf属性表、.shx空间索引、.prj坐标系文本。.prj文件尤其重要没有它GDAL 会认为数据坐标系未知后续重投影会直接失败。2.2 用一行命令查看任意shp的元信息ogrinfo -ro -so shapefile/ countries.shp输出里会有这样几行Layer name: countries Geometry: Polygon Feature Count: 177 Extent: (-180.0000000, -90.0000000) - (180.0000000, 83.6451300) Layer SRS WKT: GEOGCRS[WGS 84]看到GEOGCRS[WGS 84]或PROJCRS[WGS_1984]就说明源数据是经纬度坐标可以直接用本文后面所有命令。如果显示Unknown则需要先补齐.prj文件或者在转换时手动指定-s_srs EPSG:4326。字段结构可以用-al参数查看ogrinfo -ro -al -so shapefile/ countries.shp它会列出类似这样一行一行的字段定义NAME: String (50.0) ISO_A3: String (3.0) CONTINENT: String (10.0)在后续转换时如果你希望输出的shp小一点可以用-select只保留需要的字段。我一般会保留NAME和ISO_A3这两个字段在调整样式时足够用了。提示如果多个shp文件.prj内容不一致先统一成 WGS84 再转。混合坐标系会导致最后叠加图层时位置全部错位。3. 核心操作把世界地图改成中国为中心三种做法很多人以为“中国为中心”是某种特殊文件其实它是地图投影参数中的中央经线lon_0决定的。普通世界地图的中央经线是 0°所以国家落在东侧。我们只要把中央经线改成东经 105°中国就会挪到画面中央。这里采用的投影是等距圆柱投影它保证经线纬线是平行直线适合做矩形世界地图且所有GIS软件都能识别。3.1 用ogr2ogr一行命令完成重投影在命令行里执行ogr2ogr -t_srs projeqc lat_00 lon_0105 datumWGS84 no_defs output/world.shp shapefile/world.shp这条命令的逻辑是读取shapefile/world.shp创建output/world.shp同时把原数据的每个顶点坐标重算到新的投影坐标系。eqc是等距圆柱投影缩写lon_0105是中央经线datumWGS84是基准面。整条命令执行后图形位置会改变但属性表字段原样保留。注意如果源文件不是 WGS84 经纬度则需要补一个-s_srs参数指定源坐标系否则 GDAL 只会按未知坐标系做近似计算结果必然偏位。也可以在转换前用ogrinfo多重确认一次。3.2 开源桌面GIS里的自定义CRS做法如果你的工作环境依赖图形界面可以在开源GIS软件中新建一个自定义坐标参考系。进入“设置”中的“自定义坐标参考系”添加一条projeqc lat_00 lon_0105 datumWGS84 no_defs名称可以叫China Center。把常用的世界地图shp加载进来后在图层上右键“导出”并选择这个自定义CRS导出的新图层就是中国居中了。我习惯把这个CRS保存在软件配置里因为后续还要用来改经纬网和裁剪框省得每次重新输入。有一个非常常见的误解只修改图层的显示CRS也就是在图层属性里勾选另一个投影图形不会变化只是左下角坐标读数和图例改变。必须执行“导出”或“另存为”才会真正重算几何。我遇到过不少人栽在这一步检查了半天代码结果只是没点导出。3.3 商业GIS工具的投影工具做法如果你在商业GIS桌面环境里操作直接在工具箱里搜索“投影”选择“要素投影”。输入图层选世界地图输出坐标系里新建一个“自定义投影坐标系”基于 WGS84再用等距圆柱投影把中央经线改成 105°。剩下的参数全部留默认点确定即可。三种方法结果一致区别只在交互方式。从效率角度看我建议即使你平时用图形界面也保留一个命令行窗口因为后续批量处理多个shp时一条脚本比每个文件都右键导出要快得多。三种投影工程参数对比如下表方便你根据出图形态选择投影类型特征设置方式适用场景等距圆柱全球矩形经纬线平行lon_0105常规中国居中底图Robinson伪圆柱视觉更饱满lon_0105论文插图、汇报示意兰伯特等积方位以点为中心的圆形视图以105E,35N为中心亚洲周边分析图在具体出图之前先用等距圆柱投影把整个世界的范围拉到一张矩形图框里再考虑要不要换视觉投影。盲改 Robinson 投影经常会出现欧洲或北美被压得很难看。4. 转换后的图幅整饰裁剪、分割裁剪与经纬网重投影完成只是第一步。转换后的世界图往往两侧留白或者多边形分裂需要继续整饰才能变成干净的底图文件。4.1 设置图幅范围让地图左右不空等距圆柱投影以 105°E 为中央经线全球经度范围 -180°到180°会被重新映射投影后的X坐标范围会变成大约 -285°到75°。直接打开图层默认显示范围可能左半空白右半挤满。更靠谱的做法是给输出图层套一个裁剪范围让投影后的边界与图幅匹配。裁剪命令需要先知道源数据的投影边界。以我们设置的投影参数为例投影坐标X的最小值是 -180-105-285°最大值是 180-10575°纬度范围仍是 -90到90。执行ogr2ogr -clipsrc -284.5 -90 74.5 90 clipped.shp output/world.shp各个值分别是裁剪框的最小X、最小Y、最大X、最大Y。两端留了0.5°余量是为了避免裁剪线正好压在某些岛屿边界上导致沿海小岛被削掉。裁剪后画布的左右两侧就正好是世界的东西两端中国在正中间。4.2 跨180°经线的多边形分裂处理当中央经线调到105°E后原本在经度180°附近的地区比如俄罗斯东部几个半岛会被投影到数据范围的“接缝”处经常出现一个面的两部分分别跑到画布左右两侧。这是矢量数据投影常见的翻车点。处理方案是拆线再转。在图形界面里先对源图层执行“拆分几何”让它沿经度180°打断然后重新投影。如果源数据本身已经把跨越180°的国家拆成两个要素那重投影后需要再次合并避免同一个国家出现两条边界。如果是命令行操作可以在ogr2ogr后加一个GDAL高版本才支持的参数-wrapdateline。它会自动识别跨越日界线的多边形并在投影输出前拆分。我目前的GDAL版本能正常使用建议在转换前先跑一句ogr2ogr --version确认版本新于 2.0否则这个参数不生效。4.3 经纬网和标注的更新资源包里的经纬网shp同样是旧投影必须用相同的投影命令重投影一次否则叠加世界地图时经纬网会明显“打架”ogr2ogr -t_srs projeqc lat_00 lon_0105 datumWGS84 no_defs output/graticule.shp shapefile/graticule.shp经纬网是长线要素在投影过程中直线段会被拉伸成折线如果原始线顶点太少会出现明显的折角。我一般会在转换时增加一个分段参数ogr2ogr -segmentize 2 -t_srs projeqc lat_00 lon_0105 output/graticule.shp shapefile/graticule.shp-segmentize 2表示每两个单位长度就插入一个顶点这样曲线在投影后看起来是平滑的。这个参数也适用于海岸线和河流图层尤其在大比例尺下能明显提升底图质感。5. 常见问题排查转换结果为什么还是“歪”的四个翻车现场以下几条是实践里最常踩的坑每一条我都亲眼见过同伴翻车按“现象→原因→解决”展开。5.1 转换后地图位置没变中国仍在右侧现象按命令转换后打开新生成的文件中国还是在图幅右边感觉命令没生效。原因最常见的是QGIS等软件只改了工程的显示CRS而没有真正重新导出shp。更隐蔽的是步骤里用了-t_srs但源文件本身已经带有一个投影坐标系GDAL默认用了源文件投影来换算结果你的中央经线设置被覆盖了。解决先用ogrinfo -so查看源坐标系确认它是EPSG:4326。如果是投影坐标系转换前必须清楚源文件原来中央经线是多少并新写一条包含t_srs和s_srs的命令。图形界面里则注意区分“图层属性”和“导出”的区别导出才会真正改变几何。5.2 大陆分裂成左右两半整体像“对折”现象重投影后有些半岛、岛屿分到了画布两端或者有的国家被切割成两块显示接不上。原因中央经线为105°E后原180°经线所在位置变成了投影坐标的75°那一带的要素原始几何本来需要跨过 -180 和180的边界但数据没有预先拆分转换后就被“甩”到两边。解决在转换前做一次拆分。命令行里检查是否支持-wrapdateline否则用图形界面里的“拆分几何”工具手工拆整个源图层。拆完后要再用“修复几何”工具去掉公共边重复的节点最后再转换。5.3 转换后海岸线和经纬网弯弯曲曲现象大陆边界和经线变成一段一段折线看起来像锯齿。原因原始矢量线顶点太少投影变换时只移动了端点内部的线性弯曲没有被保留。尤其是用Robinson等变形较大的投影时更明显。解决给ogr2ogr加分段参数-segmentize 1或者用类似“平滑线”的工具。加分段之后文件大小会上升但出图质量可控。5.4 Python脚本跑不通提示找不到osgeo模块现象执行资源附带的转换脚本报ModuleNotFoundError: No module named osgeo。原因系统装了 GDAL 命令行但没有装 Python 绑定包有些环境里需要额外安装gdal包版本和命令行需要匹配。解决用python -m pip install gdal装对应版本如果卡编译就直接用第3章的 ogr2ogr 命令行替代。脚本的作用是批量处理如果你只转常用几个shp命令行手动执行更省心。6. 进阶技巧用Python批量转换并验证中国居中效果当我们拿到一份带多个shp文件的地图资源逐个执行命令行很啰嗦。我自己会写一个小的Python脚本循环处理整个目录输出与源文件同名的shp到新的文件夹。先直接放脚本import os from osgeo import ogr, osr SRC_DIR shapefile OUT_DIR output def convert_shapefile(src_path, dst_path): # 打开源数据 src_ds ogr.Open(src_path) if src_ds is None: print(打开失败: src_path) return src_lyr src_ds.GetLayer() # 定义目标投影中央经线为105°E target_srs osr.SpatialReference() target_srs.ImportFromProj4( projeqc lat_00 lon_0105 datumWGS84 no_defs ) # 创建输出shp如果存在先删除 driver ogr.GetDriverByName(ESRI Shapefile) if os.path.exists(dst_path): driver.DeleteDataSource(dst_path) dst_ds driver.CreateDataSource(dst_path) dst_lyr dst_ds.CreateLayer( src_lyr.GetName(), target_srs, geom_typeogr.wkbMultiPolygon, ) # 复制属性字段 src_defn src_lyr.GetLayerDefn() for i in range(src_defn.GetFieldCount()): dst_lyr.CreateField(src_defn.GetFieldDefn(i)) # 坐标转换 src_srs src_lyr.GetSpatialRef() transform osr.CoordinateTransformation(src_srs, target_srs) # 遍历要素 for feat in src_lyr: geom feat.GetGeometryRef() if geom is None: continue geom.Transform(transform) if not geom.IsEmpty(): new_feat ogr.Feature(dst_lyr.GetLayerDefn()) for j in range(src_defn.GetFieldCount()): new_feat.SetField(j, feat.GetField(j)) new_feat.SetGeometry(geom) dst_lyr.CreateFeature(new_feat) src_ds dst_ds None print(完成: dst_path) if __name__ __main__: os.makedirs(OUT_DIR, exist_okTrue) for fname in os.listdir(SRC_DIR): if fname.lower().endswith(.shp): convert_shapefile( os.path.join(SRC_DIR, fname), os.path.join(OUT_DIR, fname), )脚本逻辑分三块读取源图层、定义目标坐标系、逐要素重投影。osr.CoordinateTransformation负责坐标变换核心geom.Transform()让顶点坐标落到新的投影里。字段复制放在创建图层之后保证输出shp的属性不丢。用法很简单把资源和脚本放在同一台装有GDAL Python绑定的机器上python convert_to_center.py它会遍历shapefile目录生成一份新的output目录。转换结束后用开源GIS软件打开output/graticule.shp和output/countries.shp检查中央区域是否落在中国范围内。再补充一个验证技巧在开源GIS软件的布局窗口里摆一张世界地图地图范围设置为投影后的数据范围然后测量图面左右两侧到图框边缘的距离。等距圆柱投影下中国地图如果完全居中左右空白应当相等。我过去画世界地图总被批“中国偏右”后来养成习惯输出前先看中央经线参数是不是105确认无误再做投影。这个习惯帮我少改了很多版。希望上面这些步骤和脚本能帮到你做出真正“中国居中”的世界地图底图。本文还有配套的精品资源点击获取