django json序列化程序没有实现geojson

时间:2010-11-20 19:27:37

标签: django geodjango

我正在建设geodjango网站。在前端我有一个关于openlayers的地图,我希望能够在某些django网址上发出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序列化器的最佳方法是什么,而不是完全自己滚动?如果要自己动手,我该从哪里开始?

3 个答案:

答案 0 :(得分:3)

您需要编写自己的序列化程序。只需继承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)

答案 1 :(得分: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。

答案 2 :(得分:1)

请参阅此问题的答案 Rendering spatial data of GeoQuerySet in a custom view on GeoDjango

您还可以查看此项目中的render_to_geojson方法。 http://geodjango-basic-apps.googlecode.com/