Créer un cercle dans PostGIS?


22

J'utilise PostGIS 1.5.2, avec des géométries dans SRID: 900913. J'ai besoin de créer un cercle en utilisant une liste de points comme centre, avec un rayon de 600 kilomètres. J'utilise cette requête:

INSERT INTO circles (geom) (
   SELECT ST_Buffer(point, 600000, 'quad_segs=8') 
   FROM points
);

Mais les cercles créés n'ont pas 600 kilomètres de rayon (le rayon est proche de cette longueur, mais pas exactement).

Existe-t-il d'autres méthodes pour créer des cercles dans PostGIS?

REMARQUE: les informations représentées proviennent d'Espagne. La projection correcte est 4326, mais le client utilise des rasters Google, donc je stocke des données dans 900913 pour éviter les reprojections et augmenter les performances.


1
Comment avez-vous mesuré les rayons pour savoir qu'ils ne sont pas à 600 km?
underdark

1
@underdark Je sais que la distance entre deux villes et le cercle généré en utilisant comme centre l'une de cette ville ne s'étend pas à une autre ville. Je vérifie la distance entre deux villes en utilisant gmap-pedometer.com
angelcervera


@underdark En utilisant un SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));retour de plus de 100 km de différence, respectez gmap-pedometer.com, mais si je suppose que cette longueur est correcte, le rayon du cercle est parfait. Mais les gens utilisent la première distance comme rayon, pas la distance renvoyée par st_distance. Est-il possible de transformer la première distance en seconde?
angelcervera

Réponses:


15

Essaye ça:

 SELECT ST_Transform(geometry( 
            ST_Buffer(geography( 
                ST_Transform( point, 4326 )), 
                600000)), 
            900913) FROM points`

Cette bascule dans la géographie utilise ensuite la sélection SRID intégrée pour (ironiquement) retourner dans la géométrie où un bon tampon planaire est exécuté, puis retourne. Le problème avec votre approche dans Mercator est que Mercator ne préserve pas la distance. L'utilisation d'une projection locale plus appropriée donne de meilleurs résultats, et c'est ce qui se produit dans la méthode ci-dessus.


4

Vous pouvez augmenter la valeur quad_seg pour obtenir un cercle plus précis. Pour obtenir un vrai cercle, vous devez travailler avec un type de géométrie courbe, mais je ne sais pas quel logiciel peut le montrer.

La précision du srid 90013 est également très mauvaise car il s'agit d'une projection couvrant le monde entier.

Vous obtiendrez un résultat plus précis avec une projection locale.


@ nicklas-aven Est-il possible de 100 km de différence sur une distance de 600 km parce que j'utilise une projection 900913 et non 4326?
angelcervera

1
Oui c'est possible. vérifier Pauls la commenter quand je ne pouvais pas croire cette inexactitude gis.stackexchange.com/questions/3264/… . le fait est que 4326 n'est pas projeté.
Nicklas Avén

3

Cela dépend de l'endroit où vos cercles sont créés. Sont-ils proches de l'équateur ou plus proches des pôles?

Jetez un œil à cette carte . Pensez-vous que l'Antarctique ou le Groenland sont vraiment si gros? C'est la projection que vous utilisez, non?

Je vous recommande de faire une lecture rapide de ce document de l'USGS sur les projections , en particulier le tableau ci-dessous qui vous donne une idée rapide des projections qui sont bonnes pour quoi.

Et après tout ça, je pense que je devrais enfin répondre à votre question :)

Ce que Nicklas a dit était un bon conseil. Y a-t-il une projection particulière pour votre région qui fonctionnerait mieux?

Sinon, vous voudrez peut-être regarder le nouveau type PostGIS Geography . Néanmoins, la réponse la plus appropriée dépend de l'emplacement de vos données.

MISE À JOUR: Depuis que nous savons que vos données sont en Espagne, avez-vous envisagé de les stocker dans une projection locale comme UTM Zone 31N , d'effectuer vos opérations en utilisant cela, puis de les projeter à nouveau sur Google Web Mercator?


1
+1 pour l'utilisation du type géographique pour les cartes couvrant de grandes zones. le problème ici est qu'il n'y a pas de fonction tampon native pour le type géographique dans postgis. mais il y a un cast intégré au "meilleur srid", en construisant le tampon puis en revenant à 4326. Donc, connaître vos données et choisir un srid manuellement donne un meilleur contrôle.
Nicklas Avén

Nicklas, vous avez raison sur le casting et je suis d'accord avec vous à 100% sur la projection locale (c'est-à-dire connaître vos données). Néanmoins, si la réponse est qu'il veut juste avoir des données "mondiales", à mon humble avis, la logique de casting à l'intérieur du type Geography fera un bien meilleur travail pour déterminer quel SR est approprié pour cette opération de distance particulière plutôt que toute autre logique personnalisée compliquée. Une autre bonne chose à propos du type de géographie est que, bien que de nombreuses opérations soient actuellement converties en mathématiques cartésiennes, les opérations continuent d'être mises à jour pour utiliser les mathématiques des sphères.
Ragi Yaser Burhum

2

Vous pouvez utiliser le nouveau type de géométrie SQL / MM Part 3 CIRCULARSTRING et / ou CURVEPOLYGON.

Cependant, sachez que la prise en charge de ce type est limitée, à la fois avec les fonctions internes et les programmes externes. Vous pouvez utiliser ST_CurveToLine pour aider à le visualiser.

De plus, c'est un peu rebutant (comme dans svg PostGIS 2.0) qui SELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry)n'est qu'une approximation approximative de π . (Comparer 3.14033115695475 à 3.14159265358979 à partir de pi()).


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.