2016-03-26 5 views
1

GeoDjangoを使用して近くの会場でギグを検索する小さなアプリケーションに取り組んでいます。ここに私のmodels.pyです:今、私はそれが検索を行うために得ることができた、と私は地図上にレンダリングするためににGeoJSONに応答をシリアル化する必要があるようにそれは私には見えますGeoDjangoで関連するフィールドを取得する

from django.contrib.gis.db import models 

class Venue(models.Model): 
    """ 
    Model for a venue 
    """ 
    name = models.CharField(max_length=200) 
    location = models.PointField() 

    def __str__(self): 
     return self.name 


class Event(models.Model): 
    """ 
    Model for an event 
    """ 
    name = models.CharField(max_length=200) 
    datetime = models.DateTimeField() 
    venue = models.ForeignKey(Venue) 

    def __str__(self): 
     return "%s - %s" % (self.name, self.venue.name) 

。しかし、私はそれを完了するために苦労しています。ここにあります私の現在のviews.py

from django.shortcuts import render_to_response 
from django.views.generic.edit import FormView 
from gigs.forms import LookupForm 
from gigs.models import Event 
from django.utils import timezone 
from django.contrib.gis.geos import Point 
from django.contrib.gis.db.models.functions import Distance 
from django.template import RequestContext 

class LookupView(FormView): 
    form_class = LookupForm 

    def get(self, request): 
     return render_to_response('gigs/lookup.html', RequestContext(request)) 

    def form_valid(self, form): 
     # Get data 
     latitude = form.cleaned_data['latitude'] 
     longitude = form.cleaned_data['longitude'] 

     # Get next week's date 
     next_week = timezone.now() + timezone.timedelta(weeks=1) 

     # Get Point 
     location = Point(latitude, longitude, srid=4326) 

     # Look up events 
     events = Event.objects.filter(datetime__lte=next_week).annotate(distance=Distance('venue__location', location)).order_by('distance')[0:5] 

     # Render the template 
     return render_to_response('gigs/lookupresults.html', { 
      'events': events 
      }) 

私はイベントを取得した後、私はブレークポイントを挿入した場合:

ipdb> from gigs.models import Venue 
ipdb> from django.core.serializers import serialize 
ipdb> venues = Venue.objects.all() 
ipdb> serialize('geojson', venues, geometry_field='location', fields=('name',)) 
'{"type": "FeatureCollection", "crs": {"type": "name", "properties": {"name": "EPSG:4326"}}, "features": [{"type": "Feature", "geometry": {"type": "Point", "coordinates": [77.13845850820013, 88.27032065635657]}, "properties": {"name": "Venue1"}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [-144.48274402224723, -35.87841402981486]}, "properties": {"name": "Venue2"}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [15.249714163005194, -39.942840871151624]}, "properties": {"name": "Venue3"}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [-63.376261279235095, -6.222101297964656]}, "properties": {"name": "Venue4"}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [153.29028611820962, -4.285826286375041]}, "properties": {"name": "Venue5"}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [-146.08227004805758, 42.4843671723977]}, "properties": {"name": "Venue6"}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [149.6004493621263, 34.740389078323844]}, "properties": {"name": "Venue7"}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [-144.38342519084884, -55.55425529324768]}, "properties": {"name": "Venue8"}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [83.32120247931198, 48.78215628903402]}, "properties": {"name": "Venue9"}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [-28.108531225500826, 35.50271671578547]}, "properties": {"name": "Venue10"}}]}' 
ipdb> serialize('geojson', events, geometry_field='venue__location', fields=('name',)) 
'{"type": "FeatureCollection", "crs": {"type": "name", "properties": {"name": "EPSG:4326"}}, "features": [{"type": "Feature", "geometry": null, "properties": {"name": "Event3"}}, {"type": "Feature", "geometry": null, "properties": {"name": "Event9"}}, {"type": "Feature", "geometry": null, "properties": {"name": "Event10"}}, {"type": "Feature", "geometry": null, "properties": {"name": "Event1"}}, {"type": "Feature", "geometry": null, "properties": {"name": "Event7"}}]}' 

私は会場のリストの場所を得ることができますが、ために動作するようには思えません会場の場所をEventモデルから取得しています。

どこが間違っていたのですか?

+0

Djangoのシリアライザは、関連するオブジェクトのシリアライズをサポートしていません。 django-rest-frameworkを使って、それに対応するGIS拡張django-rest-framework-gisを使うことも考えられます。 – yellowcap

答えて

1

これは遅すぎるとは限りませんが、マップにレンダリングするためにGeoJSONにシリアル化する必要はありません。あなたが望むならそれを使うことができますが、他にもたくさんの方法があります。

たとえば、各要素が緯度と経度のペアであるJSON配列を作成し、javascriptで繰り返し処理してマップに追加することができます。

関連する問題