XOOPS Brasil

 

10.4. Criando um Banco de Dados MySQL Habilitado Espacialmente

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

10.4.1. Tipos de Dados Espaciais do MySQL

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:

  • GEOMETRY

  • POINT

  • LINESTRING

  • POLYGON

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:

  • MULTIPOINT

  • MULTILINESTRING

  • MULTIPOLYGON

  • GEOMETRYCOLLECTION

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.

10.4.2. Criando Valores Espaciais

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 MySQL.

10.4.2.1. Criando Valores Geometry Usando Funções WKT

O MySQL 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.

  • GeomFromText(wkt[,srid]), GeometryFromText(wkt[,srid])

    Controi um valor geometria de qualquer tipo usando sua representação WKT e SRID.

  • PointFromText(wkt[,srid])

    Controi um valor POINT usando sua representação WKT e SRID.

  • LineFromText(wkt[,srid]), LineStringFromText(wkt[,srid])

    Constroi um valor LINESTRING usando sua representação WKT e SRID.

  • PolyFromText(wkt[,srid]), PolygonFromText(wkt[,srid])

    Constroi um valor POLYGON usasdo sua representação WKT e SRID.

  • MPointFromText(wkt[,srid]), MultiPointFromText(wkt[,srid])

    Contrói um valor MULTIPOINT usando sua representação WKT e SRID.

  • MLineFromText(wkt[,srid]), MultiLineStringFromText(wkt[,srid])

    Contrói um valor MULTILINESTRING usando sua representação WKT e SRID.

  • MPolyFromText(wkt[,srid]), MultiPolygonFromText(wkt[,srid])

    Contrói um valor MULTIPOLYGON usando sua representação WKT e SRID.

  • GeomCollFromText(wkt[,srid]), GeometryCollectionFromText(wkt[,srid])

    Constrói um valor GEOMETRYCOLLECTION usando sua representação WKT e SRID.

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:

  • BdPolyFromText(wkt,srid)

    Constrói um valor Polygon a partir de um valor MultiLineString no formato WKT contendo uma coleção arbitrária de valores LineString fechados.

  • BdMPolyFromText(wkt,srid)

    Constrói um valor MultiPolygon a partir de um valor MultiLineString no formato WKT contendo uma coleção arbitrária de vlaores LineString fechados.

10.4.2.2. Criando Valores Geometry Usando Funções WKB

O MySQL 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.

  • GeomFromWKB(wkb,srid), GeometryFromWKB(wkt,srid)

    Constrói um valor geometria de qualquer tipo usando seua representação WKB e SRID.

  • PointFromWKB(wkb[,srid])

    Constrói um valor POINT usando sua representação WKB e SRID.

  • LineFromWKB(wkb[,srid]), LineStringFromWKB(wkb[,srid])

    Constrói um valor LINESTRING usando sua representação WKB e SRID.

  • PolyFromWKB(wkb[,srid]), PolygonFromWKB(wkb[,srid])

    Constrói um valor POLYGON usando sua representação WKB e SRID.

  • MPointFromWKB(wkb[,srid]), MultiPointFromWKB(wkb[,srid])

    Constrói um valor MULTIPOINT usando sua representação WKB e SRID.

  • MLineFromWKB(wkb[,srid]), MultiLineStringFromWKB(wkb[,srid])

    Constrói um valor MULTILINESTRING usando sua representação WKB e SRID.

  • MPolyFromWKB(wkb[,srid]), MultiPolygonFromWKB(wkb[,srid])

    Constrói um valor MULTIPOLYGON usando sua representação WKB e SRID.

  • GeomCollFromWKB(wkb[,srid]), GeometryCollectionFromWKB(wkt[,srid])

    Constrói um valor GEOMETRYCOLLECTION usando sua representação WKB e SRID.

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 MySQL ainda não implementou estas funções:

  • BdPolyFromWKB(wkb,srid)

    Constrói um valor Polygon a partir de um valor MultiLineString no formato WKB contendo uma coleção arbitrária de valores LineString fechados.

  • BdMPolyFromWKB(wkb,srid)

    Constrói um valor MultiPolygon a partir de um valor MultiLineString no formato WKB contendo uma coleção arbitrária de valores LineString fechados.

10.4.2.3. Criando uma Valor de Geometira Usando Funções Específicas do MySQL

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

O MySQL 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 MySQL 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().

  • Point(x,y)

    Constrói um Point WKB usando suas cooerdenadas.

  • MultiPoint(pt1,pt2,...)

    Constrói um MultiPoint WKB usando WKBPoints. Quando o argumento não é Point WKB, o valor de retorno é NULL.

  • LineString(pt1,pt2,...)

    Constrói um LineString WKB de um número de Points WKB. Quando o argumento não é Point WKB, o valor de retorno é NULL. Quando o número de Points é menor que dois o valor de retorno é NULL.

  • MultiLineString(WKBLineString,WKBLineString,...,WKBLineString)

    Constrói um MultiLineString WKB usando LineStrings WKB. Quando o argumento não é LineString WKB, o valor de retorno é NULL.

  • Polygon(ls1,ls2,...)

    Constrói um Polygon de um número de LineStrings WKB. Quando o arguemnto não representa o WKB de um LinearRing (ex. LineString não fechada e simples) o valor de retorno é NULL.

  • MultiPolygon(poly1,poly2,...)

    Constrói um MultiPolygon WKB de um conjunto de Polygons WKB. Quando o argumento não é um Polygon WKB, o valor de retorno é NULL.

  • GeometryCollection(WKBGeometry,WKBGeometry,..,WKBGeometry)

    Constucts a GeometryCollection WKB. Quando o argumento não é uma representação WKB bem formada de uma geometria, o valor de retorno é NULL.

10.4.3. Criando Colunas Espaciais

O MySQL 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.

  • CREATE TABLE

    Use a instrução CREATE TABLE para criar uma tabela com uma coluna espacial:

    mysql> CREATE TABLE geom (g GEOMETRY);
    Query OK, 0 rows affected (0.02 sec)
    mysql>
    

  • ALTER TABLE

    Use a instrução ALTER TABLE para adicionar ou deletar uma coluna espacial a ou de uma tabela existente:

    mysql> ALTER TABLE geom ADD pt POINT;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    mysql> ALTER TABLE geom DROP pt;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    mysql>
    

10.4.4. 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:

  • Inserindo um Point(1,1) com sintaxe literal hexa:

    INSERT INTO geom VALUES (GeomFromWKB(0x0101000000000000000000F03F000000000000F03F));
    

  • Uma aplicação ODBC pode enviar uma representação WKB, ligando como um argumento do tipo BLOB:

    INSERT INTO geom VALUES (GeomFromWKB(?));
    

    Outra interfaces de programação podem suportar um mecanimo de placeholder similar.

  • Em um programa C, você pode fazer um escape de um valor binário usando mysql_real_escape_string() e incluindo o resultado em string de consulta que é enviada ao servidor. Veja mais informações sobre isto na Seção 12.1.3.44, “mysql_real_escape_string().

10.4.5. Buscando Dados Espaciais

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.

10.4.5.1. 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;

10.4.5.2. 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)

10.4.5.3. 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;