Speichert MySQL Punktdatentypen als LAT LNG oder LNG LAT?

9

Ich bin es gewohnt, das Standortformat als Breitengrad gefolgt von Längengrad zu sehen, aber wenn ich Bibliotheken verwende, glaube ich, dass ich MySQL verstehe, um es in POINT(LNG LAT)umgekehrter Reihenfolge zu speichern . Ist meine Bibliothek falsch oder ist dies das tatsächliche Format? Ich kann dieses Detail anscheinend nicht in der MySQL-Dokumentation finden.

Lazlo
quelle
Sie können dies wahrscheinlich lesen: stackoverflow.com/questions/159255/…
codedawg82

Antworten:

14

Konstruktorsyntax

Wenn Sie die räumliche Funktionsreferenz nachschlagen, werden Sie sehen

Point(x, y)
Constructs a Point using its coordinates

Das ist nicht ganz richtig. Alle GIS-Implementierungen müssen (x,y)für projizierte Koordinaten ausgeführt werden (long,lat). Bei geodidischen Koordinatensystemen gibt es jedoch einige Meinungsverschiedenheiten darüber, was zu tun ist. MySQL (und SQL Server) tun dies, (lat,long)aber PostGIS wird (long,lat)überall verwaltet.

Dies wird in der Spezifikation OpenGIS® Implementation Standard für geografische Informationen - Einfacher Funktionszugriff - Teil 2: SQL-Option ,

  • Für geodätische CRS mit einem ellipsoidalen 2-D-Koordinatensystem sind die Achsen des zweidimensionalen ellipsoidalen Koordinatensystems geodätischer Breitengrad positiv nach Norden und geodätischer Längengrad positiv nach Osten. Die Achsenrichtung muss "Nord" bzw. "Ost" sein.
  • Bei geodätischen CRS mit einem dreidimensionalen Ellipsoidkoordinatensystem müssen der Name und die Abkürzung der horizontalen Achsen in einer WKT-Zeichenfolge den Anforderungen in (ii) entsprechen. Der Name der vertikalen Achse lautet „Ellipsoidhöhe“. Die Abkürzung für die vertikale Achse muss "h" sein und sollte enthalten sein, wenn Abkürzungen für die horizontalen Achsen enthalten sind.

Beachten Sie, dass die obigen Wörter wörtlich in Geografische Informationen - Bekannte Textdarstellung von Koordinatenreferenzsystemen enthalten sind

Schon in der 1.1-Spezifikation

Ein räumliches Bezugssystem, auch als Koordinatensystem bezeichnet, ist ein geografisches (Längen- und Breitengrad) , ein projiziertes (X, Y) oder ein geozentrisches (X, Y, Z) Koordinatensystem.

Es scheint jedoch, dass PostGIS und Oracle sowie viele Bibliotheken von Drittanbietern (x,y,[z])für alle Arten von Punkten verwaltet werden. Dies verstößt gegen die Spezifikation für WKT, ist jedoch eine weit verbreitete Konvention. Zum Beispiel macht GeoJSON dies auch,

Punktkoordinaten sind in x-, y-Reihenfolge (Ost, Nord für projizierte Koordinaten, Längen- und Breitengrad für geografische Koordinaten)

Die (lat, long) Reihenfolge wird von EPSG für SRSID 4326 explizit definiert .

Ein 2D- oder 3D-Koordinatensystem, bei dem die Position durch geodätische Breite, geodätische Länge und (im dreidimensionalen Fall) ellipsoidale Höhe angegeben wird und in geografischen CRS verwendet wird.

Sie können auch den Blog von Paul Ramsey (Captain PostGIS) zu diesem Thema mit dem Titel "Let's Call the Whole Thing Off" lesen.

Schönheiten

Als besonderen Hinweis bringt MySQL zwei neue Funktionen in den Mix:

Diese Funktionen stehen neben ST_X()und ST_Y()und erfordern eine geographische SRS oder sie werfen eine Ausnahme und Irrtum.

Lager

Aus den Dokumenten

Intern speichert MySQL Geometriewerte in einem Format, das weder mit dem WKT- noch mit dem WKB-Format identisch ist. (Internes Format ist wie WKB, jedoch mit anfänglichen 4 Bytes zur Angabe der SRID.)

Das Speichern wird hier definiert .

Table 11.1 WKB Components Example

Component       Size    Value
Byte order      1 byte  01
WKB type        4 bytes 01000000
X coordinate    8 bytes 000000000000F03F
Y coordinate    8 bytes 000000000000F0BF
Evan Carroll
quelle
0

Eine einfache Möglichkeit, die Reihenfolge zu überprüfen, besteht darin, den Breitengrad zu überschreiten:

SELECT ST_Longitude(ST_SRID(POINT(45, 160), 4326));

Gibt FEHLER 3732 (22S03): Ein Parameter der Funktion st_srid enthält eine Geometrie mit dem Breitengrad 160.000000, die außerhalb des Bereichs liegt. Es muss innerhalb von [-90.000000, 90.000000] liegen;

Beachten Sie, dass sich die Reihenfolge abhängig von den von Ihnen verwendeten Funktionen ändern kann:

SELECT ST_Longitude(ST_SRID(POINT(45, 90), 4326));
SELECT ST_Longitude(ST_GeomFromText('POINT(45 90)', 4326));
nfroidure
quelle