18.4. Crear una base de datos MySQL con capacidades espaciales

MySQL 5.0

18.4. Crear una base de datos MySQL con capacidades espaciales

Esta sección describe los tipos de datos que usted puede utilizar para representar datos espaciales en MySQL, y las funciones disponibles para crear y obtener datos espaciales.

18.4.1. Tipos de datos espaciales de MySQL

MySQL tiene tipos de datos que corresponden a las clases OpenGIS. Algunos de estos tipos almacenan valores geométricos simples:

can store geometry values of any type. The other single-value types, and and , restrict their values to a particular geometry type.

The other data types hold collections of values:

puede almacenar objetos de cualquier tipo. Los otros tipos de colección, y y y , restringen sus miembros a aquellos que sean de un tipo de geometría particular.

18.4.2. Crear valores espaciales

Esta sección explica como crear valores espaciales utilizando funciones Well-Known Text y Well-Known Binary que están definidas en el estándar OpenGIS, y utilizando funciones específicas de MySQL.

18.4.2.1. Crear valores geométricos utilizando funciones WKT

MySQL proporciona algunas funciones que toman como parámetros de entrada una representación Well-Known Text y, opcionalmente, un identificador de sistema de referencia espacial (SRID). Estas funciones retornan la geometía correspondiente.

acepta una representación WKT de cualquier tipo de geometría como primer argumento. Una implementación también provee funciones de construcción específicas de cada tipo para la construcción de valores geométricos de cada tipo de geometría.

  • [,]) , [,])

    Construye un valor utilizando su representación WKT y su SRID.

  • [,]) , [,])

    Construye un valor geométrico de cualquier tipo utilizando su representación WKT y su SRID.

  • [,]) , [,])

    Construye un valor utilizando su representación WKT y su SRID.

  • [,]) , [,])

    Construye un valor utilizando su representación WKT y su SRID.

  • [,]) , [,])

    Construye un valor utilizando su representación WKT y su SRID.

  • [,]) , [,])

    Construye un valor utilizando su representación WKT y su SRID.

  • [,])

    Construye un valor utilizando su representación WKT y su SRID.

  • [,]) , [,])

    Construye un valor utilizando su representación WKT y su SRID.

La especificación OpenGIS también describe funciones opcionales para construir valores o basados en la representación WKT de una colección de anillos o valores cerrados. Estos valores pueden interseccionarse. MySQL no implementa estas funciones:

  • ,)

    Construye un valor desde un valor en formato WKT conteniendo una colección arbitraria de valores cerrados.

  • ,)

    Construye un valor desde un valor en formato WKT conteniendo una colección arbitraria de valores cerrados.

18.4.2.2. Crear valores geométricos utilizando funciones WKB

MySQL provee de varias funciones que toman como parámetros de entrada un que contiene una representación Well-Known Binary y, opcionalmente, un identificador de sistema de referencia espacial (SRID). Éstas retornan la geometría correspondiente.

accepts a WKB of any geometry type as its first argument. An implementation also provides type-specific construction functions for construction of geometry values of each geometry type.

  • [,]) , [,])

    Construye un valor utilizando su representación WKB y su SRID.

  • [,]) , [,])

    Construye un valor geométrico de cualquier tipo utilizando su representación WKB y su SRID.

  • [,]) , [,])

    Construye un valor utilizando su representación WKB y su SRID.

  • [,]) , [,])

    Construye un valor utilizando su representación WKB y su SRID.

  • [,]) , [,])

    Construye un valor utilizando su representación WKB y su SRID.

  • [,]) , [,])

    Construye un valor utilizando su representación WKB y su SRID.

  • [,])

    Construye un valor utilizando su representación WKB y su SRID.

  • [,]) , [,])

    Construye un valor utilizando su representación WKB y su SRID.

La especificación OpenGIS también describe funciones opcionales para construir valores o basándose en la representación WKB de una colección de anillos o valores cerrados. Estos valores puede interseccionarse. MySQL no implementa estas funciones:

  • ,)

    Construye un valor desde un valor en formato WKB que contiene una colección arbitraria de valores cerrados.

  • ,)

    Construye un valor desde un valor en formato WKB que contiene una colección arbitraria de valores cerrados.

18.4.2.3. Crear valores geométricos usando funciones específicas de MySQL

Nota: MySQL no implementa las funciones enumeradas en esta sección.

