如何在Matplotlib底图上使用OpenStreetMap背景

Iur*_*usa 8 gis openstreetmap python-2.7 matplotlib-basemap

这应该很简单,但是当我寻找它时,我只能找到Web包.我需要的东西比在这个博客上的导向更好.也许使用.oms文件或shapefile.某种方式给bbox并在Basemap地图上获取OpenStreetMap背景.

我在Stack上发现了一些像这样的问题,但答案指向或下载.pngOpenStreetMap网站上的文件,或使用一些网络包.

Phi*_*arz 10

我建议不要尝试做一些有用的工作,但这些工作还没有完成.有一种简单的方法可以通过Mplleaflet实现您的目标. https://github.com/jwass/mplleaflet 该库允许您在美丽的交互式openstreetmap上可视化地理数据.自动执行长lat格式的数据映射投影.

在windows和ubuntu中安装很简单:

pip install mplleaflet
Run Code Online (Sandbox Code Playgroud)

您可以从提供的示例开始,然后从那里开始.


Bar*_*art 8

对于那些使用 的人来说Cartopy,这相对简单:

import matplotlib.pyplot as pl
import numpy as np

import cartopy.crs as ccrs
import cartopy.io.img_tiles as cimgt

request = cimgt.OSM()

# Bounds: (lon_min, lon_max, lat_min, lat_max):
extent = [1, 13, 45, 53]

ax = pl.axes(projection=request.crs)
ax.set_extent(extent)
ax.add_image(request, 5)    # 5 = zoom level

# Just some random points/lines:
pl.scatter(4.92, 51.97, transform=ccrs.PlateCarree())
pl.plot([4.92, 9], [51.97, 47], transform=ccrs.PlateCarree())
Run Code Online (Sandbox Code Playgroud)

这会产生:

在此输入图像描述


Shi*_*iva 6

如今,有许多库可以为您做到这一点-smopyfoliumtilemapbase是我最近使用的三个示例。

这些工具中的每一个都从托管OSM或其他(Stamen,Carto等)地图瓦片的多个服务器之一中获取地图瓦片,然后允许您使用matplotlib在其上显示和绘图。Tilemapbase还会在本地缓存图块,以便下次不会再次获取它们。

但是,根据我最近的经验,似乎还没有现成的工具可以使用离线图块集(例如压缩的.mbtiles文件)作为matplotlib绘图的背景。

此链接包含对上述工具的调查以及更多内容-https://github.com/ispmarin/maps

编辑

我在先前的回答中提到,Tilemapbase无法在世界上某些地理位置使用,因此明确建议不要使用它。但是事实证明我错了,对此我深表歉意。实际上效果很好!在我的案例中,问题非常简单-我在获取图块时颠倒了顺序或纬度和经度,因此它总是在某些地理位置获取空白图块,这使我假设它不适用于那些位置。

我在github上提出了这个问题,开发人员立即解决了这个问题。在这里查看-https: //github.com/MatthewDaws/TileMapBase/issues/7

注意响应:

坐标应按(1)经度,(2)纬度的顺序提供。如果您是从Google地图复制的,则它们的纬度/经度顺序必须翻转。因此,您的地图图像不是空的,它只是挪威北部海洋中的一个位置。

从开发人员本人:

是的,当我编写代码时,似乎没有通用的订购标准。因此,我选择了与Google Maps不同的一种。方法名称from_lonlat应提示正确的顺序...


sca*_*cai 3

您可以自己从其中一台切片服务器下载必要的切片。OSM wiki 解释了滑动地图图块名称背后的技术细节,还包括各种编程和脚本语言的示例。

另请阅读磁贴使用政策,并记住不同的磁贴服务可能有不同的政策。