django json сериализатор не реализует геойсон
Я нахожусь в процессе создания сайта о геоджанго. На переднем крае у меня есть карта на openlayers, и я хочу иметь возможность запускать ajax-запросы по некоторому URL-адресу django и возвращать 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]
}
Поэтому я думаю, что мой вопрос заключается в том, каков наилучший способ реализации сериализатора geojson в django без необходимости использовать мой собственный? И если речь идет о том, чтобы кататься самостоятельно, с чего мне начать?
3 ответа
Смотрите ответ на этот вопрос.
Визуализация пространственных данных GeoQuerySet в пользовательском представлении GeoDjango
Вы также можете посмотреть на метод render_to_geojson в этом проекте. http://geodjango-basic-apps.googlecode.com/
Вам нужно написать свой собственный сериализатор. Просто наследуй от 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)
Итак... Я сделал что-то немного не по себе. Я жестко закодировал негеойсонские части сериализатора и использовал функцию json из GEOS, чтобы получить геоджоновскую часть.
Таким образом, метод в модели выглядит так:
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.