在 Django 中创建 OSM 地图切片服务器

Creating a OSM map tiles server in Django

我按照 switch2osm 中的教程创建了一个 tiles 服务器,但本教程仅适用于 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 服务

这是您的部分,您可以在专用用例上创建各种逻辑、模型、视图等。例如,您编写一个平台来标记地图上有趣的地方,您可以在其中使用 djangos geoapp (fka.geodjango) 来嵌入地理空间魔法等

瓦片地图服务

这就是(独立!)创建可以被任何其他应用程序使用的地图图块(桌面 gis...JS webmap 小部件)。通常人们使用 existing tile-providers 来免费获得地图,而无需任何自己的工作。仅当您需要创建自己的自定义地图样式时,您才需要托管自己的图块渲染堆栈,如 www.switch2osm.org 中所述。无论如何,强烈建议遵循本指南并依靠现有工具(mapnik、postgis 等)来避免很多麻烦。在开始您自己的服务之前,请牢记硬件和服务要求(覆盖范围、可靠性、更新频率……)!

这平铺如何在您的 django 前端代码中链接为 Leaflet/OpenLayers/... 层。仅此而已:)