Extensões Espacias em MariaDB - Databases - Software - Computers

Extensões Espacias em MariaDB

Índice

Introdução
O Modelo Geomátrico OpenGIS
A Hierarquia da Classe Geometry
Classe Geometry
Classe Point
Classe Curve
Classe LineString
Classe Surface
Classe Polygon
Classe GeometryCollection
Classe MultiPoint
Classe MultiCurve
Classe MultiLineString (Multi Linhas)
Classe MultiSurface (Multi Superfícies)
Classe MultiPolygon (Multi Polígonos)
Formatos de Dados Espaciais Suportados
Formato Well-Known Text (WKT)
Formato Well-Known Binary (WKB)
Criando um Banco de Dados MariaDB Habilitado Espacialmente
Tipos de Dados Espaciais do MariaDB
Criando Valores Espaciais
Criando Colunas Espaciais
Entrando com Dados em Colunas Espaciais
Buscando Dados Espaciais
Analisando Informação Espacial
Funções Para Converter Geometrias Entre Formatos Diferentes
Funções de Análise das Propriedades de Geometry
Funções Que Criam Novas Geometrias de Outras Existentes
Funções Para Testar Relações Espaciais Entre Objetos Geométricos
Relações de Retângulo de Limite Mínimo (Minimal Bounding Rectangles - MBR) em Geometrias
Funções que Testam Relacionamentos Espaciais Entre Geometrias
Otimizando Análises Espaciais
Criando Índices Espaciais
Usando Índice Espacial
Compatibilidade e Conformidade com o MySQL
Recursos GIS Que Ainda Não Estão Implementados

O MariaDB introduz extensões espaciais para permitir gerar, armazenar e analisar recursos geográficos. Atualmente estes recursos estão disponiveis apenas para tabelas MyISAM. Este cobre os seguintes tópicos:

Introdução

O MariaDB implementea extensões espaciais seguindo especificações do Open GIS Consortium (OGC). Este é um consórcio internacional com mais de 250 companhias, agências, universidades participando no desenvolvimento de soluções conceituais disponíveis publicamente que podem der úteis com todos os tipos de aplicações que gerenciam dados espaciais. O OGC mantém um web site em http://www.opengis.org/.

Em 1997, o Open GIS Consortium publicou o OpenGIS (R) Simple Features Specifications For SQL (Especificações de Recursos OpenGIS (R) Simples Para SQL), um documento que propos diversos modos conceituais de para extender um SQL RDBMS para suportar dados espaciais. Esta especificação está disponível no web site do OpenGIS em http://www.opengis.org/techno/implementation.htm. Ele contém informações adicionais relevantes a este

O MariaDB implementa um subconjunto do ambiente SQL com Tipos Geométricos proposto pela OGC. Este termo se refere a um ambiente SQL que tem sido extendido com um conjunto de tipos geomértricos. Uma coluna SQL com valor geométrico é implementada como uma coluna de um tipo geométrico. As especificações descrevem um conjunto de tipod geométricos do SQL, bem como funções deste tipo para criar e analisar valores geométricos.

Um recurso geográfico é qualquer coisa no mundo que tem uma posição.

Um recurso pode ser:

Você também pode encontrar documentos que utilizam o termo recurso geoespacial para se referir a recursos geográficos.

Geometria é outra palavra que denota um recurso geográfico. O significado original da palavra geometria denota um ramo da matemática. Outro significado vindo da cartografia, se referem aos recursos geométricos que os cartógrafos usam para mapear o mundo.

Este utiliza todos estes termos como sinônimo: recurso geográfico, recurso geoespacial, recurso ou geometria, O termo normalmente mais usado aqui é geometry.

Vamos definir uma geometria como um ponto ou um agregado de pontos representando alguma coisa no mundo que possui uma localização.

O Modelo Geomátrico OpenGIS

A Hierarquia da Classe Geometry
Classe Geometry
Classe Point
Classe Curve
Classe LineString
Classe Surface
Classe Polygon
Classe GeometryCollection
Classe MultiPoint
Classe MultiCurve
Classe MultiLineString (Multi Linhas)
Classe MultiSurface (Multi Superfícies)
Classe MultiPolygon (Multi Polígonos)

