【问题标题】:Why do my google tiles look poor in a Cartopy map?为什么我的谷歌图块在 Cartopy 地图中看起来很差?
【发布时间】:2018-08-15 17:51:09
【问题描述】:

我对使用 Cartopy 渲染 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)

生成:

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

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

这是我正在处理的地图上的另一个示例,由 Cartopy 和 googletiles() 渲染:

Google Maps中显示的相同地图

有谁知道这个奇怪问题的原因以及如何解决它?

【问题讨论】:

  • 会不会是 mpl 后端? matplotlib.get_backend() 返回什么?
  • @DanielKirkham 我在 Jupyter 笔记本上得到“module://ipykernel.pylab.backend_inline”,在 ipython 控制台上得到“MacOSX”。两者都给出相同的结果。
  • 我不知道 cartopy 的行为,但我最近遇到了 salem,它可以用谷歌图片做一些很酷的事情salem.readthedocs.io/en/latest/auto_examples/…

标签: python google-maps matplotlib cartopy


【解决方案1】:

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()

我们得到:

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

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

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

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

并排放置这些图像:

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

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

希望这些都是有用的信息。

【讨论】:

  • 此选项是否已被弃用?在尝试保存图时,我收到错误 TypeError: draw() got an unexpected keyword argument 'interpolation'
【解决方案2】:

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

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

应该是

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

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2020-01-22
    • 2019-09-18
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多