直到上周,我已经能够使用python smopy 软件包https://pypi.org/project/smopy/在python程序中显示从openstreetmap https://www.openstreetmap.org/#map=4/-28.15/133.29获取的地图图块。 但是自上周以来,由于某种奇怪的原因,smopy一直失败,并出现以下错误:
Traceback (most recent call last):
File "/home/pi/Python Learning/smopyTest.py", line 7, in <module>
m = smopy.Map((-36.5,-150.0), z=0)
File "/home/pi/Python Learning/smopy.py", line 291, in __init__
self.fetch()
File "/home/pi/Python Learning/smopy.py", line 323, in fetch
self.img = fetch_map(self.box_tile, self.z)
File "/home/pi/Python Learning/smopy.py", line 64, in fetch_map
img.paste(fetch_tile(x, y, z), (px, py))
File "/home/pi/Python Learning/smopy.py", line 44, in fetch_tile
png = BytesIO(urlopen(url).read())
File "/usr/lib/python3.6/urllib/request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.6/urllib/request.py", line 532, in open
response = meth(req, response)
File "/usr/lib/python3.6/urllib/request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python3.6/urllib/request.py", line 570, in error
return self._call_chain(*args)
File "/usr/lib/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "/usr/lib/python3.6/urllib/request.py", line 650, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 429: Too Many Requests
我在堆栈溢出中注意到,许多人在尝试访问其他网站时遇到相同的HTTP错误。答案建议在发出多个请求之前要等待一段时间。等等。当我检查smopy.py的代码时,它已经具有将图块数量限制为16的保护,以确保不违反图块访问策略。
即使我将请求的地图的缩放级别更改为z = 0(应该仅下载一个地图图块),我也会遇到相同的错误。因此,这使我感到困惑,为什么我会收到过多的请求错误。
我尝试开发的python应用程序将在地图上显示许多固定和移动传感器。因此,一旦地图加载完毕,它基本上保持不变。仅在偶尔情况下,如果一个或多个传感器移出地图区域,则应用程序将不得不重新加载地图以尝试使所有传感器处于可见状态。
我发现以下网站显示了一些备用磁贴服务器: https://wiki.openstreetmap.org/wiki/Tile_servers。
我尝试通过替换行来修改smopy.py模块
TILE_SERVER =“ https://tile.openstreetmap.org/ {z} / {x} / {y} .png”
通过
TILE_SERVER =“ http://c.tile.stamen.com/watercolor/ {z} / {x} / {y} .jpg”
或
TILE_SERVER =“ https://maps.wikimedia.org/osm-intl/ {z} / {x} / {y} .png。”
在这两种情况下,地图均按预期显示。
因此,这向我暗示,这是与从openstreetmap.org访问图块特别相关的限制,而不是smopy特有的问题。
对于我的应用程序来说,雄蕊的水彩图不适合使用,维基媒体服务器说这是一个实验性的图;所以我不确定我是否可以依靠它。
因此,有人可以告诉我正确的方法来访问openstreetmap以在带有smopy或其他类似软件包的python程序中显示地图吗?
我在下面显示了用于显示地图的最少代码。我正在Ubuntu 18.04上运行此代码。无论是在IDLE还是Thonny中运行,我都会遇到相同的错误。
import matplotlib.pyplot as plt
import smopy
plt.ion()
fig, ax = plt.subplots(figsize=(8,8))
m = smopy.Map((-36.5,-150.0), z=0)
m.show_mpl(ax = ax)
plt.draw()