2015-06-19 51 views
1

我按照switch2osm的教程創建了切片服務器,但本教程僅適用於Apache服務器。在Django中創建OSM地圖切片服務器

我有一個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一起創建tile服務器?有沒有任何Django庫使這更容易?

+0

您是否需要django來生成tile(=從celery運行mapnik)或者您只需要django來爲文件提供服務(=>將它們放到django的媒體目錄中並完成它)? – dhke

+0

我只需要Django來提供拼貼,但我認爲這些拼貼是動態生成的,所以它們不會佔用太多的磁盤空間。 –

+0

瓷磚在瓦片服務器上動態生成,但存在兩個瓶頸:瓦片生成時間和磁盤空間。通過修剪較少使用的磁貼來節省磁盤空間,並通過緩存處理生成時間。這也是爲什麼你可能在地球上不常被訪問的地方得到空瓷磚,這是因爲瓷磚生成是異步觸發的。當然取決於實施。 – dhke

回答

2

我猜你混了兩個完整的影響無關的事情:

Django的服務

這是你的一部分,在那裏你創造各種邏輯,模型,視圖等在專用的用例。例如你的代碼的plattform標記的地圖,在這裏你可以使用djangos geoapp(FKA。GeoDjango內置)上有趣的地方,以使嵌入地理空間魔術等

瓦片地圖服務

這是(independly!)創建地圖可以被任何其他應用程序使用的圖塊(桌面gis ... JS webmap小部件)。通常人們使用existing tile-providers來獲取地圖,沒有任何自己的工作和免費。只有當您需要創建自己的自定義地圖樣式時,您需要託管自己的平鋪渲染堆棧,如www.switch2osm.org中所述。無論如何,強烈建議遵循本指南並依靠現有工具(mapnik,postgis,...)來避免很多麻煩。請在開始自己的服務之前記住硬件和服務要求(磁貼覆蓋範圍,可靠性,更新頻率等)!

這個瓷磚如何在您的django前端代碼中作爲Leaflet/OpenLayers /圖層進行鏈接。沒有更多:)

+0

我可以向現有的瓷磚供應商添加額外的數據嗎?例如,如果我的PostGIS數據庫中存在人行道狀況信息,是否可以在使用此信息顯示更完整的地圖時使用此地圖提供程序(例如用不同顏色爲某些人行道着色)? –

+0

當然!你只需添加一個新的圖層(也許通過WMS的柵格或矢量,例如geoJSON)到你的JS小部件。如果你願意,這個源代碼可以是你的Django服務(參見[Django REST框架GIS](https://github.com/djangonauts/django-rest-framework-gis)),只需幾行代碼即可。 – MaM

+0

我已經在使用Django REST框架GIS來提供我的JSON信息在GeoModelSerializer中使用'GeoFeatureModelSerializer'到地圖上的新圖層會更容易嗎?你知道在使用Android的'OSMdroid'(或者在Android中使用OSM地圖圖塊的另一個庫)是否很容易添加新圖層嗎?感謝您的幫助! –