it-swarm.com.de

Speichert MySQL Punktdatentypen als LAT LNG oder LNG LAT?

Ich bin es gewohnt, das Standortformat als Breitengrad gefolgt von Längengrad zu sehen, aber unter Verwendung von Bibliotheken glaube ich, dass ich MySQL verstehe, um es als POINT(LNG LAT) in 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.

9
Lazlo

Konstruktorsyntax

Wenn Sie die räumliche Funktionsreferenz nachschlagen, sehen Sie

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 ausführen, dh (long,lat). Bei geodidischen Koordinatensystemen gibt es jedoch einige Meinungsverschiedenheiten darüber, was zu tun ist. MySQL (und SQL Server) machen (lat,long), Aber PostGIS verwaltet (long,lat) Überall.

Dies wird in der spec 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 gefunden werden. Geografische Informationen - Bekannte Textdarstellung von Koordinatenreferenzsystemen

Gerade bis zur 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 verwalten. Dies verstößt gegen die Spezifikation für WKT, ist jedoch eine weit verbreitete Konvention. Zum Beispiel GeoJSON macht das 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 explizit durch EPSG für SRSID 4326, definiert.

Ein 2D- oder 3D-Koordinatensystem, in 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 einen geografischen SRS oder sie lösen eine Ausnahme aus und Error.

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.)

Hier wird das Speichern 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
14
Evan Carroll

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));
0
nfroidure