Использование Cartopy вместо Basemap для создания трассировок карты в приложении Dash

В настоящее время я создаю приложение Dash, которое использует раскрывающиеся меню, чтобы определить, какие данные отображать на глобальной карте (обычно контурные графики).

Я знаю, что использование Basemap постепенно прекращается, поэтому хочу перейти на Cartopy в качестве источника карт (Mapbox является отличным, но не подходит), но я не уверен, как получить информацию о карте в виде трассировки, чтобы использовать ее с Dash?

У меня нет проблем с переходом на простой график - он находится прямо в интерфейсе Dash, где данные карты должны вводиться в виде трассировки.

Учебник, которому я следовал, касается только базовой карты, и я не могу найти никакой информации о том, как преобразовать этот метод в Cartopy при использовании Dash.

Любые идеи очень ценятся!

Код взят из: https://plot.ly/ipython-notebooks/basemap-maps/ Полный пример доступен там - я только что скопировал то, что, по моему мнению, является ключевым битом, который мне нужно изменить

превращение контуров в след

trace1 = Contour(
z=air,
x=lon,
y=lat,
colorscale="RdBu",
zauto=False,  zmin=-5, zmax=5 )      

делать карту

m = Basemap() 


def make_scatter(x,y):

return Scatter(
    x=x,
    y=y,
    mode='lines',
    line=Line(color="black"),
    name=' '  # no name on hover
)

def polygons_to_traces(poly_paths, N_poly):

''' 
pos arg 1. (poly_paths): paths to polygons
pos arg 2. (N_poly): number of polygon to convert
'''
traces = []  # init. plotting list 

for i_poly in range(N_poly):
    poly_path = poly_paths[i_poly]

    # get the Basemap coordinates of each segment
    coords_cc = np.array(
        [(vertex[0],vertex[1]) 
         for (vertex,code) in poly_path.iter_segments(simplify=False)]
    )

    # convert coordinates to lon/lat by 'inverting' the Basemap projection
    lon_cc, lat_cc = m(coords_cc[:,0],coords_cc[:,1], inverse=True)

    # add plot.ly plotting options
    traces.append(make_scatter(lon_cc,lat_cc))

return traces


def get_coastline_traces():

poly_paths = m.drawcoastlines().get_paths() # coastline polygon paths
N_poly = 91  # use only the 91st biggest coastlines (i.e. no rivers)
return polygons_to_traces(poly_paths, N_poly)


def get_country_traces():

poly_paths = m.drawcountries().get_paths() # country polygon paths

N_poly = len(poly_paths)  # use all countries

return polygons_to_traces(poly_paths, N_poly)


traces_cc = get_coastline_traces()+get_country_traces()

data = Data([trace1]+traces_cc)

person user12219613    schedule 15.10.2019    source источник
comment
Метод cartopy add_feature () (показан здесь: scitools.org.uk/ cartopy / docs / latest / gallery / features.html) возвращает художников точно так же, как такой метод, как drawcountries (). Вы пробовали заменить вызов drawcountries () на add_feature (cfeature.BORDERS) и посмотреть, все ли работает?   -  person DopplerShift    schedule 18.10.2019


Ответы (1)


Вы можете создать трассу с береговой линией как объект графика, например, следующим образом:

import plotly.graph_objects as go
import cartopy.feature as cf

# create the list of coordinates separated by nan to avoid connecting the lines
x_coords = []
y_coords = []
for coord_seq in cf.COASTLINE.geometries():
    x_coords.extend([k[0] for k in coord_seq.coords] + [np.nan])
    y_coords.extend([k[1] for k in coord_seq.coords] + [np.nan])


## in your app callback for dash
fig = go.Figure()
fig.add_trace(
    go.Scatter(
        x = x_coords,
        y = y_coords,
        mode = 'lines'))

Результат выглядит следующим образом

Вы можете добавить другие трассы помимо ПОБЕРЕЖЬЕ, например ГРАНИЦЫ. Похоже, здесь есть больше информации: https://scitools.org.uk/cartopy/docs/latest/matplotlib/feature_interface.html#cartopy.feature.BORDERS

person Fabio Almeida    schedule 17.12.2020