2

我正在geodjango上建立一个网站。在前端,我有一张关于 openlayers 的地图,我希望能够在一些 django url 上触发 ajax 查询并取回 geojson。

问题是标准的 django json 序列化程序不执行 geojson。所以我有一个模型:

class Asset (models.Model):
objects = models.GeoManager()

url_name = models.CharField(max_length=200)
name = models.CharField(max_length=200)
point = models.PointField(srid=4326)

def __unicode__(self):
    return self.name

我想创建一个视图:

def geojson_query(request):

#geographic query

...

assets = Asset.objects.all().filter(point__contained=bb_4326)
json = serializers.serialize("json", assets)
return HttpResponse(json)

但后来我得到了一个看起来更像这样的响应:

"url_name": "Upper_Svaneti", 
"name": "Upper Svaneti", 
"point": "POINT (43.0113899999999987 42.9163899999999998)"

而我想要看起来像这样的东西:

"url_name": "Upper_Svaneti", 
"name": "Upper Svaneti", 
"geometry": {
"type": "Point", 
"coordinates": [43.0113899999999987 42.9163899999999998]
}

所以我想我的问题是,在 django 中实现 geojson 序列化程序而不完全滚动我自己的最佳方法是什么?如果涉及到我自己的滚动,我从哪里开始?

4

2 回答 2

5

您需要编写自己的序列化程序。只需从 继承DjangoJSONEncoder,这是我创建的一个支持该Point类型的:

from django.core.serializers.json import DjangoJSONEncoder
from django.contrib.gis.geos import Point

class GeoJSONEncoder(DjangoJSONEncoder):
    def default(self, obj):
        if isinstance(obj, Point):
            return obj.coords
        return super(GeoJSONEncoder, self).default(obj)

然后你可以像这样使用它:

from my_app.serializers import GeoJSONEncoder
from django.utils import simplejson

json = simplejson.dumps(data, cls=GeoJSONEncoder)
于 2013-11-10T23:50:47.143 回答
1

所以...我做了一些不太漂亮的事情。我对序列化程序的非 geojson 部分进行了硬编码,并使用 GEOS 的 json 函数来获取 geojson 部分。

所以模型中的方法看起来像:

def get_footprint_json(self):
    geojson=self.footprint.json
    json='{"type": "Feature","geometry": %s,"properties": {"name":"%s","url_name":"%s"}}'%(geojson,self.name,self.url_name)
    return json

而且......我有一个看起来像这样的视图:

json='{ "srid":4326, "type": "FeatureCollection","features": ['+','.join([asset.get_footprint_json() for asset in assets])+'] }'
return HttpResponse(json)

我很想知道其他人是否有更好的方法,或者 django 是否更新了他们的序列化程序以包含 geojson。

于 2010-11-27T23:35:00.647 回答