以中国为中心的世界地图制作:投影、参数与实操指南
发布时间:2026/9/29 2:06:12来源:尧图网络
简介面向需要地理信息展示、前端可视化或地图数据处理的开发者和学习者这份压缩包提供了一款以中国为中心的世界地图网页应用打破传统西方中心视角突出中国及周边区域的地理表达。包内共3个文件包括一个可直接运行的HTML入口文件与两个JSON数据文件分别存储国家英文名与中文名等地理坐标信息整体仅615KB无需安装额外软件或插件双击即可在浏览器中完成交互查看。已有276人学习下载适合作为前端ECharts地图可视化入门范例也可直接复用其中的JSON数据用于区域高亮、数据分析或自定义地图开发。项目将数据与展示分离结构清晰便于替换或更新国家名称与坐标信息也能帮助理解JSON在前端可视化中的实际用法。1. 以中国为中心的世界地图先换投影再谈“居中”很多人拿到这张地图需求时第一反应是把世界地图从中间裁开再把中国挪到纸面中央。做出来的结果往往国界线错位、大陆撕裂怎么看都不对劲。实际上把世界地图的中心点从格林尼治换到中国境内本质是一次完整的投影变换不是“平移”能解决的。它的典型应用是国际业务可视化大屏、教材插图、会议物料和区域研究报告核心价值是让“以中国为观察点”的距离、方位直接可读。做这张图你需要回答三个问题用什么投影、中心点放哪、数据怎么处理。本文给出可复现流程和 5 个高频翻车点。2. 画以中国为中心的世界地图投影、中心点与参数2.1 等距方位投影为什么中国中心地图几乎默认用它先立住一个前提没有任何投影能同时保证形状、面积、距离、方向都正确。墨卡托投影保角度、保形状但高纬度面积被放大到离谱等积投影保面积但大陆形状会被压成“扁面条”。以中国为中心的世界地图业务上最常被问到的问题不是“哪个国家面积看起来多大”而是“从中国过去的方向对不对、大概多远”。这一类需求刚好压中等距方位投影Azimuthal Equidistant ProjectionAEQD。AEQD 的核心数学性质只有一条从投影中心到地球上任意一点的大圆距离和方位角在地图上按真实值保留。也就是说站在北京或者西安看图指向莫斯科、伦敦、华盛顿的射线角度是可信的中心点到这些地方的距离也大体可读。联合国会徽那一类“单中心世界地图”采用的就是方位投影思路不是画着玩而是让每个方向都经得起量。常见的替代选项是兰勃特等积方位投影LAEA。它的特点是面积比例准确适合把人口、GDP、碳排放做成按面积着色的人口密度图但距离和方向不如 AEQD 直观。拿来做“以中国为中心”的通用底图LAEA 会让东北亚和北美西海岸的方向看起来略偏。我一般默认 AEQD除非需求里明确说“这块图要表达面积对比”。参数层面AEQD 在 proj4 字符串里写作 projaeqd再配 lat_0 和 lon_0 指定中心点。需要特别提醒距离只在中心点到任意点的射线上准确中心点之外任意两点之间的量测是不保真的。这张图适合回答“从中国出发向哪个方向、大概多远”不适合回答“莫斯科到开罗有多远”。把这一点跟业务方讲清楚能省掉后期一大堆“你的地图不准”的投诉。2.2 中心点放北京还是西安泾阳县位置决定变形分布同一个 AEQD中心点不同整张图的变形分布就不同。地图上离中心点越近变形越小离得越远拉伸越明显。所以中心点要尽量落在业务关注度最高的区域而不是简单取个几何中心。市面上常见做法有三类。第一放在北京附近约北纬 39.9 度、东经 116.4 度。政治和文化上容易解释适合对外宣传物料但北京纬度偏高整张图的变形带会明显上移欧洲和北美北部会被拽得更远。第二放在西安泾阳县一带约北纬 34.3 度、东经 108.9 度。这里是中国大地原点的所在位置国家测绘基准从这里引出。把投影中心设在大地原点附近中国境内到中心的距离误差最小国内数据重投影后边缘畸变最弱。第三放在赤道上、东经 105 度的位置。这样南北半球对称数学上最规整但中国不在赤道中心纬度为 0 时欧洲和北美会被推得很远。我实际出图时中心经度用 105 到 110 度中心纬度用 34 到 36 度默认值取 lon_0105、lat_035。这个参数组合下中国基本居中亚洲完整欧洲与北美西海岸的方向和距离都比较接近直觉。如果你做的只是“亚太视角”而不是严格“中国中心”可以换成 lon_0120、lat_030但这种情况已经偏离主题场景出图前要想清楚。2.3 记住三个参数lon_0、lat_0、datum全程就三个核心参数要调中心经度、中心纬度、基准。我的常用 proj4 写法是“projaeqd lat_035 lon_0105 datumWGS84 unitsm no_defs”可以直接复制到 QGIS、GDAL、geopandas 和 Proj4Leaflet。拆开看这几个部分各管一件事。projaeqd 指定等距方位投影。lon_0105 把东经 105 度作为整张图的中轴线东经 105 度大致从内蒙古西部穿过甘肃、四川再到云南是一条很接近中国几何中心的纵轴。lat_035 把中心纬度放在北纬 35 度约等于郑州到济南一线的纬度。datumWGS84 采用全球通用的基准与 GPS、互联网地图一致。unitsm 让输出单位为米漏掉这一项时很多工具会默认输出度接下来所有量算和缓冲都会出现“几千度”的怪数。no_defs 让工具不加载额外的默认定义保证参数行为可预期。如果数据来自国内测绘成果基准可能是 CGCS2000。CGCS2000 与 WGS84 在大部分地图比例下差异只有厘米级到亚米级做可视化底图基本可以忽略但数据如果是 1954 北京坐标系或 1980 西安坐标系就不能直接套这个字符串必须先转换到 CGCS2000 或 WGS84。QGIS 里输入自定义 CRS 时还会自动补出 x_00 y_00这是投影原点偏移默认 0 即可不需要动。想调整地图画布范围应该用导出时设置画布范围或 gdalwarp 的 -te 参数而不是改 x_0/y_0。投影和参数已经明确了。接下来看怎么用工具把一张经纬度世界地图真正变成中国中心版。3. 用 QGIS 和 GDAL 跑通最小流程从矢量数据到成品地图3.1 QGIS 里三步改投影中国中心地图的最小操作QGIS 是最容易上手的路径。先从 Natural Earth 官网下载 110m 分辨率的 admin_0_countries 矢量然后按三步操作。第一步把 ne_110m_admin_0_countries.shp 拖进 QGIS。这个数据自带 EPSG:4326也就是经纬度坐标打开后看到的是大家熟悉的横版世界地图。第二步右键图层选择“导出 → 要素另存为”。在格式栏选 Esri Shapefile文件名自己取。关键是坐标系不选下拉列表里的现成项而是点击旁边的“选择坐标系”按钮在弹出的对话框里点右上角“创建新的坐标系”。第三步在弹出的文本框里粘贴第 2.3 节那段 proj4 字符串给新 CRS 起名比如 “China Center AEQD”点击确定然后一路确定导出。导出完成后把新生成的 shp 拉回画布。此时你会看到世界地图已经变成以中国为中心的圆形或近似圆形。如果看到中国的国界线被切成好几段先不要慌这是 AEQD 切分后半球几何导致的正常现象后续要用“修复几何”工具或 gdalwarp 处理。如果看到的是空白或者坐标值带有 -1e07 这种天文数字多半是源数据的坐标系没被识别先右键图层检查“信息”选项卡。这里的常见误用是勾选“重新投影图层”而不是“要素另存为”。On-the-fly 重投影只改变显示效果数据本身仍然是经纬度之后任何空间分析缓冲、相交、量算都会继续按错误坐标进行。用“要素另存为”才会真正重算几何坐标。3.2 用 gdalwarp 完成大范围栅格重投影如果手头是影像底图、气温栅格、夜间灯光这类 tifQGIS 的另存为功能也能做但遇到大幅面影像会卡死内存占用经常是源文件的好几倍。常见做法是转用 GDAL 的命令行工具 gdalwarp一条命令完成重投影和裁剪。gdalwarp \ -t_srs projaeqd lat_035 lon_0105 datumWGS84 unitsm no_defs \ -r bilinear \ -wo NUM_THREADS4 \ -overwrite \ input.tif \ output_aeqd.tif逻辑说明-t_srs 填写目标投影参数这里直接复用第 2.3 节的字符串-r bilinear 用双线性重采样适合连续色阶的底图-wo NUM_THREADS4 用 4 个线程并行计算-overwrite 允许覆盖已有文件。执行完后 output_aeqd.tif 就是一张以中国为中心、单位为米的栅格底图。参数说明如果 input.tif 是 NDVI、土地利用这类分类栅格务必把 -r bilinear 换成 -r near。双线性会把相邻类别混成中间值例如类别 1 和类别 3 之间生成出 2整张图的分类图例就没法解释了。另一个容易漏的参数是 -dstnodata。重投影后原图范围外的区域会变成黑色或白色不同数据源默认填充值不同常见是 0 或 255。不设 -dstnodata海洋部分可能会和陆地一样显示。我的习惯写法是gdalwarp \ -t_srs projaeqd lat_035 lon_0105 datumWGS84 unitsm no_defs \ -r near \ -srcnodata 0 \ -dstnodata 0 \ -wo NUM_THREADS4 \ -overwrite \ input_classified.tif \ output_aeqd_classified.tif这里的 -srcnodata 0 声明源数据里 0 是无数据-dstnodata 0 表示输出文件里外边缘也填 0。如果 -srcnodata 填错了比如源数据里 0 是有效值会把真实类别抹掉出图前可以用 gdalinfo -stats 看一下分位数再定。3.3 矢量转投影同样能用命令行ogr2ogr 一次搞定矢量数据不一定都要走 QGIS 界面尤其是批处理时ogr2ogr 更高效。把 Natural Earth 的全局国界转成中国中心投影写法如下ogr2ogr -overwrite \ -t_srs projaeqd lat_035 lon_0105 datumWGS84 unitsm no_defs \ -lco ENCODINGUTF-8 \ world_china_center.shp \ ne_110m_admin_0_countries.shp逻辑说明-t_srs 指定输出投影-lco ENCODINGUTF-8 保证中文属性不乱码-overwrite 覆盖同名输出文件最后的输出文件名在前输入文件名在后这是 ogr2ogr 的参数顺序。参数说明如果源 shp 没有 .prj 文件ogr2ogr 不知道输入坐标系会默认按 EPSG:4326 处理。Natural Earth 下载包里通常带 .prj但如果是从别人那里拷贝的数据先用 ogrinfo -so 确认 Geometry 的坐标系信息。要是查不到先给源文件补一个 .prj 内容为 EPSG:4326。输出之后再做一步验证把 world_china_center.shp 拉回 QGIS叠加 3.1 生成的图层两者应该完全重合。重合不上优先检查是不是用了两套中心参数最常见就是一次用 lat_035、lon_0105另一次用 lat_034 或 lon_0110。3.4 出图前必须检查的经纬网与距离验证光看形状像不算完成我会做三层验证。第一画经纬网。QGIS 里用 Processing 工具箱的“创建网格”生成网格线范围覆盖全球间隔设 30 度把它叠到中国中心图上检查经线是否从中心向外辐射、纬线是否平滑弯曲。AEQD 下经线是一组从中心点出发的弯曲射线纬线是环状弧线这是正常形态。如果看到经线折断或者出现水平直线说明矢量数据没有正确处理跨越 180 度经线的几何需要先运行“修复几何”工具。第二量距离。用“测量线”工具从北京拉到华盛顿读出的长度大约应在 11000 公里左右误差允许 5%。如果差到两三千公里以上多半是投影参数没生效或者单位还是度。第三查边界。把中国国界单独高亮确认国界线在投影下没有因为切分而出现断线尤其是与邻国接壤的边界部分不能因为多部件拆分而少了一段。公开发布前用官方审图标准做一次边界校准不要直接使用未经验证的第三方国界数据。到这里命令行和 GUI 两条路径都跑通了。但很多项目的真实场景是在 Python 脚本里自动出图下一章给三条路线。4. 用 Python 画以中国为中心的世界地图三条可复现路线4.1 cartopy一条命令切换投影出图最省事如果你只是要一张用于报告或大屏的静态底图cartopy 是最短路径。它是 Matplotlib 的制图拓展底层封装了 proj 库的坐标变换。画以中国为中心的世界地图核心就是换掉投影对象import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature proj ccrs.AzimuthalEquidistant(central_longitude105, central_latitude35) fig plt.figure(figsize(8, 8)) ax fig.add_subplot(1, 1, 1, projectionproj) ax.set_global() ax.add_feature(cfeature.LAND, facecolor#e8e0d0) ax.add_feature(cfeature.OCEAN, facecolor#cfe3f0) ax.add_feature(cfeature.COASTLINE, linewidth0.4) ax.add_feature(cfeature.BORDERS, linewidth0.3, edgecolorgray) ax.gridlines(ls--, alpha0.5) plt.show()逻辑说明set_global() 表示绘制整个地球投影会自动生成圆形图廓add_feature 依次加上陆地、海洋、海岸线和国界gridlines 叠加经纬网参考线默认不标度数避免标签重叠。参数说明central_longitude105 和 central_latitude35 要和前面保持一致这是整个脚本的中心坐标。如果画出来是一个椭圆而不是圆通常是因为 figsize 不接近正方形改成 (8, 8) 即可。如果想只显示亚太区域可以换成 ax.set_extent([60, 150, -10, 60])但注意 cartopy 不同版本之间 set_extent 的单位有过变化升级版本后先查文档。cartopy 第一次运行时需要下载 Natural Earth 的数据集如果服务器处于离线环境会卡在下载步骤。提前手动放置数据文件到 cartopy 的缓存目录是常见做法具体路径可以通过 cartopy.config[data_dir] 查看。4.2 geopandas把自定义矢量数据转成中国中心投影遇到自己清洗过的 GeoJSON 或者需要做空间分析的工程任务cartopy 的绘图功能就不够用了。此时用 geopandas 做 CRS 变换是标准路线import geopandas as gpd world gpd.read_file(ne_110m_admin_0_countries.shp) print(源坐标系, world.crs) crs_aeqd projaeqd lat_035 lon_0105 datumWGS84 unitsm no_defs world_aeqd world.to_crs(crs_aeqd) world_aeqd.to_file(world_china_center.shp, encodingutf-8) print(变换后的坐标示例, world_aeqd.geometry.iloc[0].centroid)逻辑说明read_file 会自动读取 shp 的 .prj 文件并获得坐标系to_crs 接收 proj4 字符串将全部几何对象重投影to_file 写回矢量文件。参数说明最关键的是变换前确认 world.crs 是 EPSG:4326如果不是先执行 world world.set_crs(EPSG:4326)。网络上下载的 GeoJSON 经常会缺失 crs 字段to_crs 会直接报错。另一个高频问题是变换后部分国家的几何被切成多个 part例如俄罗斯和美国被切成左右两半。这属于 AEQD 把后半球几何展开的必然结果不影响几何本身但会影响后续绘制外轮廓和计算面积。处理方式是先用 makevalid() 修复自相交再结合 dissolve 合并重复多部件。如果要在地图上按属性着色只需在变换后调用 world_aeqd.plot(columnPOP_EST) 即可。多部件几何在 plot 时不会出问题但导出到 GeoJSON 再交给前端时要注意前端引擎是否支持 MultiPolygon 渲染不能支持的话要先做 explode() 把多部件拆开。4.3 用 pyproj 手工做一次坐标变换理解底层数学很多人在 cartopy 里画完图会把它当成一个黑匣子东经 105 度为什么变成中轴坐标到底怎么算的完全没有概念。我建议至少用 pyproj 手工跑一遍from pyproj import Transformer crs_source EPSG:4326 crs_target projaeqd lat_035 lon_0105 datumWGS84 unitsm no_defs transformer Transformer.from_crs(crs_source, crs_target, always_xyTrue) lon, lat 116.4, 39.9 x, y transformer.transform(lon, lat) print(f北京在中国中心投影下的坐标{x:.2f} m, {y:.2f} m) lon_back, lat_back transformer.transform(x, y, directionINVERSE) print(f反算回经纬度{lon_back:.4f}, {lat_back:.4f})逻辑说明Transformer.from_crs 接受源 CRS 和目标 CRS可以传 EPSG 编码也可以直接传 proj4 字符串transform 完成一个点的正算directionINVERSE 完成逆变换用来验证坐标没有算飞。参数说明always_xyTrue 是关键它规定输入输出顺序一律是经度在前、纬度在后。pyproj 4.x 之后默认的转换顺序受 CRS 定义影响EPSG:4326 默认是纬度经度序不设 always_xy 时极容易把 116.4、39.9 当成纬度经度结果跑到非洲附近。打印出的 x、y 数量级能帮你判断是否正常北京在中心点附近x、y 都应该在千万米级以内。如果 x 是 39 开头、y 是 116 开头说明输入顺序反了把经纬度调换即可。三条路线有一个共同点最终用的都是同一套 proj4 字符串。把 pyproj 算出来的坐标喂给 QGIS或者把 QGIS 导出的数据交给 cartopy只要参数一致结果是同一套。下面进入踩坑最多的部分。5. 避坑5 个中国中心世界地图常见翻车现场5.1 大陆被切成两半左右两侧重复出现现象输出图上美洲大陆同时出现在左右两侧看起来像地图被撕开了。明明导入的是一个完整的 world 图层导出后就出现两块北美洲。原因AEQD 把地球划分为以中心点为原点的前后两个半球。后半球的几何在平面展开时会被切开并翻折到图幅两侧。这是数学上的必然不是软件 bug。原始数据里一个名叫 United States 的多边形在重投影后可能变成两个分离的 part视觉上就是左右各有一块。解决如果需要的是“单中心完整世界”常规做法是裁剪。QGIS 里用 Processing 工具箱的“裁剪”工具以中国中心投影的外接圆作为裁剪图层把范围外的碎片裁掉。命令行里更直接给 gdalwarp 加 -clipsrc或用 ogr2ogr 的 -clipsrc 参数指定保留范围。如果业务只关注亚太及周边最简单是只在制图时隐藏欧洲和北美西侧的异常碎片或者用 set_extent 截取东经 60 到 180 度之间的区域绕开后半球。5.2 中央经线没调东经 120 度跑到图边缘现象中国在图上不居中反而偏右美国西部跑到了图中央。整张图看起来“以东亚为中心”但中国的视觉位置不在图心。原因中心经度设置不对。常见情况是项目源码里抄了一段现成投影参数lon_0 还停留在 0 或 150另一个情况是数据源自带投影但加载时没有显式覆盖GDAL 会按文件里的投影定义执行而不是按你想要的中心经度执行。解决把投影字符串统一改成 lon_0105并检查所有环节是否都用了同一字符串。在 QGIS 里不仅是图层要设置新 CRS画布本身的 CRS 也要同步否则导出截图仍会按画布投影输出。命令行方案里在 gdalwarp 参数后加 -te 指定目标范围也能帮助定位中央经线是否正确正常范围下东经 105 度应落在图幅水平中心。5.3 北极地区被拉成一条横向长带现象俄罗斯、加拿大、格陵兰在图上被严重拉长整个北极圈变成一条白色或浅色弧带几乎看不清岛屿轮廓。原因方位投影以中心点为原点离中心越远变形增长越快。北极是所有陆地里离中国中心最远的大块区域AEQD 在远距离处的角度和面积双重变形会把高纬度地区拉得很夸张。解决业务上很少需要完整北极。常见做法是把北纬 85 度以北裁掉在输出命令中加裁剪范围例如 ogr2ogr 的 -clipsrc 指定经纬度边界或 QGIS 里对图层启用比例尺范围。如果必须保留全极地视角就得换投影路线例如 Robinson 投影或双半球模式前者牺牲中心距离准确度后者左右各画一个中心点、各覆盖一半地球。不要指望通过调 lat_0 来修正北极中心纬度提高只会让北美和欧洲更远北极变形不会消失。5.4 把经纬度数据当成投影坐标直接量算现象导出的图层打开后坐标值还是 116.4、39.9 这种几十上百的数值而不是米制的百万数量级用字段计算器算面积得到几千度平方的数值。原因数据文件本身是 EPSG:4326但在加载时被强制指定成 AEQD或在导出时只改了显示设置而没有实际重投影。坐标系错配在 GIS 里不会报错但会直接污染后续所有几何计算。解决第一步先确认目标 shp 是否真的变成米制。用 ogrinfo -so 看坐标范围AEQD 投影下中国应该在 x 约 8000000 米、y 约 4000000 米附近。如果坐标仍是 116 或 39说明没转成功。第二步给原始数据显式 set_crs(EPSG:4326) 再 to_crs。第三步所有量算在投影后的图层上进行不要在原始图层上做。判断标准很简单经纬度数据的坐标范围是 -180 到 180 和 -90 到 90AEQD 的米制坐标范围可以到千万级别。5.5 距离和面积的量算结果与常识不符现象用测量工具量北京到莫斯科显示 3000 多公里实际大圆距离约 5800 公里量测某个省级区域的面积结果与公开面积差异很大。原因AEQD 只在中心点到任意点的方向上保距任意两点之间不保距同时它是非等积投影面积量算本身就不适用。很多用户拿它当“世界地图通用投影”用自然会在距离和面积上翻车。解决明确使用场景。做航线和半径圈分析时以中心点为圆心画等距圈这些等距圈在 AEQD 下是圆弧代表真实距离做任意两点间的距离时用球面距离公式或 proj 的 geodesic 模式不要在投影图上量。面积相关需求全部切换到等积投影例如 LAEA再谈计算。项目交付时最好在文档里写一句“本图适用于方向和中心距分析不适用于任意两点距离和面积统计”能减少大量返工。6. 进阶做法让中国中心世界地图在 Web 和印刷品里真正可用项目验收时地图通常不是停留在 QGIS 界面上而是要部署到 Web 大屏或输出印刷文件。中国中心投影在 Web 端最大的坎是 Leaflet 默认的 EPSG:3857 不支持自定义投影。我一般用 Proj4Leaflet先引入 proj4 和 proj4leaflet再声明自定义 CRSconst crs new L.Proj.CRS(EPSG:9824, projaeqd lat_035 lon_0105 datumWGS84 unitsm no_defs, { resolutions: [8192, 4096, 2048, 1024, 512, 256] } ); const map L.map(map, { crs: crs });逻辑说明第一个参数是自定义 CRS 的名字第二个就是前面反复用的 proj4 字符串第三个 resolutions 数组是每一级缩放的米/像素分辨率需要跟瓦片服务对齐。参数说明这个数组不能随便写。如果你的瓦片是 GeoServer 用同一投影发布的就去 GeoServer 的瓦片配置里读可用分辨率列表如果直接用了现成的墨卡托瓦片投影对不上会整片错位这在 Web 端是最常见的翻车。印刷品方面我吃过一次亏直接把 QGIS 导出成 300dpi 的整幅 GeoTIFF结果文件跑到 2GB后期排版软件直接打不开。现在我的习惯是先用 QGIS 布局管理器设定画布大小例如 300dpi、25cm 见方在布局里加地图并锁定比例再选择“另存为 PDF”矢量输出的清晰度远高于位图文件也小得多。如果印刷厂只收位图再在 PDF 里转一次 300dpi色彩模式统一转成 CMYK。做每一张中国中心地图收尾前我会固定做两件事量一次北京到华盛顿的距离确认在 1.1 万公里左右检查一遍南极洲如果被拉成面条状就按第 5.3 节的方法裁剪或隐藏。这个小习惯帮我挡掉了至少三次交付事故。投影图最容易骗人的地方在于它看起来像普通世界地图性质却差得很远参数差一个经度整条国境线都会偏移。希望这份流程能帮你在做以中国为中心的世界地图时少绕几道弯。本文还有配套的精品资源点击获取
网站建设高端定制企业官网