使用Django返回GeoJson

7
我正在尝试返回一组坐标以在地图上绘制点/矩形。目前我正在使用Polymaps,但我考虑转向openlayers,因为它有更清晰的示例,适合像我这样的JavaScript新手。
我想发送一个包含每个坐标特定值的坐标列表。我还希望在同一JSON中发送许多坐标列表,每个列表都有另一个特定值(时间),以便我可以表示每个时间的不同点/多边形。
我已经能够使用json返回3个分离的列表,一个用于纬度,一个用于经度,另一个用于每个点的值。但是,openlayers和Polymaps在其示例中使用GeoJson,这似乎是更明智的选择。
问题是,我不知道如何使用Django生成geoJson响应。我找到了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>

你的代码有问题吗?还是你想知道如何将输出格式转换为 GeoJson - themanatuf
如果您查看http://polymaps.org/ex/cluster.html上的示例,它们直接从json中获取所有数据。因此,由于我在这里收到的是普通的json,我不知道如何做这个技巧。因此,我不知道这是我的问题,还是Polymaps专门为geoJson设计的。而且我不知道如何在django中生成geoJson。因此,如果我得到帮助,我可以接受这两个解决方案中的任何一个。 - Roman Rdgz
2个回答

13

首先,看一下geojson规范。那应该很清楚了如何设计你的数据结构。

但是你的方法有几个问题,基本上是编码错误。看看你的render_to_response方法。你传递的变量jsonObject是一个字典。在模板中,你尝试分配变量latitudeList,实际上它是jsonObject的一个key

这是我创建一个geojson对象以显示一些点几何体的示例,使用leaflet(一个值得你去了解的库)。

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))
在您的模板中,您可以像这样将您的对象分配给一个JavaScript变量。
var geojsonFeature = {{ geo_json|safe }}

什么是Vsoil?我没能找到任何关于这个名称的Python库的信息。 - Roman Rdgz
这是我的一个模型的名称。实际上,它是一个基本的数据库查询。ModelName.objects.xxx - LarsVegas

0

正确的方法是编写一个序列化器,返回地理要素模型。

from rest_framework_gis.serializers import GeoFeatureModelSerializer
from . models import YourModel

class YourModelSerializer(GeoFeatureModelSerializer):
    class Meta:
        model = YourModel
        fields = "__all__"
        geo_field = "point"

然后在视图中,您可以使用ModelViewSet:

class YourModelViewset(viewsets.ModelViewSet):
    serializer_class = YourModelSerializer
    queryset = YourModel.objects.all()

您可以参考 GeoDjango 获取更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接