从 cartopy.feature 中提取数据
Extracting data from cartopy.feature
如何从通过 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()
您可以直接从包含一组 shapely.MultiLineString
的特征中获取绘制线的坐标。作为概念证明,请查看此代码:
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()
给出了这张图片:
换句话说,您可以通过访问 geometries()
来迭代特征的 MultiLineString
。然后,这些 MultiLineString
中的每一个都包含一个或多个 LineString
,这些 LineString
具有可以转换为列表的 coords
属性。希望这有帮助。
供将来参考:一段时间后,我也遇到了这种(更通用?)访问任何功能的方法:
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)))
生成与上面相同的图。
如何从通过 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()
您可以直接从包含一组 shapely.MultiLineString
的特征中获取绘制线的坐标。作为概念证明,请查看此代码:
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()
给出了这张图片:
换句话说,您可以通过访问 geometries()
来迭代特征的 MultiLineString
。然后,这些 MultiLineString
中的每一个都包含一个或多个 LineString
,这些 LineString
具有可以转换为列表的 coords
属性。希望这有帮助。
供将来参考:一段时间后,我也遇到了这种(更通用?)访问任何功能的方法:
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)))
生成与上面相同的图。