Изменить фоновую карту для контекста - PullRequest
5 голосов
/ 12 июня 2019

У меня есть этот код:

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()

По сути, это создает фоновую карту в Сингапуре. Однако, когда я запускаю его, я получаю следующую ошибку: HTTPError: Tile URL resulted in a 404 error. Double-check your tile url:http://tile.stamen.com/terrain/29/268436843/268435436.png Тем не менее, он все еще производит это изображение: Code output

Как изменить URL-адрес плитки? Я все еще хотел бы иметь карту Сингапура в качестве базового слоя.

EDIT
Также попытался включить этот аргумент в add_basemap:
url ='https://www.openstreetmap.org/#map=12/1.3332/103.7987'
Который произвел эту ошибку:
OSError: cannot identify image file <_io.BytesIO object at 0x000001CC3CC4BC50>

1 Ответ

1 голос
/ 13 июня 2019

Сначала убедитесь, что ваш GeoDataframe находится в проекции Web Mercator (epsg=3857).Как только ваш Geodataframe будет правильно привязан к географической привязке, вы сможете добиться этого путем перепроецирования Geopandas:

df = df.to_crs(epsg=3857)

После этого вы легко сможете выбрать любой из поддерживаемых стилей карты.Полный список можно найти в модуле contextily.sources на момент написания:

### 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'

Имейте в виду, что вам не следует добавлять фактические номера плиток x, y, z в URL-адрес плитки (например,Вы сделали в своем примере "РЕДАКТИРОВАТЬ").CTX позаботится обо всем этом.

Вы можете найти рабочий копируемый пример и дополнительную информацию на 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()
...