O conjunto de tipos geométricos, proposto pelo ambiente SQL com Tipos Geométricos da OGC, é base do Modelo Geométrico OpenGIS. Neste modelo, cada objeto geométrico tem as seguintes propriedades gerais:

A Hierarquia da Classe Geometry

As classes geometry definem uma hierarquia como a seguir:

Algumas destas classes são abstratas (não-instanciável). Isto é, não é possível criar um objeto desta classe. Outras classes são instanciáveis e objetos podem ser criados deles. Cada classe tem propriedades e podem ter declarações (regras que definem intâncias de classes válidas).

Geometry é a classe base. É uma classe abstrata (não-instanciável). As subclasses instanciáveis de Geometry são restritas a objetos geométricos de zero, uma e duas dimensões que existem no espeaço de coordenadas bidimensional. Todas as classes geométricas instanciáveis são definidas para que instâncias válidas da classe geometry são topologicamente fechados (isto é, todas as geometrias definidas incluem seus limites).

A classe base Geometry tem subclasses para Point, Curve, Surface e GeometryCollection:

Geometry, Curve, Surface, MultiCurve e MultiSurface são definidos como classes não instanciáveis. Eles definem em conjunto de métodos comuns para suas subclasses e incluidos por razões de extensabilidade.

Point, LineString, Polygon, GeometryCollection, MultiPoint, MultiLineString, MultiPolygon são classses instanciáveis.

Classe Geometry

Geometry é a classe raiz da hierarquia. É uma classe não instanciável mas possui vária propriedades comuns a todos os valores de geometria de qualquer das subclasses Geometry. Estas propriedades estão descritas na lista a seguir ( Subclasses particulares tem as suas próprias propriedades específicas, descritas posteriormente):

Propriedades de geometria

Um valor geometry tem as seguintes propriedades:

Classe Point

Um Point é uma geometria que representa um único local no espaço coordenado.

Exemplos de Point

Propriedades de Point

Classe Curve

Uma Curve é uma geometria unidimensional, normalmente representado por uma sequência de pontos. Subclasses particulares de Curve define o tipo de interpolação entre pontos. Curve é uma classe não-instanciável.

Propriedades de Curve

Classe LineString

Uma LineString é uma Curve com interpolação linear entre pontos.

Exemplos de LineString

Propriedades LineString

Classe Surface

Uma Surface é uma geometria bidimensional. Ele é uma classe não instanciável. Sua única subclasse instanciável é Polygon.

Propriedades de Surface

Classe Polygon

Um Polygon é uma Surface planar representando uma geometria multi-lados. Ela é definida por um limite exterior e zero ou mais limites interiores, onde cada limite interior define um buraco no Polygon.

Exemplos de Polygon

As afirmações para os polygons (as regras que definem polygons válidos) são:

  1. O limite (boundary) de um Polygon consiste de um conjunto de LinearRings (ex. LineStrings que são simples e fechadas) que fazem os seus limites interior e exterior.
  2. Dois aneis no limite não podem se cruzar. Os aneis no limite de um Polygon podem se interseptar em um Point, mas apenas como uma tangente.
  3. Um Polygon não pode ter linhas cortadas, pontas ou cavidades.
  4. O interior de cada Polygon e um conjunto de pontos conectados.
  5. O Exterior de um Polygon com um ou mais buracos não está conectado. Cada buraco define um componenete conectados do exterior.

Nas afirmações acimas, poligonos são geometrias simples. Estas afirmações fazem de um Polygon uma geometria simples.

Classe GeometryCollection

Um GeometryCollection é uma geometria que é um coleção de um ou mais geometrias de qualquer classe.

Todos os elementos em uma GeometryCollection deve estar no mesmo Sistema de Referência Espacial (ex. no mesmo sistema de coordenadas). GeometryCollection não coloca nenhuma outra restrição em seus elementos, embora as subclasses de GeometryCollection descritas abaixo possam restringir membros com base em:

Classe MultiPoint

Um MultiPoint é uma coleção de geometrias compostas de elementos Point. Os pontos não estão conectados ou ordenados de forma alguma.

