Wann entscheiden Sie sich bei der Definition eines Punktes in PostGIS, welchen der folgenden Punkte zu verwenden?
ST_SetSRID(ST_MakePoint(lon,lat),4326)
ST_SetSRID(ST_Point(long,lat),4326)
ST_SetSRID(ST_GeomFromText('POINT(lon lat)',4326)
ST_GeomFromEWKT('SRID=4326;POINT(lon lat)')
Wenn es sich im Wesentlichen um einen Leistungsunterschied handelt, welcher ist der schnellste?
postgis
postgresql
coordinate-system
Nyxynyx
quelle
quelle
Antworten:
Ich vermute, dass dies
ST_MakePoint
am schnellsten ist, aber dies ist einfach genug, um mit 100.000 zufälligen Punkten einen Benchmark zu erstellen.Und hier sind einige Ergebnisse mit PostGIS 2.1 (trunk) unter PostgreSQL 9.1, x64 Debian. Ich habe sie einige Male gemacht, um einen ungefähren Durchschnitt zu erhalten. Hier sind die
<POINT CONSTRUCTOR METHOD>
in der Reihenfolge vom schnellsten zum langsamsten:ST_SetSRID(ST_MakePoint(random(), random()), 4326)
ST_GeomFromText('POINT(' || random()::text || ' ' || random()::text || ')', 4326)
ST_GeomFromEWKT('SRID=4326;POINT(' || random()::text || ' ' || random()::text || ')')
ST_GeomFromText
Zuletzt eine kleine Fußnote zum Unterschied zwischen verlustfreien / verlustbehafteten Konvertierungen mit den oben genannten Methoden. Erhält
ST_MakePoint
nur die binären Gleitkomma-Präzisionsdaten, und die Textkonvertierungen kürzen einen sehr kleinen Teil der Daten ab. Obwohl die beiden Punkte möglicherweise binäre Unterschiede aufweisen (siehe WKB), sollten sie räumlich immer gleich sein. Die Abstandsunterschiede sind im Wesentlichen das Maschinen-Epsilon für doppelte Präzision .quelle
SQL
Syntax<POINT CONSTRUCTOR METHOD>
. Ist das nur ein Pseudocode, der sich auf die vier verschiedenen Ansätze bezieht, oder machen Sie eine Art Funktion?1e-14
... Ändern Sie die Tabelle f1FROM (SELECT random()::float8 as x, random()::float8 as y UNION SELECT 12.24343484842,34.58384538483434) AS f1
, um sie in Ihrer psql anzuzeigen.ST_MakePoint und ST_Point sind gleich - beide rufen LWGEOM_makepoint auf (dies können Sie in der Datei postgis / postgis.sql.in im Quellcode sehen). Ich würde ST_MakePoint verwenden. Die Textkonvertierungsroutinen führen zu demselben Ergebnis, sind jedoch aufgrund des erforderlichen Parsing-Aufwands langsamer.
quelle
SRID 4326 und Geometrie
Als Randnotiz zu der hervorragenden, umfassenden und aktuellen Antwort von MikeT . Viele Leute scheinen diese Frage zu stellen, weil sie die SRID auf eine POINT-Spalte setzen wollen.
Aber wenn sie dies tun, stoßen sie auf Probleme mit der scheinbar besten Methode, um einen Punkt zu erstellen, aber leider stoßen sie auf Probleme.
Aus diesem Grund haben sie zwei Möglichkeiten
ST_SetSRID( ST_MakePoint(1,2) )
Stellen Sie die SRID manuell ein. Dies ist die am weitesten rechts stehende, aber unangenehme EinstellungST_GeomFromText
, dies ist logisch langsamer und benötigt keine Benchmarks: PostgreSQL muss die Argumente des Konstruktors aus dem Text analysieren. Es ist auch selbst extrem hässlich.Leider gibt es einen anderen Weg.
Geografietyp
Die Standard-SRID für
geography
ist 4326. Wenn Sie neu sind, würde ich die Verwendung vongeography
anstelle von vorschlagengeometry
. In der Tat, im Allgemeinen, wenn Sie den Unterschied nicht kennen, den Sie wahrscheinlich wollengeography
. Sie können die Spalten ziemlich einfach wechseln.Das Einfügen ist jetzt einfacher, da der Typ bereits standardmäßig mit SRID 4326 verknüpft ist. Jetzt können Sie explizit in
geography
die implizite Umwandlung umwandeln oder sie einfach arbeiten lassenWas so aussieht (alle fügen das Gleiche ein)
In Text konvertieren und dann PostgreSQL zwingen, den Text mit
ST_GeomFromText
oder zu analysieren,ST_GeogFromText
ist albern und langsam.quelle