Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matplotlib 如何在cartopy中在地图上绘制填充多边形_Matplotlib_Cartopy - Fatal编程技术网

Matplotlib 如何在cartopy中在地图上绘制填充多边形

Matplotlib 如何在cartopy中在地图上绘制填充多边形,matplotlib,cartopy,Matplotlib,Cartopy,编辑,添加来自答案的建议 我有一个lat/lon中的顶点列表,用于定义地图上多边形的角。我想用cartopy在地图上画一个多边形,边是大圆。我已经试着按照上面的例子去做了,但是我不能让它工作。以下是我迄今为止所尝试的: import numpy as np import matplotlib.pyplot as plt import cartopy.crs as ccrs import matplotlib.patches as mpatches map_proj = ccrs.Orthogr

编辑,添加来自答案的建议

我有一个lat/lon中的顶点列表,用于定义地图上多边形的角。我想用cartopy在地图上画一个多边形,边是大圆。我已经试着按照上面的例子去做了,但是我不能让它工作。以下是我迄今为止所尝试的:

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import matplotlib.patches as mpatches

map_proj = ccrs.Orthographic(central_latitude=0.0, central_longitude=80.0)
ax = plt.axes(projection=map_proj)

ax.set_global() # added following an answer to my question
ax.gridlines()

ax.coastlines(linewidth=0.5, color='k', resolution='50m')

lat_corners = np.array([-20.,  0., 50., 30.])
lon_corners = np.array([ 20., 90., 90., 30.]) + 15.0 # offset from gridline for clarity

poly_corners = np.zeros((len(lat_corners), 2), np.float64)
poly_corners[:,0] = lon_corners
poly_corners[:,1] = lat_corners

poly = mpatches.Polygon(poly_corners, closed=True, ec='r', fill=False, lw=1, fc=None, transform=ccrs.Geodetic())
ax.add_patch(poly)


请注意,这些线不是大圆,并且似乎有四个以上的顶点。我觉得这是一件非常简单的事情,一定有办法做到,但我无法从cartopy文档中看出这一点。

注意,示例使用了

ax.set_global()

我认为这可能是因为Cartopy的默认变换分辨率对于该投影来说太低了。您可以通过强制使用更高的分辨率来解决此问题:

map_proj = ccrs.Orthographic(central_latitude=0.0, central_longitude=80.0)
map_proj._threshold /= 100.
...

这提供了漂亮的曲线大圆弧。

这是一个可运行的代码和输出。 荣誉归于:询问者、重要人物贝恩内斯特和阿吉道森

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import matplotlib.patches as mpatches

map_proj = ccrs.Orthographic(central_latitude=0.0, central_longitude=80.0)

map_proj._threshold /= 100.  # the default values is bad, users need to set them manually

ax = plt.axes(projection=map_proj)

ax.set_global() # added following an answer to my question
ax.gridlines()

ax.coastlines(linewidth=0.5, color='k', resolution='50m')

lat_corners = np.array([-20.,  0., 50., 30.])
lon_corners = np.array([ 20., 90., 90., 30.]) + 15.0 # offset from gridline for clarity

poly_corners = np.zeros((len(lat_corners), 2), np.float64)
poly_corners[:,0] = lon_corners
poly_corners[:,1] = lat_corners

poly = mpatches.Polygon(poly_corners, closed=True, ec='r', fill=True, lw=1, fc="yellow", transform=ccrs.Geodetic())
ax.add_patch(poly)

plt.show()
输出:


现在我看到了海岸线,但多边形仍然是错误的(请参见我编辑的问题)。是的,显然,多边形没有在cartopy中实现。为什么不改为使用矩形呢?我需要绘制非lat-lon网格上定义的循环模型的网格单元,例如立方体球体和二十面体网格。它们不是矩形,即使其中一些有四个顶点。在这种情况下,你能提高多边形的分辨率吗。我的意思是,在极端情况下,你可以提供一个每100公里左右有一个点的多边形;一旦这样做了,我会删除这个答案,这样的问题仍然是处女和明确的。