Извлечение данных из cartopy.feature
Как я могу извлечь контурные линии из данных, импортированных с помощью картопы 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()
2 ответа
Вы можете получить координаты для построенных линий непосредственно из объекта, который содержит набор shapely.MultiLineString
s. В качестве подтверждения концепции, проверьте этот код:
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 функции, получая доступ к его geometries()
, Каждый из них MultiLineString
затем содержит один или несколько 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)))
получая тот же сюжет, что и выше.