Snippet/GeoDjango: objetos mais próximos a determinado Ponto
Recentemente precisei implementar um endpoint no Ishikawa (o backend da plataforma Dronemapp) que, dado um par de coordenadas geográficas P, me retornasse a lista de imagens cujas informações de geolocalização fossem mais próximas de P, em ordem de proximidade. E foi assim que cheguei nesse snippet que apresento agora.
Estamos usando, até a data dessa postagem, Django 1.10.
Mãos à obra!
Snippet
nearby_objects = queryset.annotate(distance=Distance(‘coordinates’, base_point)).order_by(‘distance’)
Explicação
"coordinates"
é o nome de uma coluna do tipo django.contrib.gis.db.models.PointField
no nosso modelo do Django.
base_point
são as coordenadas do Ponto “base”.
Para ordenar as fotos pela distância até as coordenadas informadas, primeiro “anotamos” a queryset com o cálculo de todas as distâncias. (É como se criássemos, dinamicamente, uma nova coluna chamada distance
e a preenchêssemos com os devidos valores). Depois, simplesmente ordenamos por essa “nova coluna” ( .order_by('distance')
).