MySQL memorizza i tipi di dati come LAT LNG o LNG LAT?


9

Sono abituato a vedere il formato della posizione come latitudine seguito dalla longitudine, ma usando le librerie, credo di capire MySQL per memorizzarlo come POINT(LNG LAT), l'ordine inverso. La mia libreria è sbagliata o è il formato attuale? Non riesco a trovare questo dettaglio nella documentazione di MySQL.


Probabilmente si può dare a questo una lettura: stackoverflow.com/questions/159255/...
codedawg82

Risposte:


14

Sintassi del costruttore

Guardando il riferimento alla funzione spaziale, vedrai

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

Questo non è del tutto corretto. Tutte le implementazioni GIS devono fare (x,y)per le coordinate proiettate che è (long,lat). Ma sui sistemi geodidici coordinati c'è un disaccordo su cosa fare. MySQL (e SQL Server) lo fanno, (lat,long)ma PostGIS mantiene (long,lat)ovunque.

Questo viene toccato nella specifica OpenGIS® Standard di implementazione per informazioni geografiche - Accesso semplice alle funzioni - Parte 2: opzione SQL ,

  • Per i CRS geodetici con un sistema di coordinate ellissoidale 2-D, gli assi del sistema di coordinate ellissoidali bidimensionali sono latitudine geodetica, nord positivo e longitudine geodetica, est est. La direzione dell'asse deve essere rispettivamente "nord" e "est".
  • Per i CRS geodetici con un sistema di coordinate ellissoidali tridimensionali, il nome e l'abbreviazione degli assi orizzontali in una stringa WKT devono seguire i requisiti di cui al punto (ii). Il nome dell'asse verticale deve essere "altezza ellissoidale"; l'abbreviazione dell'asse verticale deve essere 'h' e deve essere inclusa quando sono incluse le abbreviazioni per gli assi orizzontali.

Si noti che le parole sopra riportate sono trovate alla lettera in Informazioni geografiche - Rappresentazione testuale ben nota di sistemi di riferimento di coordinate

Anche fin dalle specifiche 1.1,

Un sistema di riferimento spaziale, noto anche come sistema di coordinate, è un sistema di coordinate geografiche (latitudine-longitudine) , proiettate (X, Y) o geocentriche (X, Y, Z).

Detto questo, sembra PostGIS e Oracle e molte librerie di terze parti mantengono (x,y,[z])per tutti i tipi di punti. Ciò viola le specifiche di WKT, ma è una convenzione piuttosto comune. Ad esempio GeoJSON fa anche questo,

Le coordinate del punto sono in ordine x, y (est, nord per coordinate proiettate, longitudine e latitudine per coordinate geografiche)

E, (lat, long) ordinamento è esplicitamente definito da EPSG per SRSID 4326, .

Un sistema di coordinate 2D o 3D in cui la posizione è specificata da latitudine geodetica, longitudine geodetica e (nel caso tridimensionale) altezza ellissoidale, utilizzata nei CRS geografici.

Puoi anche prendere in considerazione la possibilità di consultare il blog di Paul Ramsey (Capitano PostGIS) su questo argomento dal titolo "Let's Call the Whole Thing Off"

nicities

Come nota speciale, MySQL offre due nuove funzioni al mix,

Queste funzioni si levano in piedi a parte ST_X(), e ST_Y()e richiedono uno SRS geografici o buttano un'eccezione ed errori.

Conservazione

Dai documenti

Internamente, MySQL memorizza i valori della geometria in un formato non identico al formato WKT o WKB. (Il formato interno è come WKB ma con 4 byte iniziali per indicare l'SRID.)

La memorizzazione è definita qui .

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

0

Un modo semplice per controllare l'ordine sta passando fuori dalla latitudine dell'intervallo:

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

Fornisce ERRORE 3732 (22S03): un parametro della funzione st_srid contiene una geometria con latitudine 160.000000, che è fuori portata. Deve trovarsi entro [-90.000000, 90.000000];

Fai attenzione che l'ordine potrebbe cambiare in base alle funzioni che usi:

SELECT ST_Longitude(ST_SRID(POINT(45, 90), 4326));
SELECT ST_Longitude(ST_GeomFromText('POINT(45 90)', 4326));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.