Suite

La recherche de distance GeoDjango/PostGIS ne fonctionne pas


Je construis une API pour effectuer des recherches à distance en utilisant Django 1.8, GeoDjango, Django REST Framework et PostGIS.

Localement, j'utilise PostGIS 2.1.7, mon hôte (PythonAnywhere) utilise 2.1.4… Je ne suis pas en mesure d'installer une version antérieure localement (pas si fort avec la création et l'installation).

Le problème est que localement une requête api comme http://localhost:8000/v1/test-entries/8.5513076999999988%2055.6684179999999955/ ne renvoie rien, comme il se doit. Mais faire la même demande (en utilisant les mêmes coordonnées) sur la version live sur PythonAnywhere renvoie toutes les entrées dans la base de données. Le code est le même à la fois localement et sur PA. Le code de recherche de distance est le suivant :

return TestEntry.objects.filter(pnt__distance_lte=(pnt, 10))

La seule différence que je vois est la version PostGIS, mais il semble peu probable qu'une fonctionnalité aussi basique ne fonctionne pas dans une ancienne version.

Est-ce que quelqu'un a de l'expérience avec ce genre de technologies et me donne des indices sur ce qui pourrait ne pas aller ?


Pour expliquer ce qui s'est passé dans les commentaires ci-dessus :

pnt__distance_lteselon le manuel traduit

pnt__distance_lte=(pnt, 10)

dans

ST_Distance(poly, pnt) <= 10

ST_Distancein postgis se comporte différemment pour la géographie et la géométrie :

Pour le type de géométrie Renvoie la distance minimale cartésienne bidimensionnelle (basée sur la référence spatiale) entre deux géométries en unités projetées. Pour que le type de géographie renvoie par défaut la distance minimale sphéroïdale entre deux zones géographiques en mètres

Le problème peut résider dans une opération du système sur geom et l'autre sur geog ou les deux geom mais avec des SRID différents.

En fin de compte, un système sélectionnait des objets dans un rayon de 10 mètres et l'autre dans un rayon de 10 degrés (4326 unités).


Voir la vidéo: How to Import GIS data Shapefiles to PostGIS, running in a docker container (Octobre 2021).