MySQL le provee de un conjunto de funciones útiles para crear representaciones WKB de geometías. Las funciones descritas en esta sección son extensiones de MySQL a la especificación OpenGIS. Los resultados de estas funciones son valores que contienen representaciones WKB de valores geométricos sin SRID. Los resultados de estas funciones pueden ser sustituidos como primer argumento por cualquier función de la familia de funciones .

  • ,,...)

    Construye una WKB. Si algún argumento no es una representación WKB bien formada de una geometría, el valor retornado es .

  • ,,...)

    Construye un valor WKB desde varios parámetos WKB de tipo . Si alguno de los argumentos no es un WKB, el valor retornado es . Si el número de parámetros es menor de dos, el valor retornado es .

  • ,,...)

    Construye un valor WKB desde varios parámetos WKB de tipo . Si alguno de los argumentos no es un WKB, el valor retornado es .

  • ,,...)

    Construye un valor WKB desde varios parámetos WKB de tipo . Si alguno de los argumentos no es un WKB, el valor retornado es .

  • ,,...)

    Construye un valor WKB desde varios parámetos WKB de tipo . Si alguno de los argumentos no es un WKB, el valor retornado es .

  • ,)

    Construye un WKB utilizando sus coordenadas.

  • ,,...)

    Construye un valor WKB desde varios parámetros WKB. Si alguno de los argumentos no representa el WKB de un (es decir, un que no es cerrado y simple), el valor retornado es .

18.4.3. Crear columnas espaciales

MySQL le provee de una manera estándar de crear columnas espaciales para tipos geométricos, por ejemplo, con o . Actualmente, las columnas espaciales sólo son soportadas por las tablas .

  • Utilice la sentencia para crear una tabla con una columna espacial:

    mysql> CREATE TABLE geom (g GEOMETRY);
    Query OK, 0 rows affected (0.02 sec)
    
  • Utilice la sentencia para añadir o eliminar una columna espacial a o de una tabla ya 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
    

18.4.4. Poblar columnas espaciales

Tras haber creado columnas espaciales, puede poblarlas con datos espaciales.

Los valores deben ser almacenados en formato de geometría internos, pero usted puede convertirlos a ese formato ya sea desde formato Well-Known Text (WKT) o desde formato Well-Known Binary (WKB). Los siguientes ejemplos demuestran cómo insertar valores geométricos en una tabla convirtiendo valores WKT al formato interno de geometrías.

Puede realizar la conversión directamente en la sentencia :

INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'));

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

O puede realizar la conversión previamente al :

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

Los siguientes ejemplos insertan más geometrías complejas en la tabla:

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

Los ejemplos precedentes utilizan todos para crear valores geométricos. También puede utilizar funciones específicas de tipo:

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

Tenga en cuenta que si un programa de aplicación cliente quiere utilizar representaciones WKB de valores geométricos, es responsable de enviar dichas representaciones correctamente formadas en las consultas al servidor. De cualquier modo, hay diversas maneras de satisfacer este requerimiento. Por ejemplo:

  • Insertar un valor con sintaxis hexadecimal literal:

    mysql> INSERT INTO geom VALUES
        -> (GeomFromWKB(0x0101000000000000000000F03F000000000000F03F));
    

  • Una aplicación ODBC puede enviar una representación WKB, encapsulándola en un comodín utilizando un argumento de tipo :

    INSERT INTO geom VALUES (GeomFromWKB(?))
    

    Otras interfaces de programación pueden soportar un sistema de comodines similar.

  • En un programa en C, puede marcar un valor binario utilizando e incluir el resultado en una consulta que se envía al servidor. Consulte Sección 24.3.3.48, “.

18.4.5. Extraer datos espaciales

Los valores geométricos almacenados en una tabla pueden ser extraídos en formato interno. Además puede también convertirlos al formato WKT o al WKB.

18.4.5.1. Extraer datos espaciales en formato interno

Extraer valroes geométricos utilizando el formato interno puede ser útil en transferencias de tabla a tabla:

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

18.4.5.2. Extraer datos espaciales en formato WKT

La función convierte una geometría desde el formato interno a una cadena WKT.

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

18.4.5.3. Recoger datos espaciales en formato WKB

La función convierte una geometría desde el formato interno a un que contiene el valor WKB.

SELECT AsBinary(g) FROM geom;