我正在 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
Run Code Online (Sandbox Code Playgroud)
我想创建一个视图:
def geojson_query(request):
#geographic query
...
assets = Asset.objects.all().filter(point__contained=bb_4326)
json = serializers.serialize("json", assets)
return HttpResponse(json)
Run Code Online (Sandbox Code Playgroud)
但后来我得到了一个看起来更像这样的回应:
"url_name": "Upper_Svaneti",
"name": "Upper Svaneti",
"point": "POINT (43.0113899999999987 42.9163899999999998)"
Run Code Online (Sandbox Code Playgroud)
而我想要看起来像这样的东西:
"url_name": "Upper_Svaneti",
"name": "Upper Svaneti",
"geometry": {
"type": "Point",
"coordinates": [43.0113899999999987 42.9163899999999998]
}
Run Code Online (Sandbox Code Playgroud)
所以我想我的问题是,在 Django 中实现 geojson 序列化程序而不完全自己滚动的最佳方法是什么?如果涉及到我自己的滚动,我从哪里开始?
您需要编写自己的序列化程序。只是继承自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)
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
from my_app.serializers import GeoJSONEncoder
from django.utils import simplejson
json = simplejson.dumps(data, cls=GeoJSONEncoder)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3961 次 |
| 最近记录: |