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

时间:2015-06-19 14:58:37

标签: python django openstreetmap mapnik

我按照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数据,而不是整个星球):

Map image

我正在考虑创建一个像这样的东西来创建一个可以提供我的地图图块的Django视图,但是处理时间太长(3分钟)。

如何使用Mapnik创建一个平铺服务器Django?是否有任何Django库可以让这更容易?

1 个答案:

答案 0 :(得分:3)

我猜你混合了两个完全独立的东西:

Django服务

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

平铺地图服务

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

这个平铺如何在您的django前端代码链接为Leaflet / OpenLayers / ...层。没有更多:)