2010-11-20 29 views
1

Je suis en train de construire un site web sur geodjango. Sur le front-end, j'ai une carte sur les openlayers et je veux être capable de lancer des requêtes ajax sur une URL de django et de revenir sur geojson.django json serializer n'implémente pas geojson

Le problème est que le sérialiseur django json standard ne fait pas geojson. J'ai donc un modèle comme:

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 

Et je veux créer une vue:

def geojson_query(request): 

#geographic query 

... 

assets = Asset.objects.all().filter(point__contained=bb_4326) 
json = serializers.serialize("json", assets) 
return HttpResponse(json) 

Mais je reviens une réponse qui ressemble plus à ceci:

"url_name": "Upper_Svaneti", 
"name": "Upper Svaneti", 
"point": "POINT (43.0113899999999987 42.9163899999999998)" 

Alors que Je veux quelque chose qui ressemble à ceci:

"url_name": "Upper_Svaneti", 
"name": "Upper Svaneti", 
"geometry": { 
"type": "Point", 
"coordinates": [43.0113899999999987 42.9163899999999998] 
} 

Donc, je suppose que ma question est, quelle est la meilleure façon d'implémenter un sérialiseur geojson dans django sans rouler totalement mon propre? Et s'il s'agit de lancer le mien, par où commencer?

Répondre

1

Alors ... J'ai fait quelque chose de légèrement insignifiant. J'ai codé en dur les parties non-geojson du sérialiseur et utilisé la fonction json de GEOS pour obtenir la partie geojson.

Ainsi la méthode dans le modèle ressemble à:

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 

Et ... J'ai une vue qui ressemble à ceci:

json='{ "srid":4326, "type": "FeatureCollection","features": ['+','.join([asset.get_footprint_json() for asset in assets])+'] }' 
return HttpResponse(json) 

Je serais curieux de voir si quelqu'un d'autre a un meilleur moyen ou si django a mis à jour leur sérialiseur pour inclure geojson.

3

Vous devez écrire votre propre sérialiseur. Juste héritent de la DjangoJSONEncoder, voici une que j'ai créé qui prend en charge le type 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) 

Vous pouvez alors l'utiliser comme ceci:

from my_app.serializers import GeoJSONEncoder 
from django.utils import simplejson 

json = simplejson.dumps(data, cls=GeoJSONEncoder)