【发布时间】:2025-12-10 18:40:02
【问题描述】:
我按照switch2osm 的教程创建了一个切片服务器,但本教程仅适用于 apache 服务器。
我有一个 Django 服务器,想为它创建一个自定义地图。我已经安装了 Mapnik、PostGIS 并将 OSM 数据加载到我的 PostGIS 数据库中。
我创建了一个 python 脚本,它使用 Mapnik 创建一个简单的地图,代码如下:
#!/usr/bin/env python
import mapnik
stylesheet = 'database.xml'
image = 'database.png'
m = mapnik.Map(900, 450)
mapnik.load_map(m, stylesheet)
m.zoom_all()
mapnik.render_to_file(m, image)
print "rendered image to '%s'" % image
还有xml文件:
<Map background-color="steelblue" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
<Style name="My Style">
<Rule>
<PolygonSymbolizer fill="#f2eff9" />
<LineSymbolizer stroke="rgb(50%,50%,50%)" stroke-width="0.1" />
</Rule>
</Style>
<Layer name="countries" status="on" srs="+proj=latlong +datum=WGS84">
<StyleName>My Style</StyleName>
<Datasource>
<Parameter name="type">postgis</Parameter>
<Parameter name="host">localhost</Parameter>
<Parameter name="dbname">db</Parameter>
<Parameter name="user">user</Parameter>
<Parameter name="password"></Parameter>
<Parameter name="table">(SELECT * from planet_osm_line where highway is not null) as foo</Parameter>
<!-- <Parameter name="extent">-180,-90,180,89.99</Parameter> -->
<!-- <Parameter name="extent">-20037508.34,-20037508.34,20037508.34,20037508.34</Parameter> -->
</Datasource>
</Layer>
</Map>
这会生成以下图像(我只加载了这个 OSM 数据,而不是整个星球):
我正在考虑创建一个类似的东西来创建一个 Django 视图,该视图将提供我的地图图块,但处理时间太长(3 分钟)。
如何使用 Mapnik 通过 Django 创建图块服务器?是否有任何 Django 库可以使这更容易?
【问题讨论】:
-
您需要 django 来生成切片(=> 从 celery 运行 mapnik)还是只需要 django 来提供文件(=> 将它们放入 django 的媒体目录并完成)?
-
我只需要 Django 来提供磁贴,但我认为这些磁贴是动态生成的,因此它们不会占用太多磁盘空间。
-
切片是在切片服务器上动态生成的,但是存在两个瓶颈:切片生成时间和磁盘空间。通过修剪较少使用的切片来节省磁盘空间,并通过缓存处理生成时间。这也是为什么你可能会在地球上不那么经常访问的位置获得空的瓷砖,因为瓷砖生成是异步触发的。当然取决于实施。
-
但是是否有任何 Django 应用程序/库来帮助生成/缓存/服务这些图块?如果没有,这样做的最佳方法是什么?或者是保持我的 Django 服务器和 apache 服务这些图块的唯一简单方法?
标签: python django openstreetmap mapnik