/ / Django model property geo distance - django

Django model property geo distance - django

Sto cercando di implementare una ricerca di prossimità basata su latitudine e longitudine usando Django e Postgresql. Ecco la versione astratta del modello che ho.

class Item(models.Model):
"""docstring for Item"""
uuid = UUIDField(primary_key=True, auto=True)
name = models.CharField(_("name"), max_length=200)
address = models.CharField(_("street address"), max_length=255, blank=True, null=True)
location = models.CharField(_("location"), max_length=40, blank=True, null=True)

@property
def geo_distance(self, location=None):
if location is not None:
cursor = connection.cursor()
cursor.execute("SELECT geo_distance(CAST("%s")) AS POINT, CAST("%s") AS POINT)" %
self.location, location)
return round(float(cursor.fetchone() * 1.621371192237), 2)

Voglio essere in grado di fare qualcosa di simile in views.py:

items = Item.objects.filter(name__istartwith="Anything")
results = []
for item in items:
results.append({
"name": item.name,
"distance": item.geo_distance("(11.23123, -12.123213)")
})

Mi rendo conto che questo non è l'approccio migliore. Qualsiasi suggerimento benvenuto.

risposte:

2 per risposta № 1

Se tu effettui una ricerca basata su latitudine e longitudine ti consiglierei GeoDjango. Per calcolare la distanza tra un punto due o l'area circostante dal punto X è possibile utilizzare Formula di Haversine. È meglio scrivere il calcolo della distanza usando procedura. Per quanto ne so, Django non supporta la creazioneprocedure, ho fatto alcuni punti di riferimento in termini di calcolo della distanza, ho trovato le procedure per essere più veloce piuttosto che calcolare sulla fine del django. In bocca al lupo.


1 per risposta № 2

Bene, il tuo codice non è orribile. Immagino che tu ti preoccupi delle prestazioni a causa dell'esecuzione item.geo_distance () all'interno di una per iterazione? Non importa, questo dovrà essere calcolato in qualsiasi momento. La soluzione è ok, ma qui ci sono alcuni altri suggerimenti:

  • Usa geopy (o geodjango)
  • Assicurati di filtrare i tuoi dati alla fonte (database).

Per quanto riguarda il secondo punto, filtrare i dati. Vedo che stai filtrando sul nome, il che significa che non stai usando la distanza per filtrare. Se si desidera utilizzare la distanza da un punto come filtro (ad esempio, nient'altro che 40 miglia), si avranno alcuni nuovi problemi a cui possono essere utili geode e geodjango. La soluzione comune qui è di approssimare la distanza (in un quadrato), filtrare i dati in base a questa approssimazione e quindi calcolare la distanza esatta.