Kreis in PostGIS erstellen?

22

Ich verwende PostGIS 1.5.2 mit Geometrien in SRID: 900913. Ich muss einen Kreis mit einer Liste von Punkten als Mittelpunkt mit einem Radius von 600 Kilometern erstellen. Ich benutze diese Abfrage:

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

Die erzeugten Kreise haben jedoch keinen Radius von 600 Kilometern (der Radius liegt in der Nähe dieser Länge, aber nicht genau).

Gibt es andere Methoden zum Erstellen von Kreisen in PostGIS?

HINWEIS: Die dargestellten Informationen stammen aus Spanien. Die korrekte Projektion lautet 4326, aber der Client verwendet Google-Raster. Daher speichere ich Daten in 900913, um Neuprojektionen zu vermeiden und die Leistung zu steigern.

Angelcervera
quelle
1
Wie haben Sie die Radien gemessen, um festzustellen, dass sie nicht 600 km lang sind?
Underdunkel
1
@underdark Ich weiß, dass die Entfernung zwischen zwei Städten und einem Kreis, der als Mittelpunkt einer dieser Städte verwendet wird, sich nicht auf eine andere Stadt erstreckt. Ich überprüfe die Entfernung zwischen zwei Städten mit gmap-pedometer.com
angelcervera
3
Dies klingt nach gis.stackexchange.com/questions/10148/…
underdark
@underdark Mit SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));return mehr als 100km Unterschied respektieren Sie gmap-pedometer.com, aber wenn ich diese Länge als korrekt annehme, ist der Kreisradius perfekt. Aber die Leute benutzen die erste Distanz als Radius, nicht die Distanz, die von st_distance zurückgegeben wird. Ist es möglich, die erste Distanz in die zweite zu transformieren?
Angelcervera

Antworten:

15

Versuche dies:

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

Dies wechselt in die Geographie und verwendet dann die eingebaute SRID-Auswahl, um (ironischerweise) in die Geometrie zurückzukehren, in der ein guter planarer Puffer ausgeführt wird, und wechselt dann zurück. Das Problem bei Ihrer Vorgehensweise in Mercator ist, dass Mercator keine Distanz einhält. Die Verwendung einer geeigneteren lokalen Projektion führt zu besseren Ergebnissen, und genau das passiert bei der obigen Methode.

Paul Ramsey
quelle
4

Sie können den quad_seg-Wert erhöhen, um einen genaueren Kreis zu erhalten. Um einen echten Kreis zu erhalten, muss man mit einem gekrümmten Geometrietyp arbeiten, aber ich weiß nicht, welche Software das zeigen kann.

Die Genauigkeit von srid 90013 ist ebenfalls sehr schlecht, da es sich um eine Projektion handelt, die die ganze Welt abdeckt.

Mit einer lokalen Projektion erhalten Sie ein genaueres Ergebnis.

Nicklas Avén
quelle
@ nicklas-aven Ist es möglich, 100 km Unterschied in einer Entfernung von 600 km, weil ich 900913 Projektion verwende und nicht 4326?
Angelcervera
1
Ja, es ist möglich. Überprüfen Sie, ob Pauls sie kommentiert hat, als ich diese Ungenauigkeit nicht glauben konnte. gis.stackexchange.com/questions/3264/… . die Sache ist, dass 4326 nicht projiziert wird.
Nicklas Avén
3

Es hängt davon ab, wo Ihre Kreise erstellt werden. Befinden sie sich in der Nähe des Äquators oder näher an den Polen?

Schauen Sie sich diese Karte an . Denken Sie, dass Antarktis oder Grönland wirklich so groß sind? Das ist die Projektion, die Sie verwenden, richtig?

Ich empfehle Ihnen, dieses USGS-Dokument zu Projektionen schnell durchzulesen , insbesondere die folgende Tabelle, die Ihnen einen schnellen Überblick darüber gibt, welche Projektionen wofür gut sind.

Und nach all dem denke ich, ich sollte endlich deine Frage beantworten :)

Was Nicklas sagte, war ein guter Rat. Gibt es eine bestimmte Projektion für Ihre Region, die besser funktionieren würde?

Andernfalls möchten Sie möglicherweise den neuen PostGIS Geography-Typ anzeigen . Die am besten geeignete Antwort hängt jedoch davon ab, wo sich Ihre Daten befinden.

UPDATE: Da wir jetzt wissen, dass sich Ihre Daten in Spanien befinden, haben Sie versucht , sie in einer lokalen Projektion wie UTM Zone 31N zu speichern , Ihre Vorgänge damit durchzuführen und sie dann wieder in Google Web Mercator zu projizieren?

Ragi Yaser Burhum
quelle
1
+1 für die Verwendung des Geografietyps für Karten, die große Gebiete abdecken. das problem hierbei ist, dass es in postgis keine native pufferfunktion für den geografischen typ gibt. Es gibt jedoch eine eingebaute Umwandlung in "bestes srid", die den Puffer erstellt und dann zurück zu 4326. Wenn Sie also Ihre Daten kennen und manuell ein srid auswählen, erhalten Sie eine bessere Kontrolle.
Nicklas Avén
Nicklas, du hast recht mit dem Casting und ich stimme dir zu 100% zu, was die lokale Projektion (dh die Kenntnis deiner Daten) betrifft. Wenn die Antwort jedoch lautet, dass er nur "weltweite" Daten haben möchte, IMHO, kann die Umsetzungslogik des Typs "Geografie" viel besser herausfinden, welche SR für diese bestimmte Distanzoperation geeignet ist, als jede andere komplizierte benutzerdefinierte Logik. Eine weitere gute Eigenschaft des Geografietyps ist, dass viele Operationen derzeit in kartesische Mathematik umgewandelt werden, die Operationen jedoch ständig aktualisiert werden, um die Sphärenmathematik zu verwenden.
Ragi Yaser Burhum
2

Sie können den neuen SQL / MM Part 3- Geometrietyp CIRCULARSTRING und / oder CURVEPOLYGON verwenden.

Beachten Sie jedoch, dass die Unterstützung für diesen Typ sowohl für interne Funktionen als auch für externe Programme begrenzt ist. Sie können ST_CurveToLine zur Visualisierung verwenden.

Außerdem ist es etwas abstoßend (ab PostGIS 2.0 svn), dass SELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry)es sich nur um eine grobe Näherung von π handelt . (Vergleiche 3.14033115695475 mit 3.14159265358979 von pi()).

Mike T
quelle