sql >> Databáze >  >> RDS >> Mysql

Struktura tabulky pro geografická prostorová data

Uložte jej jako typ dat geometrie . MySQL podporuje geometrii (obecné), stejně jako datové typy Point, Linestring a Polygon, viz vytváření typů prostorových dat . Jedna hodnota zeměpisné délky nebo šířky nemůže být geometrií sama o sobě, jak ji máte na snímku obrazovky.

Pokud se vydáte cestou používání typů geometrie, získáte dvě výhody oproti samostatným polím zeměpisné šířky a délky:můžete přidat prostorový index a budete moci používat některé z prostorové databáze MySQL funkce operátora jako ST_Buffer, ST_Intersects, ST_Distance k provedení další analýzy. Prostorové indexy jsou založeny na R-stromech a budou mít mnohem lepší výkon než dva indexy B-stromu na neprostorových sloupcích, zeměpisné šířce a délce – a tento výkonnostní rozdíl poroste s rostoucí velikostí vaší tabulky.

Hodnoty zeměpisné šířky a délky můžete stále získat zpět pomocí Funkce bodů X a Y takže uložením dat jako bod nic neztratíte.

Pokud již máte svá data ve dvou samostatných sloupcích zeměpisné šířky/délky a chcete se vydat cestou datového typu geometrie/bodu, můžete pomocí funkce Point vytvořit datový typ Point:

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

Všimněte si, že funkce Point byla představena pouze v MySQL 5.1.x (není příliš dobře zdokumentována, takže si nejsem jist přesnou verzí) a předtím jste museli použít concat s funkcí GeomFromText, viz Přesun textových sloupců zeměpisné šířky/délky do sloupec typu „bod“ pro další informace o tomto, i když si všimněte, že Quassnoiova odpověď má lon a lat špatným směrem -- je to Point(lon, lat) nikoli naopak, i když je to velmi častá chyba.

POZNÁMKA: Až donedávna jste mohli indexovat prostorový sloupec pouze při použití enginu MyISAM.

UPRAVIT: V nadcházející verzi MySQL 5.7 .5 InnoDB bude konečně podporovat indexy na typech prostorových dat (a nejen ukládat prostorové typy bez indexu, což je podstatně méně užitečné). To znamená, že můžete mít cizí klíče, záruky ACID, prostorové indexy vše v jednom enginu, na což se dlouho čekalo.



  1. Průměr na count() ve stejném dotazu

  2. Azure – oprávnění odepřeno při pokusu o připojení k externí databázi MySQL

  3. Jak mohu změnit původní cenu na stránce produktu OpenCart?

  4. Opakovat výsledky PDO PHP