2016-12-03 4 views
3

Mein models.py hat Benutzer und Geschäftsmodelle, die dieses Feld haben:GeoDjango & SpatiaLite - Filterung in der Nähe Objekte

location = PointField(geography=True) 

Ich erhalte Google Maps-Koordinaten (in EPSG 4326) über Geocode Service von einer Adresse, die der Benutzer gibt an.
Dann speichere ich es im obigen Feld (auch EPSG 4326).

Nun, was ich will, ist alle Business-Objekte innerhalb eines bestimmten Radius zu erhalten (von 1 km zum Beispiel), basierend auf dem Standort des Nutzers:

Business.gis.filter(location__distance_lt=(request.user.location, D(km=1))) 

Aber es funktioniert nicht, es gibt mir diese Fehler:

ValueError: SpatiaLite does not support distance queries on geometry fields with a geodetic coordinate system. Distance objects; use a numeric value of your distance in degrees instead.

Also weiß jemand, wie man das richtig löst? Danke im Voraus!

+0

I Umwandlung in projizierten System zurückgegriffen, bevor Abfrage zu tun. Es funktioniert so, obwohl es nicht so präzise ist, aber es ist kein Problem. – MikiSoft

+0

Hey @MikiSoft, ich habe ein bisschen eine späte Antwort gepostet, guck mal rein. –

+0

@JohnMoutafis Hey, ich habe es vor langer Zeit in der Weise gelöst, wie ich oben beschrieben habe, aber ich habe deine Antwort dennoch als Lösung markiert, um dir für die Mühe zu danken. :) – MikiSoft

Antwort

0

Theorie:

Dies ist eine ziemlich obskure Fehler auf diese beiden bezogen werden:

Da Sie Systeme geodätischen Koordinaten verwenden (wie die EPSG 4326) müssen Sie geben Sie den Abstand in Grad an.

Hier ist eine sehr gute Erklärung, wie man Grad verwandeln km genau genug: How do I convert kilometres to degrees in Geodjango/GEOS?

Schließlich würde ich vorschlagen, die dwithin zu verwenden.


Praxis:

  • 1km ~= 0.008 deg
  • Die Abfrage sollte nun so aussehen:

    Business.gis.filter(location__dwithin=(request.user.location, 0.008))