我有一个带有ansible provisioning脚本的Vagrant环境,它带来了一个新的Ubuntu16.04服务器,它使用Mapnik + Postgis + TileStache + uWSGI + Nginx来提供地图切片。
半年前,一切都很好。现在,在启动了Vagrant容器之后,配置步骤工作正常,所有的osm2pgsql导入都工作了,我的TileStache发出了问候声,这向我表明nginx -> uwsgi -> tilestache正在工作。
我已经试过测试PIL/pillow是否正常工作。像下面这样的简单脚本是完全有效的:
from PIL import Image
import io
with open('test.png') as f:
io = io.BytesIO(f.read())
im = Image.open(io)我的tilestache配置:
{
"cache": {
"name": "Disk",
"path": "./cache/",
"umask": "0000"
},
"layers": {
"osm_layer": {
"provider": {
"name": "proxy",
"url": "http://tile.openstreetmap.org/{Z}/{X}/{Y}.png"
}
}
}
}但是,当我尝试访问像http://localhost/osm_layer/0/0/0.png这样的磁贴图像时,它不起作用。通常情况下,这应该会返回与http://tile.openstreetmap.org/0/0/0.png相同的磁贴
我在我的日志文件中得到以下错误:
Jun 26 09:07:16 gis uwsgi[31478]: Traceback (most recent call last):
Jun 26 09:07:16 gis uwsgi[31478]: File "/usr/lib/python2.7/dist-packages/TileStache/__init__.py", line 379, in __call__
Jun 26 09:07:16 gis uwsgi[31478]: status_code, headers, content = requestHandler2(self.config, path_info, query_string, script_name)
Jun 26 09:07:16 gis uwsgi[31478]: File "/usr/lib/python2.7/dist-packages/TileStache/__init__.py", line 255, in requestHandler2
Jun 26 09:07:16 gis uwsgi[31478]: status_code, headers, content = layer.getTileResponse(coord, extension)
Jun 26 09:07:16 gis uwsgi[31478]: File "/usr/lib/python2.7/dist-packages/TileStache/Core.py", line 414, in getTileResponse
Jun 26 09:07:16 gis uwsgi[31478]: tile = self.render(coord, format)
Jun 26 09:07:16 gis uwsgi[31478]: File "/usr/lib/python2.7/dist-packages/TileStache/Core.py", line 500, in render
Jun 26 09:07:16 gis uwsgi[31478]: tile = provider.renderTile(width, height, srs, coord)
Jun 26 09:07:16 gis uwsgi[31478]: File "/usr/lib/python2.7/dist-packages/TileStache/Providers.py", line 250, in renderTile
Jun 26 09:07:16 gis uwsgi[31478]: tile = Verbatim(body)
Jun 26 09:07:16 gis uwsgi[31478]: File "/usr/lib/python2.7/dist-packages/TileStache/Providers.py", line 164, in __init__
Jun 26 09:07:16 gis uwsgi[31478]: self.format = self.image().format
Jun 26 09:07:16 gis uwsgi[31478]: File "/usr/lib/python2.7/dist-packages/TileStache/Providers.py", line 170, in image
Jun 26 09:07:16 gis uwsgi[31478]: self._image = Image.open(self.buffer)
Jun 26 09:07:16 gis uwsgi[31478]: File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 2295, in open
Jun 26 09:07:16 gis uwsgi[31478]: % (filename if filename else fp))
Jun 26 09:07:16 gis uwsgi[31478]: IOError: cannot identify image file <StringIO.StringIO instance at 0x7f513b7f5a28>
Jun 26 09:07:16 gis uwsgi[31478]: [pid: 31484|app: 0|req: 3/6] 192.168.20.1 () {42 vars in 681 bytes} [Wed Jun 26 09:07:16 2019] GET /osm_layer/0/0/0.png => generated 0 bytes in 138 msecs (HTTP/2.0 500) 0 headers in 0 bytes (0 switches on core 0)似乎相应的包、图像文件或PIL/pillow包都有问题,因为为了重现错误,只使用代理OSM磁贴就足够了。目前不涉及矢量导入或postgres。这些.png磁贴代理到http://tile.openstreetmap.org/{Z}/{X}/{Y} OSM磁贴
我还可以看到tilestache创建了缓存目录结构,但是因为有IOError,所以没有缓存实际的tile/image。
发布于 2019-10-08 15:47:21
我发现,这不是枕头的问题。相反,我正在使用的当前版本(tilestache==1.51.14)缺少用户代理,TileStache不会接受这一点。为了完整性,您还应该传递一个引用(https://wiki.openstreetmap.org/wiki/DE:Tile_usage_policy)
有关详细信息,请参阅https://github.com/TileStache/TileStache/issues/360。
解决方法: /usr/local/lib/python2.7/dist-packages/TileStache/Providers.py中的将用户代理添加到renderTile函数
添加到Providers.py (tilestache==1.51.14)的第262行:
url_opener.addheaders = [('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3'), ('Referer', 'https://example.com/')]我是通过pip而不是apt安装的,所以我的tilestache文件位于: /usr/local/lib/python2.7/dist-packages/TileStache/
在此目录中,您应该重新编译并重新启动tilestache:
$ sudo python -m compileall .
$ sudo service tilestache restarthttps://stackoverflow.com/questions/56772145
复制相似问题