Exemplos de MultiPoint

Propriedades de MultiPoint

Classe MultiCurve

Uma MultiCurve é uma coleção de geometria compostas de elementos Curve. MultiCurve é uma classe não instanciável.

Propriedades de MultiCurve

Classe MultiLineString (Multi Linhas)

Um MultiLineString é uma coleção de geométrias MultiCurve composto de elementos LineString.

MultiLineString

Classe MultiSurface (Multi Superfícies)

Um MultiSurface é uma coleção geometrica compostos de elementos de superfície MultiSurface é uma classe não instanciável. Sua única subclasse instanciável é MultiPolygon

Afirmações de MultiSurface

  1. O interior de quaisquer duas superfícies em uma MultiSurface não podem se interceptar.
  2. O limite de quaiqsquer dois elementos em um MultiSurface podem interceptar em um número finito de pontos.

Classe MultiPolygon (Multi Polígonos)

Um MultiPolygon é um objeto MultiSurface compostos de elementos Polygon.

Exemplos de MultiPolygon

As afirações dos MultiPolygons são:

  1. O interior de dois valores Polygon que são elementos de um MultiPolygon não podem interceptar.
  2. Os limites (Boundaries) de quaisquer dois valores Polygon que são elementos de um MultiPolygon não podem cruzar e pode se tocar em um número finito de pontos. (O cruzamento também é proibido pela primeira afirmação.)
  3. Um MultiPolygon não pode ter linhas cortadas, pontas ou cavidades. Um MultiPolygon é um conjunto de pontos regular e fechado.
  4. O interior de um MultiPolygon composto por mais de um Polygon não está conectado, o número de componentes conectados do interior de um MultiPolygon é igual ao número de valores Polygon no MultiPolygon.

Propriedades de MultiPolygon

Formatos de Dados Espaciais Suportados

Formato Well-Known Text (WKT)
Formato Well-Known Binary (WKB)

Esta seção descreve o formato de dados espaciais padrão que são utilizados para representar objetos geometry em consultas.

Eles são:

Internamente, o MariaDB armazena valores geometry em um formato que não é identico nem ao format WKT ou WKB.

Formato Well-Known Text (WKT)

A representação Well-Known Text (WKT) de Geometry é criada para troca de dados de geometria na forma ASCII.

Exemplos de representações WKT representations de objetos geometry são:

Uma gramática Backus-Naur que especifica as regras de produção formal para gravar valores WKT podem ser encontrados na documentação de especificação OGC indicada próximo ao início deste

Formato Well-Known Binary (WKB)

A representação Well-Known Binary (WKB) para valores geométricos é definida pela especificação OpenGIS. Ela também é definida no padrão ISO 'SQL/MM Part 3: Spatial'.

WKB é usado para trocar dados geometry como fluxos binários representados por valores BLOB contendop informações geométricas WKB.

WKB usa inteiros sem sinal de 1-byte e 4-byte e números de precisão dupla de 8-byte (formato IEEE 754). Um byte é 8 bits.

Por exemplo, um valor WKB que corresonde a POINT(1 1) consiste desta sequência de 21 bytes (cada um representado aqui por dois digitos hexa):

0101000000000000000000F03F000000000000F03F

A sequência pode ser quebrada nestes componentes:

Byte order : 01
WKB type : 01000000
X : 000000000000F03F Y : 000000000000F03F

A respresentação do componente está a seguir:

Valores WKB para valores de geometria mais complexas são representados por estrutras de dados mais complexas, como detalhado na epecificação OpenGIS.

Criando um Banco de Dados MariaDB Habilitado Espacialmente

Tipos de Dados Espaciais do MariaDB
Criando Valores Espaciais
Criando Colunas Espaciais
Entrando com Dados em Colunas Espaciais
Buscando Dados Espaciais

Esta seção descreve os tipos de dados que você pode usar para representar dados espaciais no MariaDB e as funções disponíveis para criar e recuperar valores espaciais.

Tipos de Dados Espaciais do MariaDB

MySQL fornece um hierarquia de tipos de dados que correspondem as classes na hierarquia de classes do Modelo Geometrico OpenGIS. Alguns destes tipos guardam valores de geometria únicos:

