Snippet/GeoDjango: objetos mais próximos a determinado Ponto

Cléber Zavadniak
clebertech
Published in
1 min readMar 11, 2017

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') ).

--

--