2010-11-20 58 views
1

我正在geodjango上建立一个网站的过程。在前端,我有一个关于openlayers的地图,我希望能够在某个django url上触发ajax查询并返回geojson。django json序列化程序没有实现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序列化程序的最佳方式是什么,而不是完全滚动我自己的?如果要滚动我自己,我该从哪里开始?

回答

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。

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) 
相关问题