O tipo GEOMETRY é o mais genérico destes tipos, ele pode armazenar geometrias de qualquer tipo. Os outros tipos restringem seus valores a tipos de geometria específicos.

Os outros tipos de dados tem coleções de valores:

GEOMETRYCOLLECTION pode armazenar uma coleçao de objetos de qualquer tipo. Os outros tipos de coleções restrigem o tipo dos membros da coleção para um tipo de geometria específico.

Criando Valores Espaciais

Criando Valores Geometry Usando Funções WKT
Criando Valores Geometry Usando Funções WKB
Criando uma Valor de Geometira Usando Funções Específicas do MariaDB

Esta seção descreve como criar valores espaciais usando as funções Well-Known Text e Well-Known Binary que estão definidas no padrão OpenGIS, e usando funções específicas do MariaDB.

Criando Valores Geometry Usando Funções WKT

O MariaDB fornece algumas funções que utilizam a representação Well-Known Text (e, opcionalmente, um identificador sistema de referência espacial (SRID)) e retorna a geometria correspondente.

GeomFromText() aceita um WKT de qualquer tipo de geometria com seu primeiro argumento. Uma implementação também fornece uma função de construção específica do tipo para cada tipo de geometria.

A especificação OpenGIS também descreve funções opcionais para construção de valores Polygon ou MultiPolygon baseados na representação WKT de uma coleção de anéis ou valores LineString fechados. Estes valores podem se interceptar. OMySQL ainda não implementou estas funções:

Criando Valores Geometry Usando Funções WKB

O MariaDB fornece um conjunto de funções que utilizam um BLOB contendo representação Well-Known Binary (e, opcionalmente, um indentificador de sistema de referência espacial (SRID)), e retornam a geometria correspondente.

GeomFromWKT pode acitar um WKB de qualquer tipo de geometria como seu primeiro argumento. Uma implementação também fornece uma função de construção específica para cada tipo de geometria como descrito na lista acima.

A especificação do OpenGIS também descreve funções adicionais para construção de valores Polygon ou MultiPolygon baseados em uma representação WKB de uma coleção de anéis ou valores de LineString fechadas. Estes valores podem se interceptar. O MariaDB ainda não implementou estas funções:

Criando uma Valor de Geometira Usando Funções Específicas do MariaDB

Nota: o MariaDB aindo não implementou as funções listadas nesta seção.

O MariaDB fornece um conjunto de funções úteis para criar representações WKB de geometria. A função descrita nesta seção são extensões MariaDB para a especificação OpenGIS. O resultado destas funções são valores BLOBs contendo representações WKB de valores de geometria sem SRID. Os resultados destas funções podem ser substituidos como primeiro argumento para a família de funções GeomFromWKB().

Criando Colunas Espaciais

O MariaDB fornece um modo padrão de criar colunas espaciais para tipos de geometria, por exemplo, com CREATE TABLE ou ALTER TABLE. Atualmente, colunas espaciais são suportadas apenas por tabelas MyISAM.

Entrando com Dados em Colunas Espaciais

Depois de criar as colunas espaciais, você pode preenchê-las com os dados espaciais.

Os valores devem ser armazenados no formato de geometria interna, mas você pode convertê-las para este formato a partir dos formatos Well-Known Text (WKT) ou Well-Known Binary (WKB). Os exemplos a seguir demonstram como inserir valores de geometria em uma tabela convertendo valores WKT em formatos de geometria interna.

Você pode realizar a conversão diretamente na instrução INSERT:

INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'));
SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (GeomFromText(@g));

Ou a coversão pode ser feita primeiro que o INSERT:

SET @g = GeomFromText('POINT(1 1)');
INSERT INTO geom VALUES (@g);

Os seguintes exemplos inserem geometrias mais comlexas nas tabelas:

SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (GeomFromText(@g));
SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))';
INSERT INTO geom VALUES (GeomFromText(@g));
SET @g = 'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (GeomFromText(@g));

Todos os exemplos anteiores usam GeomFromText() para criar os valores de geometria. Você também pode usar funções de tipo específicos:

SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (PointFromText(@g));
SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (LineStringFromText(@g));
SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))';
INSERT INTO geom VALUES (PolygonFromText(@g));
SET @g = 'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (GeomCollFromText(@g));

Note que se um programa aplicativo cliente que quiser utilizar representações WKB de valores de geometria, ele é responsável por enviar corretamente WKB formadas em consultas para o servidor. No entanto, existem diversos modos de satisfazer esta exigência. Por exemplo:

Buscando Dados Espaciais

Buscando Dados Espaciais em um Formato Interno
Buscando Dados Espaciais no Formato WKT
Buscando Dados Espaciais no Formato WKB

Valores de geometria, previamente armazenados na tabela, pode, ser buscados com a conversão em formatos internos. Você também pode convertê-los no formato WKT ou WKB.

Buscando Dados Espaciais em um Formato Interno

Buscar valores de geometria usando formatos internos pode ser útil em transferências de tabela para tabela:

CREATE TABLE geom2 (g GEOMETRY) SELECT g FROM geom;

Buscando Dados Espaciais no Formato WKT

A função AsText() fornece acesso textual a valores de geometria. Ele converte a geometria a partir de um formato interno em uma string WKT.

mysql> SELECT AsText(g) FROM geom;
+-------------------------+
| AsText(p1) |
+-------------------------+
| POINT(1 1) |
| LINESTRING(0 0,1 1,2 2) |
+-------------------------+
2 rows in set (0.00 sec)

Buscando Dados Espaciais no Formato WKB

A função AsBinary fornece acesso binário a valores de geometria. Ela converte uma geometria a partir de um formato interno em um BLOB contendo um valor WKB.

SELECT AsBinary(g) FROM geom;

Analisando Informação Espacial

Funções Para Converter Geometrias Entre Formatos Diferentes
Funções de Análise das Propriedades de Geometry
Funções Que Criam Novas Geometrias de Outras Existentes
Funções Para Testar Relações Espaciais Entre Objetos Geométricos
Relações de Retângulo de Limite Mínimo (Minimal Bounding Rectangles - MBR) em Geometrias
Funções que Testam Relacionamentos Espaciais Entre Geometrias

Depois de preencher colunas espaciais com valores, você está pronto para consultá-los e analisá-los. O MariaDB fornece um conjunto de funções para realizar diversas operações em dados espaciais. Estas funções podem ser agrupadas em quatro grandes categorias de acordo com o tipo de operação que eles realizam:

Funções de análise espacial podem ser usados em muitos contextos, tais como:

Funções Para Converter Geometrias Entre Formatos Diferentes

O MariaDB suporta as seguintes funções para converter valores geométricos entre formatos internos e os formatos WKB e WKT:

Funções de Análise das Propriedades de Geometry

Funções de Análise das Propriedades de Geometry em Geral
Funções de Análise das Propriedades de Point
Funções de Análise das Propriedades de LineString
Funções de Análise das Propriedades de MultiLineString
Funções de Análise das Propriedades de Polygon
Funções de Análise das Propriedades de MultiPolygon
Funções de Análise das Propriedades de GeometryCollection

Cada função que pertencem a este grupo tomam um valor de geometria como seus argumentos e retornam alguma propriedade quantitativa e qualitativa desta geometria. Algumas funções restrigem os seus tipos de argumentos. tais funções retornam NULL se o argumento é de um tipo de geometria incorreta. Por exemplo, Area() retorna NULL se o tipo do objeto não for nem Polygon nem MultiPolygon.

Funções de Análise das Propriedades de Geometry em Geral

As funções listadas nesta seção não restrigem seus argumentos e acitam um valor geometria de qualquer tipo.

A especificação OpenGIS também define as seguintes funções, que o MariaDB ainda não implementou:

Funções de Análise das Propriedades de Point

Um Point consiste de suas coordenadas X e Y, que podem ser obtidas usando as seguintes funções:

Funções de Análise das Propriedades de LineString

Uma LineString consiste de valores Point. Você pode extrair pontos particulares de uma LineString, contar o número de pontos que ela contém ou obter o seu tamanho.

