我正在建设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序列化器的最佳方法是什么,而不是完全自己滚动?如果要自己动手,我该从哪里开始?
答案 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/