为什么我的谷歌瓷砖在Cartopy地图中显得很差?

时间:2018-03-07 15:06:37

标签: python google-maps matplotlib cartopy

我对使用Cartopy渲染谷歌瓷砖感到有些困惑。与标准的谷歌地图相比,地图看起来非常差。

示例(来自https://ocefpaf.github.io/python4oceanographers/blog/2015/06/22/osm/的代码):

sg-...

生成:

Poor resolution

看起来很差 - 看看文本标签和街道号码的像素化渲染 - 与链接网站上显示的相同图片相比:

enter image description here

更改缩放级别似乎并未改善这种情况。

这是我正在制作的由Cartopy和googletiles()呈现的地图上的另一个示例:

very poor

Google Maps

中显示的相同地图

google map

有谁知道这个奇怪问题可能是什么原因以及如何解决?

2 个答案:

答案 0 :(得分:5)

还在https://github.com/SciTools/cartopy/issues/1048的cartopy问题跟踪器上询问了此问题,建议设置interpolation=关键字参数。这是用于imshow的标准matplotlib插值,已在https://matplotlib.org/gallery/images_contours_and_fields/interpolation_methods.html中进行了记录。

我们在问题跟踪器中确定nearest的插值就是您在此处看到的。将其更改为bilinear可获得很好的结果,并且使用不同的插值方案可以获得更好的结果。例如,spline36方案可产生非常令人愉悦的图像……

因此,以您的示例代码为:

import matplotlib.pyplot as plt

import cartopy.crs as ccrs
from cartopy.io import shapereader
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER

import cartopy.io.img_tiles as cimgt

extent = [-39, -38.25, -13.25, -12.5]

request = cimgt.OSM()

fig = plt.figure(figsize=(9, 13))
ax = plt.axes(projection=request.crs)
gl = ax.gridlines(draw_labels=True, alpha=0.2)
gl.xlabels_top = gl.ylabels_right = False
gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER

ax.set_extent(extent)

ax.add_image(request, 10)

plt.show()

我们得到:

Nearest interpolation

要设置bilinear插值,我们可以将add_image行更改为:

ax.add_image(request, 10, interpolation='bilinear')

Bilinear interpolation

更好的是,让我们尝试使用spline36之类的方法:

ax.add_image(request, 10, interpolation='spine36')

High order spline interpolation

并排放置这些图像:

Side-by-side comparisson

在将图块绘制在其非本机投影上的情况下,有一个警告(如https://github.com/SciTools/cartopy/issues/1048#issuecomment-417001744中所述)。在这种情况下,我们需要配置两个变量:

1)从原始投影到目标投影的重新网格分辨率 2)重投影图像的渲染的插值方案(这就是我们在此答案中一直在更改的内容。)

希望这是所有有用的信息。

答案 1 :(得分:0)

接受的答案中有一个小的错字。

ax.add_image(request, 10, interpolation='spine36')

应该是

ax.add_image(request, 10, interpolation='spline36')