A especificação OpenGIS também define as seguintes funções, que o MariaDB ainda não implementou:

Funções de Análise das Propriedades de MultiLineString

Funções de Análise das Propriedades de Polygon

A especificação OpenGIS também define as seguintes funções, que o MariaDB ainda não implementou:

Funções de Análise das Propriedades de MultiPolygon

A especificação OpenGIS também define as seguintes funções, que o MariaDB ainda não implementou:

Funções de Análise das Propriedades de GeometryCollection

Nota: Funções para tipos de geometrias específicas retornam NULL se a geomtria passada é do tipo de geometria errado. Por exemplo Area() retorna NULL se o tipo do objeto não é nem Polygon nem MultiPolygon.

Funções Que Criam Novas Geometrias de Outras Existentes

Funções de Geometria Que Produzem Novas Geometrias
Operadores Espaciais

Funções de Geometria Que Produzem Novas Geometrias

Na seção Seção 10.5.2, 'Funções de Análise das Propriedades de Geometry' nós já discutimos algumas funções que podem construir novas geometrias se outras existentes:

Operadores Espaciais

OpenGIS propõem algumas outras funções que podem produzir geometrias. Elas estão designadas a implementar Operadores Espaciais.

Estas funções ainda não estão implementadas no MariaDB. Elas devem aparecer em distribuições futuras.

Funções Para Testar Relações Espaciais Entre Objetos Geométricos

A função descrita nesta seção toma duas geometrias como parâmetros de entrada e retorna uma relação qualitativa ou quantitativa entre eles.

Relações de Retângulo de Limite Mínimo (Minimal Bounding Rectangles - MBR) em Geometrias

O MariaDB fornece algumas funções que podem testar relações entre retângulos de limite mínimo de duas geometrias g1 e g2. Elas incluem:

Funções que Testam Relacionamentos Espaciais Entre Geometrias

A especificação OpenGIS define as seguintes funções, que o MariaDB ainda não implementou. Elas devem aparecer em distribuições futuras. Quando implementadas, fornecerão suporte total para análise espacial, não apenas suporte baseado em MBR.

As funções operam em dois valores de geometria g1 e g2.

Otimizando Análises Espaciais

Criando Índices Espaciais
Usando Índice Espacial

É sabido que operações de busca em banco de dados não espaciais podem ser otimizadas utilizando índices. Isto ainda é verdade em banco de dados espaciais. Com a ajuda de grande variedades de métodos de indexacão multi-dimensionais, o quais já têm sido desenvolvidos, é possível otimizar buscas espaciais. As mais comuns delas são:

O MariaDB utiliza Arvores R com separação quadrática para indexar colunas espaciais. Um índice espacial é construído usando o MBR de uma geometria. Para a maioria da geometrias, o MBR é um retângulo mínimo que cerca a geometria. Para uma linha (linestring) horizontal ou uma vertical, o MBR é um retângulo degenerado, nas linhas e nos pontos respectivamente.

Criando Índices Espaciais

O MariaDB pode criar índices espaciais usando uma sintaxe similar àquela usada para criar índices regulares, mas extendida com a palavra-chave SPATIAL. Colunas espaciais indexadas devem ser declaradas como NOT NULL. Os seguintes exemplos demonstram como criar índices de colunas espaciais.

Para remover índices espaciais, use ALTER TABLE ou DROP INDEX:

Example: Suponha que uma tabela geom contém mais de 32000 geometrias, que estão armazenadas na coluna g do tipo GEOMETRY. A tabela também tem um campo AUTO_INCREMENT fid, armazenando valores dos IDs de objetos.

mysql> SHOW FIELDS FROM geom;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| fid | int(11) | | PRI | NULL | auto_increment |
| g | geometry | | | | |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> SELECT COUNT(*) FROM geom;
+----------+
| count(*) |
+----------+
| 32376 |
+----------+
1 row in set (0.00 sec)

Para adicionar um índice espacial na coluna g, use esta instrução:

mysql> ALTER TABLE geom ADD SPATIAL INDEX(g);
Query OK, 32376 rows affected (4.05 sec)
Records: 32376 Duplicates: 0 Warnings: 0

