为什么我的 google 瓦片在 Cartopy 地图中看起来很差?
Why do my google tiles look poor in a Cartopy map?
我对用Cartopy渲染google个tile有点疑惑。与标准 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():
渲染
中显示的是同一张地图
有人知道这个奇怪问题的原因以及解决方法吗?
这个问题也在 https://github.com/SciTools/cartopy/issues/1048, where it was suggested setting the interpolation=
keyword argument. This is the standard matplotlib interpolation for imshow, which is documented at https://matplotlib.org/gallery/images_contours_and_fields/interpolation_methods.html 的 cartopy 问题跟踪器上被问到。
我们在问题跟踪器中确定您在这里看到的是 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 中指出的那样),即在非本地投影上绘制图块的情况。在那种情况下,我们有两个变量要配置:
- 从原生投影到目标投影重新网格化的分辨率
- 重投影图像渲染的插值方案(这是我们在这个答案中一直在改变的)。
希望这些都是有用的信息。
接受的答案中有一个小错字。
ax.add_image(request, 10, interpolation='spine36')
应该是
ax.add_image(request, 10, interpolation='spline36')
我对用Cartopy渲染google个tile有点疑惑。与标准 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():
渲染有人知道这个奇怪问题的原因以及解决方法吗?
这个问题也在 https://github.com/SciTools/cartopy/issues/1048, where it was suggested setting the interpolation=
keyword argument. This is the standard matplotlib interpolation for imshow, which is documented at https://matplotlib.org/gallery/images_contours_and_fields/interpolation_methods.html 的 cartopy 问题跟踪器上被问到。
我们在问题跟踪器中确定您在这里看到的是 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 中指出的那样),即在非本地投影上绘制图块的情况。在那种情况下,我们有两个变量要配置:
- 从原生投影到目标投影重新网格化的分辨率
- 重投影图像渲染的插值方案(这是我们在这个答案中一直在改变的)。
希望这些都是有用的信息。
接受的答案中有一个小错字。
ax.add_image(request, 10, interpolation='spine36')
应该是
ax.add_image(request, 10, interpolation='spline36')