2013-05-22 5 views
2

Я пытаюсь вернуть набор координат, чтобы нарисовать точки/прямоугольники над картой. В настоящее время я использую Polymaps, но я думаю о переходе к openlayers, у которого есть примеры, более понятные для новичка javascript, подобного мне.Возвращение GeoJson с Django

Я хочу отправить список координат плюс определенное значение для каждого из них. И я также ищу отправку многих списков координат в том же json, каждый с другим определенным значением (время), поэтому я могу представлять разные точки/многоугольники по карте за каждый раз.

Я смог вернуть 3 отдельных списка с помощью json, один для широты, один для долготы и еще один со значением для каждой точки. Но оба openlayers и Polymaps используют GeoJson на своих примерах, что выглядит более разумным выбором.

Проблема в том, что я не знаю, как сгенерировать ответ geoJson с Django. Я нашел django-geojson, но нет ясного примера, чтобы делать то, что я хочу, и, конечно, не возвращать много наборов для разных времен.

Любая помощь? Я также могу принять, как это сделать, только с Json.

Что я сейчас:

#views.py 

from django.shortcuts import render_to_response 
from django.template import RequestContext 
import myproject.databasework as databaseWork 
import json 

def values(request): 
    gpsTime = 1043366400 
    pls = databaseWork.getValues(gpsTime) 
    latitudes = [] 
    longitudes = [] 
    values = [] 

    for row in pls: 
     pointId = row[0] 
     value = row[2] 
     lat, lon = databaseWork.getCoords(pointId) 
     latitudes.append(lat) 
     longitudes.append(lon) 
     values.append(value) 

    jsonObject = {'latitudeList': json.dumps(latitudes), 
        'longitudeList': json.dumps(longitudes), 
        'valuesList': json.dumps(values)} 
    return render_to_response('mytemplate.html', jsonObject, context_instance=RequestContext(request)) 

И это часть HTML:

<script type="text/javascript"> 
     var po = org.polymaps; 
     var map = po.map() 
      .container(document.getElementById("map").appendChild(po.svg("svg"))) 
      .add(po.interact()) 
      .center({lat: 46, lon: 10}) 
      .zoom(4); 

     var svg = document.querySelector("svg.map"); 
     svg.setAttribute("width", "100%"); 
     svg.setAttribute("height", "100%"); 
     map.resize(); 

     map.add(po.image() 
      .url(po.url("http://{S}tile.cloudmade.com" 
      + "/1a1b06b230af4efdbb989ea99e9841af" // http://cloudmade.com/register 
      + "/20760/256/{Z}/{X}/{Y}.png") 
      .hosts(["a.", "b.", "c.", ""]))); 



     // Get values from django response 
     var latitude = "{{ latitudeList }}"; 
     var longitude = "{{ longitudeList }}"; 
     var vpl = "{{ vplList }}"; 

     // Draw circles 
     // Don't know how to do it with Polymaps yet. Example at http://polymaps.org/ex/cluster.html 

    </script> 
+0

ли то, что вы не работаете или вы конкретно с вопросом, как получить выход в 'формате GeoJson'? – themanatuf

+0

@themanatuf Если вы посмотрите пример на http://polymaps.org/ex/cluster.html, они напрямую берут все данные из json. Итак, поскольку я получаю его в обычном json здесь, я не знаю, как сделать трюк. Поэтому я не знаю, является ли это моя ошибка здесь, или что Polymaps специально разработан для geoJson. И я не знаю, как создать geoJson в django. Поэтому я могу принять любое из этих двух решений, если получаю помощь –

ответ

8

Прежде всего взглянуть на the geojson spec. Это должно четко понять, как создать структуру данных.

Но в вашем подходе есть несколько ошибок, в основном ошибки кодирования. Посмотрите на свой метод render_to_response. Вы передаете переменную jsonObject, которая является dict. В шаблоне вы пытаетесь присвоить переменную latitudeList, которая на самом деле является key из jsonObject.

Вот пример того, как я создаю объект geojson для отображения некоторых геометрий точек с помощью листовки (библиотека, заслуживающая проверки для вас).

lati = Vsoil.objects.values_list('latitude',flat=True) 
longi = Vsoil.objects.values_list('longitude',flat=True) 
ids = Vsoil.objects.values_list('id',flat=True) 

geo_json = [ {"type": "Feature", 
        "properties": { 
         "id": ident, 
         "popupContent": "id=%s" % (ident,) 
         }, 
        "geometry": { 
         "type": "Point", 
         "coordinates": [lon,lat] }} 
        for ident,lon,lat in zip(ids,longi,lati) ] 


return render_to_response('map.html', 
          {'geo_json': geo_json}, 
          context_instance=RequestContext(request)) 

В шаблоне вы можете просто присвоить объект переменной Js как этот

var geojsonFeature = {{ geo_json|safe }} 
+0

Что такое Vsoil? Я не смог найти никакой информации о какой-либо библиотеке python с именем taht. –

+0

Это имя моей модели. Это базовый запрос базы данных. 'ModelName.objects.xxx' – LarsVegas

Смежные вопросы