Python教程 | 最标准的地图调用方式

发布时间:2025-12-09 11:45:12 浏览次数:1

天地图是国家测绘地理信息局建设的地理信息综合服务网站,是国家地理信息公共服务平台的公众版。与常用的谷歌地图、腾讯地图、百度地图、微软地图、必应地图相比,天地图有什么不同呢?主要体现在数据的权威性和准确性。天地图发布的国界线、九段线等是准确无误的;另外国内只有天地图影像的坐标是无偏移的,其余地图的坐标都进行过加密处理。Cartopy是一个基于Python的制图模块,其提供了加载在线地图的功能,那么如何添加调用天地图服务功能呢?其实前期已有相关的工作,但是由于天地图服务升级,原先的方法都不再适用,这里给出的是最新的调用方法。

准备工作

网站:天地图首先需要注册账号,然后选择开发资源→地图API

进入控制台,点击创建新应用,选择服务器端,这样可以得到一个密钥(key)

天地图地图服务采用OGC WMTS标准,但是该方法目前没有试成功,故采用了瓦片地图(XYZ Tiles)的形式。

添加调用方法

添加以下代码,注意把代码中的'your_key'替换成之前得到的key

import cartopy.io.img_tiles as cimgt# 天地图矢量class TDT_vec(cimgt.GoogleWTS):    def _image_url(self, tile):        x, y, z = tile        key = 'your_key'        url = 'http://t0.tianditu.gov.cn/DataServer?T=vec_w&x=%s&y=%s&l=%s&tk=%s' % (x, y, z, key)        return url# 天地图遥感class TDT_img(cimgt.GoogleWTS):    def _image_url(self, tile):        x, y, z = tile        key = 'your_key'        url = 'http://t0.tianditu.gov.cn/DataServer?T=img_w&x=%s&y=%s&l=%s&tk=%s' % (x, y, z, key)        return url# 天地图地形class TDT_ter(cimgt.GoogleWTS):    def _image_url(self, tile):        x, y, z = tile        key = 'your_key'        url = 'http://t0.tianditu.gov.cn/DataServer?T=ter_w&x=%s&y=%s&l=%s&tk=%s' % (x, y, z, key)        return url

调用演示

1、矢量底图、影像底图、地形底图

# 导入模块import matplotlib.pyplot as pltimport cartopy.crs as ccrsimport cartopy.feature as cfeatfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTERfrom cartopy.mpl.ticker import LongitudeFormatter,LatitudeFormatterimport cartopy.io.shapereader as shpreaderimport numpy as npplt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False fig = plt.figure(figsize=(18, 12))ax = fig.add_subplot(1, 3, 1, projection=ccrs.PlateCarree())ax.set_extent([118, 122, 28, 32],crs=ccrs.PlateCarree())request = TDT_vec()ax.add_image(request, 9)ax.set_title('天地图矢量底图',fontsize=15)gl = ax.gridlines(draw_labels=True, linewidth=1, color='k', alpha=0.5, linestyle='--')gl.xlabels_top = gl.ylabels_right = False gl.xformatter = LONGITUDE_FORMATTER gl.yformatter = LATITUDE_FORMATTERax = fig.add_subplot(1, 3, 2, projection=ccrs.PlateCarree())ax.set_extent([118, 122, 28, 32],crs=ccrs.PlateCarree())request = TDT_img()ax.add_image(request, 9)ax.set_title('天地图影像底图',fontsize=15)gl = ax.gridlines(draw_labels=True, linewidth=1, color='k', alpha=0.5, linestyle='--')gl.xlabels_top = gl.ylabels_right = False gl.xformatter = LONGITUDE_FORMATTER gl.yformatter = LATITUDE_FORMATTERax = fig.add_subplot(1, 3, 3, projection=ccrs.PlateCarree())ax.set_extent([118, 122, 28, 32],crs=ccrs.PlateCarree())request = TDT_ter()ax.add_image(request, 9)ax.set_title('天地图地形底图',fontsize=15)gl = ax.gridlines(draw_labels=True, linewidth=1, color='k', alpha=0.5, linestyle='--')gl.xlabels_top = gl.ylabels_right = False gl.xformatter = LONGITUDE_FORMATTER gl.yformatter = LATITUDE_FORMATTERplt.show()

2、不同层级的底图

fig = plt.figure(figsize=(18, 12))for i in range(6,9):    ax = fig.add_subplot(1, 3, i-5, projection=ccrs.PlateCarree())    ax.set_extent([120.4, 122.1, 30.6, 32.1],crs=ccrs.PlateCarree())    request = TDT_img()    ax.add_image(request, i)    ax.set_title('Level='+str(i),fontsize=15)    gl = ax.gridlines(xlocs=np.arange(120.5, 122.5, 0.5),                      ylocs=np.arange(30, 32.5, 0.5),                      draw_labels=True,linewidth = 0.5,color='k',                      alpha=0.5,linestyle='--')    gl.xlabels_top = gl.ylabels_right = Falseplt.show()

参考:

  1. https://my.oschina.net/u/4581316/blog/4396806
  2. http://bbs.06climate.com/forum.php?mod=viewthread&tid=89165
国家测绘局地图
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477