django json сериализатор не реализует геойсон - PullRequest
2 голосов
/ 20 ноября 2010

Я нахожусь в процессе создания сайта о геоджанго. На переднем крае у меня есть карта открытых слоев, и я хочу иметь возможность запускать 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 ]

4 голосов
/ 11 ноября 2013

Вам нужно написать свой собственный сериализатор.Просто наследуйте от 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 голос
/ 13 января 2011

См. Ответ на этот вопрос.
Визуализация пространственных данных GeoQuerySet в пользовательском представлении GeoDjango

Вы также можете посмотреть на метод render_to_geojson в этом проекте.http://geodjango -basic-apps.googlecode.com /

1 голос
/ 28 ноября 2010

Итак ... Я сделал что-то немного неуместное. Я жестко закодировал негеойсонские части сериализатора и использовал функцию 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 обновил свой сериализатор, добавив в него геойсон.

...