python - 为什么我的谷歌图 block 在 Cartopy map 中看起来很差?

标签 python google-maps matplotlib cartopy

我对用Cartopy渲染google tiles有点疑惑。与标准的谷歌地图外观相比,该 map 看起来非常糟糕。

示例(来自 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)

生成:

Poor resolution

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

enter image description here

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

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

very poor

Google Maps 中显示了相同的 map

google map

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

最佳答案

这个问题也在 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

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

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

Bilinear interpolation

更好的是,让我们尝试类似 spline36 的东西:

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

High order spline interpolation

并排放置这些图像:

Side-by-side comparisson

有一个注意事项(如 https://github.com/SciTools/cartopy/issues/1048#issuecomment-417001744 中所指出的),当在非本地投影上绘制图 block 时。在这种情况下,我们需要配置两个变量:

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

关于python - 为什么我的谷歌图 block 在 Cartopy map 中看起来很差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49155110/

相关文章:

Python 字符串计数无法正常工作?

python - 使用带有子进程的单个命令运行 100 个文件

python - 解析请求响应的键、值对

javascript - Google map API : Display a digit in a GMarker

android - 在 map View 中绘制透明的圆圈

python - 如何在 matplotlib 子图图像轴之间强制大小相同

python - 直方图 Matplotlib

python - 如何统计使用beautiful soup检索到的代码行数?

android - 如何缩放相机以覆盖android googlemap中的路径?

python - 如何关闭所有 pyplot 窗口(包括以前脚本执行的窗口)?