2017-06-19 7 views
2

Ich versuche mit Geodjango den nächsten Punkt zu einem Ort zu finden.So finden Sie den nächsten Punkt vom Benutzerstandort mit geodjango?

Ich habe versucht, mit dem folgenden Code:

LocationInfo.objects.filter(coordinates__distance_lte=(user_location, D(km=2))) 

aber es funktioniert nur, wenn die Position innerhalb der angegebenen Entfernung (D(km=2) in diesem Fall) ist.

Ich muss den Punkt finden, der dem Benutzer am nächsten ist, ohne irgendein Limit während der Abfrage zu verwenden.

Antwort

1

Nehmen wir an, dass Ihr LocationInfo hat es Feldgeometrie position genannt:

Für Django Version> = 1.9:

Sie die Distance() Funktion verwenden können:

from django.contrib.gis.db.models.functions import Distance 

LocationInfo.objects.annotate(
    distance=Distance('position', user_location) 
).order_by('distance').first() 

, die zurück das nächste Objekt zum user_location

Für Django 1.6 < = Version < 1,9:

LocationInfo.objects.distance(user_location).order_by('distance').first() 

Für Django Version < 1.6:

Die .first() Methode nicht vorhanden so

Sie die .distance() Methode verwenden können müssen die erste der geordneten Abfrage wie folgt erhalten:

LocationInfo.objects.distance(user_location).order_by('distance')[:1].get() 
+0

ich folgende Fehlermeldung bin vor: Typeerror: __init __() nimmt höchstens 2 Argumente (3 gegeben) zum Ausprobieren des obigen Codes – sam23

+0

Ich verwende Django 1.11 im Projekt. – sam23

+0

Haben Sie 'Distance' so importiert:' from django.contrib.gis.db.models.functions import Distance'? –

0

Dies gibt Ihnen die nächstgelegenen Standort Info:

LocationInfo.geo_objects.distance(user_location).order_by('distance')[0] 

wo geo_objects für LocationInfo Modell-Manager ist

from django.contrib.gis.db import models as gis_models 

class LocationInfo(models.Model): 

    geo_objects = gis_models.GeoManager() 
Verwandte Themen