web-dev-qa-db-fra.com

Changer la carte d'arrière-plan pour contextuellement

J'ai ce code:

import pandas as pd
import numpy as np
from geopandas import GeoDataFrame
import geopandas
from shapely.geometry import LineString, Point
import matplotlib.pyplot as plt
import contextily

''' Do Something'''

df = start_stop_df.drop('track', axis=1)
crs = {'init': 'epsg:4326'}
gdf = GeoDataFrame(df, crs=crs, geometry=geometry)

ax = gdf.plot()
contextily.add_basemap(ax)
ax.set_axis_off()
plt.show()

Fondamentalement, cela génère une carte d'arrière-plan qui se trouve à Singapour. Cependant, lorsque je l'exécute, j'obtiens l'erreur suivante: HTTPError: Tile URL resulted in a 404 error. Double-check your tile url:http://tile.stamen.com/terrain/29/268436843/268435436.png Cependant, il produit toujours cette image: Code output

Comment puis-je changer l'URL de tuile? J'aimerais toujours avoir la carte de Singapour comme couche de base.

[~ # ~] modifier [~ # ~] :
A également essayé d'inclure cet argument dans add_basemap:
url ='https://www.openstreetmap.org/#map=12/1.3332/103.7987'
Qui a produit cette erreur:
OSError: cannot identify image file <_io.BytesIO object at 0x000001CC3CC4BC50>

Assurez-vous d'abord que votre GeoDataframe est dans la projection Web Mercator (epsg=3857). Une fois votre Geodataframe correctement géoréférencé, vous pouvez y parvenir par reprojection de Geopandas:

df = df.to_crs(epsg=3857)

Une fois cela fait, vous pouvez facilement choisir l'un des styles de carte pris en charge. Une liste complète se trouve dans contextily.sources module, au moment de la rédaction:

### Tile provider sources ###

ST_TONER = 'http://tile.stamen.com/toner/tileZ/tileX/tileY.png'
ST_TONER_HYBRID = 'http://tile.stamen.com/toner-hybrid/tileZ/tileX/tileY.png'
ST_TONER_LABELS = 'http://tile.stamen.com/toner-labels/tileZ/tileX/tileY.png'
ST_TONER_LINES = 'http://tile.stamen.com/toner-lines/tileZ/tileX/tileY.png'
ST_TONER_BACKGROUND = 'http://tile.stamen.com/toner-background/tileZ/tileX/tileY.png'
ST_TONER_LITE = 'http://tile.stamen.com/toner-lite/tileZ/tileX/tileY.png'

ST_TERRAIN = 'http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'
ST_TERRAIN_LABELS = 'http://tile.stamen.com/terrain-labels/tileZ/tileX/tileY.png'
ST_TERRAIN_LINES = 'http://tile.stamen.com/terrain-lines/tileZ/tileX/tileY.png'
ST_TERRAIN_BACKGROUND = 'http://tile.stamen.com/terrain-background/tileZ/tileX/tileY.png'

ST_WATERCOLOR = 'http://tile.stamen.com/watercolor/tileZ/tileX/tileY.png'

# OpenStreetMap as an alternative
OSM_A = 'http://a.tile.openstreetmap.org/tileZ/tileX/tileY.png'
OSM_B = 'http://b.tile.openstreetmap.org/tileZ/tileX/tileY.png'
OSM_C = 'http://c.tile.openstreetmap.org/tileZ/tileX/tileY.png'

Gardez à l'esprit que vous ne devez pas ajouter de numéros de tuiles x, y, z réels dans votre URL de tuile (comme vous l'avez fait dans votre exemple "MODIFIER"). ctx s'occupera de tout cela.

Vous pouvez trouver un exemple de copie copiable et plus d'informations sur GeoPandas docs .

import contextily as ctx

# Dataframe you want to plot
gdf = GeoDataFrame(df, crs= {"init": "epsg:4326"}) # Create a georeferenced dataframe  
gdf = gdf.to_crs(epsg=3857) # reproject it in Web mercator
ax = gdf.plot()

# choose any of the supported maps from ctx.sources
ctx.add_basemap(ax, url=ctx.sources.ST_TERRAIN)
ax.set_axis_off()
plt.show()
6
Marjan Moderc

je suis trop nouveau pour ajouter un commentaire, mais je voulais signaler à ceux qui disent dans les commentaires qu'ils obtiennent une erreur 404. Vérifiez vos majuscules, etc. Les urls de Stamen sont spécifiques à ce sujet. Par exemple, il n'y a pas d'appel en majuscules. Il ne fait que mettre en majuscule la première lettre. Par exemple:

ctx.add_basemap(ax=ax,url=ctx.providers.Stamen.Toner, zoom=10)

0
SirRacha