为什么我的Google瓷砖在Cartopy地图上看起来很差?

stm*_*4tt 6 python google-maps matplotlib cartopy

我对Cartopy渲染Google瓷砖感到有些困惑。与标准的Google地图外观相比,该地图看起来非常差。

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

import matplotlib.pyplot as plt

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

def make_map(projection=ccrs.PlateCarree()):
    fig, ax = plt.subplots(figsize=(9, 13),
                           subplot_kw=dict(projection=projection))
    gl = ax.gridlines(draw_labels=True)
    gl.xlabels_top = gl.ylabels_right = False
    gl.xformatter = LONGITUDE_FORMATTER
    gl.yformatter = LATITUDE_FORMATTER
    return fig, ax
import cartopy.io.img_tiles as cimgt

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

request = cimgt.GoogleTiles()

fig, ax = make_map(projection=request.crs)
ax.set_extent(extent)

ax.add_image(request, 10)
Run Code Online (Sandbox Code Playgroud)

产生:

分辨率差

与链接的网站上显示的同一张图片相比,这看起来非常糟糕-查看文字标签和街道编号的像素化渲染:

在此处输入图片说明

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

这是由Cartopy和googletiles()渲染的地图上的另一个示例:

很穷

Google地图中显示的同一张地图

谷歌地图

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

pel*_*son 7

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()
Run Code Online (Sandbox Code Playgroud)

我们得到:

最近插值

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

ax.add_image(request, 10, interpolation='bilinear')
Run Code Online (Sandbox Code Playgroud)

双线性插值

更好的是,让我们尝试类似spline36的方法:

ax.add_image(request, 10, interpolation='spine36')
Run Code Online (Sandbox Code Playgroud)

高阶样条插值

将这些图像并排放置:

并排比较

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

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

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

  • 此选项已被弃用吗?在尝试保存图形时,我收到错误“TypeError:draw()得到了意外的关键字参数'插值'” (2认同)