J'essaie de trouver tous les points dans un rayon de cinq milles d'un point donné. J'ai une requête comme celle-ci:
SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)
Je ne peux pas comprendre ce que j'ai mis à la place de ?
(rayon) pour obtenir cinq miles. Tout est dans EPSG 4326, et selon la documentation PostGIS (pour autant que je sache), mon rayon devrait être en mètres. Si je mets 12 070,0 m (environ 5 milles), j'obtiens des matchs à mi-chemin à travers le pays. Quelqu'un sait-il ce qui me manque?
Réponses:
Parce que vos données ne sont pas projetées - ce sont des points sur un sphéroïde - les distances linéaires n'ont pas de sens. Cinq milles à l'équateur est un angle beaucoup plus petit que 5 milles sur le cercle arctique. Mais heureusement, PostGIS (> = 1.5) a la réponse que vous cherchez:
Il a un
geography
type qui est conçu pour ce genre de chose. C'est similaire à la géométrie, mais il n'utilise que EPSG: 4326, et il y a beaucoup moins de fonctions qui fonctionnent avec.Dans l'exemple ci-dessus, j'ai appelé ST_GeogFromText () (Il y a aussi un ST_GeographyFromText () , et je ne suis pas sûr s'il y a une différence) sur le point d'intérêt (cela pourrait fonctionner avec le WKT normal, car le paramètre SRID est redondant) et transtypez la colonne latlon au type géographique. Si vous en faites beaucoup, il peut être plus efficace de créer une colonne géographique dans votre table et d'ignorer entièrement la distribution. Enfin, ST_DWithin () peut prendre des paramètres géographiques, et il fait la bonne chose avec des distances linéaires.
la source
vous souhaitez peut-être plutôt la fonction ST_DWithin. voir la note dans le doc st_buffer.
ST_Buffer
la source