Aide PostGIS ST_Buffer Radius

9

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?

Nik
la source
4326 est dd (degrés décimaux). 12070 est une zone (rayon) assez grande lorsqu'elle est projetée en latlon.
Brad Nesom
1
incorrect - 12 070 mètres = 7,49995029 milles donc 5 milles est 8046,72 mètres donc (? = 8046,72) - est-ce que la géographie ou la géométrie de vos données?
Mapperz

Réponses:

14

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:

SELECT * FROM table WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT(0,0)'), geography(latlon), 12070);

Il a un geographytype 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.

MerseyViking
la source
J'apprécie l'aide. Je suis encore relativement nouveau sur PostGIS.
Nik
4

vous souhaitez peut-être plutôt la fonction ST_DWithin. voir la note dans le doc st_buffer.
ST_Buffer

Les gens font souvent l'erreur d'utiliser cette fonction pour essayer de faire des recherches de rayon. La création d'un tampon pour une recherche de rayon est lente et inutile. Utilisez plutôt ST_DWithin .

Brad Nesom
la source