Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Tabellenstruktur für Geodaten

Speichern Sie es als Geometriedatentyp . MySQL unterstützt Geometry (generic) sowie die Datentypen Point, Linestring und Polygon, siehe Räumliche Datentypen erstellen . Ein einzelner Längen- oder Breitengradwert kann keine eigene Geometrie sein, wie Sie sie in Ihrem Screenshot haben.

Wenn Sie Geometrietypen verwenden, haben Sie zwei Vorteile gegenüber separaten Breiten- und Längenfeldern:Sie können ein räumlicher Index und Sie können einige der räumlichen Funktionen von MySQL verwenden Operatorfunktionen B. ST_Buffer, ST_Intersects, ST_Distance, um weitere Analysen durchzuführen. Räumliche Indizes basieren auf R-Bäumen und sind weitaus besser als zwei B-Baum-Indizes für nicht räumliche Spalten, Breiten- und Längengrad – und dieser Leistungsunterschied wird größer, wenn Ihre Tabellengröße wächst.

Sie können die Breiten- und Längenwerte trotzdem zurückerhalten, indem Sie X- und Y-Punkt-Funktionen Sie verlieren also nichts, wenn Sie Ihre Daten als Punkt speichern.

Wenn Sie Ihre Daten bereits in zwei separaten Lat/Lon-Spalten haben und den Weg des Geometrie-/Punkt-Datentyps gehen möchten, können Sie die Point-Funktion verwenden, um den Point-Datentyp zu erstellen:

alter table mytable add column pt POINT;
update mytable set pt=Point(longitude, latitude);
alter table mytable modify pt POINT NOT NULL;
create spatial index ix_spatial_mytable_pt ON mytable(pt);

Beachten Sie, dass die Point-Funktion erst in MySQL 5.1.x eingeführt wurde (sie ist nicht allzu gut dokumentiert, daher bin ich mir der genauen Version nicht sicher), und davor mussten Sie concat mit der GeomFromText-Funktion verwenden, siehe Verschieben von lat/lon-Textspalten in a Spalte vom Typ "Punkt" für weitere Informationen dazu, beachten Sie jedoch, dass Quassnois Antwort lon und lat falsch herum enthält - es ist Punkt (lon, lat) und nicht umgekehrt, obwohl dies ein sehr häufiger Fehler ist.

HINWEIS: Bis vor kurzem konnten Sie eine räumliche Spalte nur indizieren, wenn Sie die MyISAM-Engine verwenden.

BEARBEITEN: In der kommenden Version MySQL 5.7 .5 , wird InnoDB endlich Indizes für räumliche Datentypen unterstützen (und nicht nur räumliche Typen ohne Index speichern, was erheblich weniger nützlich ist). Das bedeutet, dass Sie Fremdschlüssel, ACID-Garantien und räumliche Indizes in einer Engine haben können, was lange auf sich warten ließ.