Usando Índice Espacial

O otimizador investiga se os índices espaciais disponíveis podem ser envolvidos na busca se uma consulta com uma função como MBRContains() ou MBRWithin() na cláusula WHERE é executada. Por exemplo, suponhamos que queremos encontrar todos os objetos que estão no retângulo dado:

mysql> SELECT fid,AsText(g) FROM geom WHERE
mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g);
+-----+-----------------------------------------------------------------------------+
| fid | AsText(g) |
+-----+-----------------------------------------------------------------------------+
| 21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30333.8 15828.8) |
| 22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8,30334 15871.4) |
| 23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4,30334 15914.2) |
| 24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4,30273.4 15823) |
| 25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882.4,30274.8 15866.2) |
| 26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4,30275 15918.2) |
| 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946.8,30320.4 15938.4) |
| 1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136.4,30240 15127.2) |
| 2 | LINESTRING(30220.2 15122.8,30217.2 15137.8,30207.6 15136,30210.4 15121) |
| 3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,30169 15113) |
| 4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30157 15111.6) |
| 5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4,30194.2 15075.2) |
| 6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,30244.6 15077) |
| 7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8,30201.2 15049.4) |
| 10 | LINESTRING(30179.6 15017.8,30181 15002.8,30190.8 15003.6,30189.6 15019) |
| 11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2,30151.2 15009.8) |
| 13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,30114.6 15067.8) |
| 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30278 15134) |
| 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30259 15083.4) |
| 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4,30128.8 15001) |
+-----+-----------------------------------------------------------------------------+
20 rows in set (0.00 sec)

Agora verifiquemos o modo que esta consulta é executada, usando EXPLAIN:

mysql> EXPLAIN SELECT fid,AsText(g) FROM geom WHERE
mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g);
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | geom | range | g | g | 32 | NULL | 50 | Using where |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

Agora verifiquemos o que aconteceria se nós não tivéssemos índices espaciais:

mysql> EXPLAIN SELECT fid,AsText(g) FROM geom IGNORE INDEX (g) WHERE
mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g);
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| 1 | SIMPLE | geom | ALL | NULL | NULL | NULL | NULL | 32376 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)

Vamos executar a consulta acima, ignorando a chave espacial que temos:

mysql> SELECT fid,AsText(g) FROM geom IGNORE INDEX (g) WHERE
mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g);
+-----+-----------------------------------------------------------------------------+
| fid | AsText(g) |
+-----+-----------------------------------------------------------------------------+
| 1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136.4,30240 15127.2) |
| 2 | LINESTRING(30220.2 15122.8,30217.2 15137.8,30207.6 15136,30210.4 15121) |
| 3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,30169 15113) |
| 4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30157 15111.6) |
| 5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4,30194.2 15075.2) |
| 6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,30244.6 15077) |
| 7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8,30201.2 15049.4) |
| 10 | LINESTRING(30179.6 15017.8,30181 15002.8,30190.8 15003.6,30189.6 15019) |
| 11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2,30151.2 15009.8) |
| 13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,30114.6 15067.8) |
| 21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30333.8 15828.8) |
| 22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8,30334 15871.4) |
| 23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4,30334 15914.2) |
| 24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4,30273.4 15823) |
| 25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882.4,30274.8 15866.2) |
| 26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4,30275 15918.2) |
| 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30278 15134) |
| 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30259 15083.4) |
| 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4,30128.8 15001) |
| 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946.8,30320.4 15938.4) |
+-----+-----------------------------------------------------------------------------+
20 rows in set (0.46 sec)

Quando o índice não é usado, o tempo de execução para esta consulta cresce de 0.00 segundos para 0.46 segundos.

Nas verões futuras, índices espaciais também serão usados para otimizar outras funções. Leia Seção 10.5.4, 'Funções Para Testar Relações Espaciais Entre Objetos Geométricos'.

Compatibilidade e Conformidade com o MariaDB

Recursos GIS Que Ainda Não Estão Implementados

Recursos GIS Que Ainda Não Estão Implementados



Anterior Próximo
Conjunto de Caracteres Nacionais e Unicode Início Stored Procedures e Funções