Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Estrutura de tabela para dados geoespaciais


Armazená-lo como um tipo de dados de geometria . O MySQL suporta Geometry (genérico), bem como os tipos de dados Point, Linestring e Polygon, veja criando tipos de dados espaciais . Um único valor de longitude ou latitude não pode ser uma geometria por si só, como você tem em sua captura de tela.

Se você seguir o caminho de usar tipos de geometria, terá duas vantagens sobre ter campos separados de latitude e longitude:você pode adicionar um índice espacial e você poderá usar alguns dos do MySQL funções do operador como ST_Buffer, ST_Intersects, ST_Distance para fazer análises adicionais. Os índices espaciais são baseados em árvores R e terão um desempenho muito melhor do que dois índices de árvore B em colunas não espaciais, latitude e longitude -- e essa diferença de desempenho aumentará à medida que o tamanho da tabela aumentar.

Você ainda pode recuperar os valores de latitude e longitude usando o Funções de ponto X e Y para que você não perca nada armazenando seus dados como um Ponto.

Se você já tem seus dados em duas colunas separadas de lat/lon e deseja seguir a rota de tipo de dados de geometria/ponto, você pode usar a função Point para criar o tipo de dados 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);

Observe que a função Point foi introduzida apenas no MySQL 5.1.x (não está muito bem documentada, então não tenho certeza da versão exata), e antes disso você tinha que usar concat com a função GeomFromText, veja Movendo colunas de texto lat/lon em um coluna do tipo 'ponto' para obter mais informações sobre isso, embora observe que a resposta de Quassnoi tem lon e lat no sentido errado - é Point(lon, lat) não o contrário, embora esse seja um erro muito comum.

OBSERVAÇÃO: Até recentemente, você só podia indexar uma coluna espacial se estivesse usando o mecanismo MyISAM.

EDITAR: Na próxima versão, MySQL 5.7 .5 , o InnoDB finalmente suportará índices em tipos de dados espaciais (e não apenas armazenará tipos espaciais sem um índice, o que é consideravelmente menos útil). Isso significa que você pode ter chaves estrangeiras, garantias ACID, índices espaciais em um único mecanismo, o que já faz muito tempo.