3

如何从通过cartopy的feature界面导入的数据中提取轮廓线?如果解决方案涉及geoviews.feature或其他包装器,那当然可以。

例如,我将如何提取cfeature.COASTLINE以下示例中绘制的数据?

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature

ax = plt.axes(projection=ccrs.PlateCarree())
ax.add_feature(cfeature.COASTLINE)
plt.show()

我很感激你可能有任何提示!

FWIW,在basemap,我会这样做:

import mpl_toolkits.basemap as bm
import matplotlib.pyplot as plt
m = bm.Basemap(width=2000e3,height=2000e3,
            resolution='l',projection='stere',
            lat_ts=70,lat_0=70,lon_0=-60.)

fig,ax=plt.subplots()
coastlines = m.drawcoastlines().get_segments()
4

2 回答 2

3

您可以直接从包含一组shapely.MultiLineStrings 的特征中获取绘制线的坐标。作为概念证明,请查看以下代码:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature

fig, (ax1,ax2) = plt.subplots(nrows=2, subplot_kw = dict(projection=ccrs.PlateCarree()))
ax1.add_feature(cfeature.COASTLINE)

for geom in cfeature.COASTLINE.geometries():
    for g in geom.geoms:
        print(list(g.coords))
        ax2.plot(*zip(*list(g.coords)))

plt.show()

这给出了这张图片:

上述代码的结果

换句话说,您可以MultiLineString通过访问特征的 s 来迭代特征的 s geometries()。然后,这些MultiLineStrings 中的每一个都包含一个或多个LineStrings,它们具有coords可以转换为列表的属性。希望这可以帮助。

于 2018-09-07T06:38:08.107 回答
1

供将来参考:一段时间后,我也遇到了这个(更通用的?)方法来访问任何功能:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader

shpfilename = shpreader.natural_earth(resolution='110m',
                                      category='physical',
                                      name='coastline')  
coastlines = shpreader.Reader(shpfilename).records()

fig, ax = plt.subplots(subplot_kw = dict(projection=ccrs.PlateCarree()))
for c in coastlines:
    for g in c.geometry:
        ax.plot(*zip(*list(g.coords)))

产生与上面相同的图。

于 2018-09-12T10:51:50.177 回答