Estoy usando Scattermapbox de plotly para superponer un mapa con una imagen sombreada de polígonos creados por la función de sombreado de datashader (basado en https://plotly.com/python/datashader/ ), pero las proyecciones no parecen alinearse, vea la imagen a continuación . ¿Alguna sugerencia sobre cómo puedo superar este problema usando Scattermapbox y datashader de plotly?
Ejemplo reproducible:
import geopandas as gpd import plotly.graph_objects as go import spatialpandas as spd import datashader as ds from colorcet import fire import datashader.transfer_functions as tf # load data world = gpd.read_file( gpd.datasets.get_path('naturalearth_lowres') ) # world = world.to_crs(epsg=3857) # create spatialpandas DataFrame df_world = spd.GeoDataFrame(world) # create datashader canvas and aggregate cvs = ds.Canvas(plot_width=1000, plot_height=1000) agg = cvs.polygons(df_world, geometry='geometry', agg=ds.mean('pop_est')) # create shaded image tf.shade(agg, cmap=fire)
# create shaded image and convert to Python image img = tf.shade(agg, cmap=fire)[::-1].to_pil() coords_lat, coords_lon = agg.coords["y"].values, agg.coords["x"].values # Corners of the image, which need to be passed to mapbox coordinates = [ [coords_lon[0], coords_lat[0]], [coords_lon[-1], coords_lat[0]], [coords_lon[-1], coords_lat[-1]], [coords_lon[0], coords_lat[-1]], ] fig = go.Figure(go.Scattermapbox()) fig.update_layout( mapbox_style="open-street-map", mapbox_layers=[ { "sourcetype": "image", "source": img, "coordinates": coordinates, } ] ) fig.show()
Leí que Scattermapbox solo admite la proyección de Mercator, lo que me pareció confuso ya que los ejemplos en la documentación de plotly parecen estar en formato largo/lat, pero intenté convertir las coordenadas del GeoDataFrame a epsg 3857, consulte
# world = world.to_crs(epsg=3857)
El resultado es que la imagen sombreada se vuelve invisible. Cualquier ayuda sería muy apreciada.
¿Has probado con epsg:4326? En mi caso, uso este y las geometrías están colocadas correctamente.
Por otro lado, con geopandas para convertir la columna de geometría del marco de datos, debe usar el parámetro "inplace = True".