更改上下文的背景图
Change background map for contextily
我有这个代码:
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
但是,它仍然会生成此图像:
如何更改磁贴 URL?我仍然希望将新加坡地图作为基础层。
编辑:
还尝试将此参数包含到 add_basemap:
url ='https://www.openstreetmap.org/#map=12/1.3332/103.7987'
产生此错误的原因:
OSError: cannot identify image file <_io.BytesIO object at 0x000001CC3CC4BC50>
首先确保您的 GeoDataframe 使用 Web 墨卡托投影 (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'
请记住,您不应在您的图块 URL 中添加实际的 x、y、z 图块编号(就像您在 "EDIT" 示例中所做的那样)。 ctx 将处理所有这些。
您可以在 GeoPandas docs 中找到有效的 copy-pastable 示例和更多信息。
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()
我太新了,无法添加评论,但我想向那些在评论中说他们收到 404 错误的人指出。检查你的大写字母等。Stamen 的网址对此有具体说明。例如,没有全部大写的调用。它只是将第一个字母大写。例如:
ctx.add_basemap(ax=ax,url=ctx.providers.Stamen.Toner, zoom=10)
Contextily 的默认 crs 是 epsg:3857。但是,您的数据框位于不同的 CRS 中。使用以下内容,参考手册 here:
ctx.add_basemap(ax, crs='epsg:4326', source=ctx.providers.Stamen.TonerLite)
请参考此link使用不同的来源,如Stamen.Toner
、Stamen.Terrain
等(Stamen.Terrain
为默认值)。
此外,您可以使用 df.to_crs()
将数据框转换为 EPSG:3857。在这种情况下,您应该跳过 ctx.add_basemap()
函数中的 crs
参数。
我有这个代码:
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
但是,它仍然会生成此图像:
如何更改磁贴 URL?我仍然希望将新加坡地图作为基础层。
编辑:
还尝试将此参数包含到 add_basemap:
url ='https://www.openstreetmap.org/#map=12/1.3332/103.7987'
产生此错误的原因:
OSError: cannot identify image file <_io.BytesIO object at 0x000001CC3CC4BC50>
首先确保您的 GeoDataframe 使用 Web 墨卡托投影 (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'
请记住,您不应在您的图块 URL 中添加实际的 x、y、z 图块编号(就像您在 "EDIT" 示例中所做的那样)。 ctx 将处理所有这些。
您可以在 GeoPandas docs 中找到有效的 copy-pastable 示例和更多信息。
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()
我太新了,无法添加评论,但我想向那些在评论中说他们收到 404 错误的人指出。检查你的大写字母等。Stamen 的网址对此有具体说明。例如,没有全部大写的调用。它只是将第一个字母大写。例如:
ctx.add_basemap(ax=ax,url=ctx.providers.Stamen.Toner, zoom=10)
Contextily 的默认 crs 是 epsg:3857。但是,您的数据框位于不同的 CRS 中。使用以下内容,参考手册 here:
ctx.add_basemap(ax, crs='epsg:4326', source=ctx.providers.Stamen.TonerLite)
请参考此link使用不同的来源,如Stamen.Toner
、Stamen.Terrain
等(Stamen.Terrain
为默认值)。
此外,您可以使用 df.to_crs()
将数据框转换为 EPSG:3857。在这种情况下,您应该跳过 ctx.add_basemap()
函数中的 crs
参数。