18.5. Analizar información espacial

MySQL 5.0

18.5. Analizar información espacial

Tras haber poblado las columnas espaciales con valores, usted está listo para consultarlos y analizarlos. MySQL provee de una serie de funciones para realizar diversas operaciones sobre datos espaciales. Estas funciones pueden ser agrupadas en cuatro categorías principales de acuerdo con el tipo de operación que realizan:

  • Funciones que convierten las geometrías a diversos formatos

  • Funciones que proveen de acceso a propiedades cuantitativas o cualitativas de una geometría

  • Funciones que describen relaciones entre dos geometrías

  • Funciones que crean nuevas geometrías desde otras ya existentes

Las funciones de análisis espacial pueden ser utilizadas en muchos y muy diferentes contextos, tales como:

  • Cualquier programa SQL interactivo, como mysql o MySQLCC

  • Programas de aplicación escritos en cualquier lenguaje que soporte una API cliente de MySQL

18.5.1. Funciones de conversión de formato geométrico

MySQL soporta las siguientes funciones para convertir valores geométricos entre formato interno y los formatos WKT o WKB:

  • )

    Convierte un valor en formato interno a su representación WKB y devuelve el resultado binario.

  • )

    Convierte un valor en formato interno a su representación WKT y devuelve la cadena resultante.

    mysql> SET @g = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(GeomFromText(@g));
    +--------------------------+
    | AsText(GeomFromText(@G)) |
    +--------------------------+
    | LINESTRING(1 1,2 2,3 3)  |
    +--------------------------+
    

  • [,])

    Convierte un valor de texto desde su representación WKT al formato interno de geometría y retorna el resultado. También hay varias funciones específicas de cada tipo que están disponibles, tales como y ; consulte Sección 18.4.2.1, “Crear valores geométricos utilizando funciones WKT”.

  • [,])

    Convierte un valor binario desde su representación WKB al formato interno de geometría y retorna el resultado. También hay varias funciones específicas de cada tipo que están disponibles, tales como y ; consulte Sección 18.4.2.2, “Crear valores geométricos utilizando funciones WKB”.

18.5.2. Funciones Geometry

Cada función que pertenece a este grupo toma un valor geométrico como su primer argumento y retorna alguna propiedad cuantitativa o cualitativa de la geometría. Algunas funciones restringen el tipo de sus argumentos. Dichas funciones retornan si el argumento es de un tipo geométrico incorrecto. Por ejemplo, retorna si el tipo del objeto no es ni .

18.5.2.1. Funciones generales de geometría

Las funciones enumeradas en esta sección no restringen el tipo de sus argumentos y aceptan cualquier tipo de valor geométrico.

  • )

    Retorna la dimensión inherente al valor geométrico . El resultado puede ser -1, 0, 1, o 2 (El significado de estos valores se explica en Sección 18.2.2, “La clase .)

    mysql> SELECT Dimension(GeomFromText('LineString(1 1,2 2)'));
    +------------------------------------------------+
    | Dimension(GeomFromText('LineString(1 1,2 2)')) |
    +------------------------------------------------+
    |                                              1 |
    +------------------------------------------------+
    

  • )

    Retorna el rectángulo mínimo que circunscribe (Minimum Bounding Rectangle (MBR)) el valor geométrico . El resultado que se retorna es de tipo .

    mysql> SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)')));
    +-------------------------------------------------------+
    | AsText(Envelope(GeomFromText('LineString(1 1,2 2)'))) |
    +-------------------------------------------------------+
    | POLYGON((1 1,2 1,2 2,1 2,1 1))                        |
    +-------------------------------------------------------+
    

    El polígono está definido por los puntos de la esquina de la caja que lo circunscribe:

    POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
    

  • )

    Retorna en una cadena el nombre del tipo de la geometría de la que la instancia es miembro. El nombre corresponde a una de las subclases instanciables de .

    mysql> SELECT GeometryType(GeomFromText('POINT(1 1)'));
    +------------------------------------------+
    | GeometryType(GeomFromText('POINT(1 1)')) |
    +------------------------------------------+
    | POINT                                    |
    +------------------------------------------+
    

  • )

    Retorna un entero que indica el Identificador de Sistema de Referencia Espacial del valor geométrico .

    En MySQL, el valor SRID es simplemente un entero asociado con el valor geometrico. Todos los cálculos se realizan asumiendo una geometría Euclídea (planar).

    mysql> SELECT SRID(GeomFromText('LineString(1 1,2 2)',101));
    +-----------------------------------------------+
    | SRID(GeomFromText('LineString(1 1,2 2)',101)) |
    +-----------------------------------------------+
    |                                           101 |
    +-----------------------------------------------+
    

La especificación OpenGIS también define las siguientes funciones, que MySQL no implementa:

  • )

    Retorna una geometría que es el cierre del límite combinacional del valor geométrico .

  • )

    Retorna 1 si el valor geométrico corresponde a la geometría vacía, 0 si no está vacía, y -1 si el argumento es . Si la geometría está vacía, representa el conjunto de puntos vacío.

  • )

    Actualmente esta función es un comodín y no debería ser utilizada. Si se implementara, su comportamiento será como el que se detalla en el siguiente párrafo.

    Retorna 1 si el valor geométrico no tiene puntos geométricos anómalos, tales como auto-intersección o auto-tangencia. retorna 0 si el argumento no es simple, y -1 si es .

    La descripción de cada clase geométrica instanciable mencionada anteriormente en este capítulo incluye las condiciones específicas que provcan que una instancia de una clase sea clasificada como no simple.

18.5.2.2. Funciones

Un consiste en sus coordenadas X e Y, que pueden ser obtenidas utilizando las siguientes funciones:

  • )

    Retorna el valor de la coordenada X del punto como un número de doble precisión.

    mysql> SELECT X(GeomFromText('Point(56.7 53.34)'));
    +--------------------------------------+
    | X(GeomFromText('Point(56.7 53.34)')) |
    +--------------------------------------+
    |                                 56.7 |
    +--------------------------------------+
    

  • )

    Retorna el valor de la coordenada Y del punto como un número de doble precisión.

    mysql> SELECT Y(GeomFromText('Point(56.7 53.34)'));
    +--------------------------------------+
    | Y(GeomFromText('Point(56.7 53.34)')) |
    +--------------------------------------+
    |                                53.34 |
    +--------------------------------------+
    

18.5.2.3. Funciones

Un se compone de valores . Puede extraer valores particulares de dentro de una , contar los puntos que contiene u obtener su longitud.

  • )

    Devuelve el que es el punto final del valor .

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(EndPoint(GeomFromText(@ls)));
    +-------------------------------------+
    | AsText(EndPoint(GeomFromText(@ls))) |
    +-------------------------------------+
    | POINT(3 3)                          |
    +-------------------------------------+
    

  • )

    Devuelve la longitud del valor como un número de doble precisión en su sistema de referencia espacial asociado.

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT GLength(GeomFromText(@ls));
    +----------------------------+
    | GLength(GeomFromText(@ls)) |
    +----------------------------+
    |            2.8284271247462 |
    +----------------------------+
    

  • )

    Retorna 1 si el valor es cerrado (es decir, su punto inicial y punto final tienen el mismo valor). Retorna 0 si es no cerrado, y -1 si es .

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT IsClosed(GeomFromText(@ls));
    +-----------------------------+
    | IsClosed(GeomFromText(@ls)) |
    +-----------------------------+
    |                           0 |
    +-----------------------------+
    

  • )

    Retorna el número de puntos en el valor .

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT NumPoints(GeomFromText(@ls));
    +------------------------------+
    | NumPoints(GeomFromText(@ls)) |
    +------------------------------+
    |                            3 |
    +------------------------------+
    

  • ,)

    Retorna el punto e--ésimo en el valor . Los números de punto comienzan por 1.

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(PointN(GeomFromText(@ls),2));
    +-------------------------------------+
    | AsText(PointN(GeomFromText(@ls),2)) |
    +-------------------------------------+
    | POINT(2 2)                          |
    +-------------------------------------+
    

  • )

    Retorna el que es el punto inicial del valor .

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(StartPoint(GeomFromText(@ls)));
    +---------------------------------------+
    | AsText(StartPoint(GeomFromText(@ls))) |
    +---------------------------------------+
    | POINT(1 1)                            |
    +---------------------------------------+
    

La especificación OpenGIS también define la siguiente función, que MySQL no implementa:

  • )

    Retorna 1 si el valor es cerrado (es decir, que sus puntos inicial y final tienen el mismo valor) y es simple (no pasa a través del mismo punto más de una vez). Retorna 0 si no es un anillo, y -1 si es .

18.5.2.4. Funciones

  • )

    Retorna la longitud del valor como un entero de doble precisión. La longitud de es igual a la suma de las longitudes de sus elementos.

    mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))';
    mysql> SELECT GLength(GeomFromText(@mls));
    +-----------------------------+
    | GLength(GeomFromText(@mls)) |
    +-----------------------------+
    |             4.2426406871193 |
    +-----------------------------+
    

  • )

    Retorna 1 si el valor es cerrado (es decir, los valores del punto inicial y el punto final de cada en son iguales entre sí). Retorna 0 si es no cerrado, y -1 si es .

    mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))';
    mysql> SELECT IsClosed(GeomFromText(@mls));
    +------------------------------+
    | IsClosed(GeomFromText(@mls)) |
    +------------------------------+
    |                            0 |
    +------------------------------+
    

18.5.2.5. Funciones

  • )

    Retorna, como número de doble precisión, el área del valor , medido en su sistema de referencia espacial.

    mysql> SET @poly = 'Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1 1))';
    mysql> SELECT Area(GeomFromText(@poly));
    +---------------------------+
    | Area(GeomFromText(@poly)) |
    +---------------------------+
    |                         4 |
    +---------------------------+
    

  • )

    Retorna el anillo exterior del valor como un .

    mysql> SET @poly =
        -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';
    mysql> SELECT AsText(ExteriorRing(GeomFromText(@poly)));
    +-------------------------------------------+
    | AsText(ExteriorRing(GeomFromText(@poly))) |
    +-------------------------------------------+
    | LINESTRING(0 0,0 3,3 3,3 0,0 0)           |
    +-------------------------------------------+
    

  • ,)

    Retorna el e--ésimo anillo interior del valor como un . Los números de anillo comienzan en 1.

    mysql> SET @poly =
        -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';
    mysql> SELECT AsText(InteriorRingN(GeomFromText(@poly),1));
    +----------------------------------------------+
    | AsText(InteriorRingN(GeomFromText(@poly),1)) |
    +----------------------------------------------+
    | LINESTRING(1 1,1 2,2 2,2 1,1 1)              |
    +----------------------------------------------+
    

  • )

    Retorna el número de anillos interiores en el valor .

    mysql> SET @poly =
        -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';
    mysql> SELECT NumInteriorRings(GeomFromText(@poly));
    +---------------------------------------+
    | NumInteriorRings(GeomFromText(@poly)) |
    +---------------------------------------+
    |                                     1 |
    +---------------------------------------+
    

18.5.2.6. Funciones

  • )

    Retorna, como un número de doble precisión, el área del valor , medido en su sistema de referencia espacial.

    mysql> SET @mpoly =
        -> 'MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))';
    mysql> SELECT Area(GeomFromText(@mpoly));
    +----------------------------+
    | Area(GeomFromText(@mpoly)) |
    +----------------------------+
    |                          8 |
    +----------------------------+
    

La especificación OpenGIS también define las siguientes funciones, que MySQL no implementa:

  • )

    Retorna el centroide matemático del valor como un . Este resultado no está garantizado que esté contenido en el .

  • )

    Retorna un valor del que se garantiza que está en el valor del .

18.5.2.7. Funciones

  • ,)

    Retorna la e--ésima geometría en el valor . Los números de geometría comienzan por 1.

    mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2 2, 3 3))';
    mysql> SELECT AsText(GeometryN(GeomFromText(@gc),1));
    +----------------------------------------+
    | AsText(GeometryN(GeomFromText(@gc),1)) |
    +----------------------------------------+
    | POINT(1 1)                             |
    +----------------------------------------+
    

  • )

    Retorna el número de geometrías contenidas en la .

    mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2 2, 3 3))';
    mysql> SELECT NumGeometries(GeomFromText(@gc));
    +----------------------------------+
    | NumGeometries(GeomFromText(@gc)) |
    +----------------------------------+
    |                                2 |
    +----------------------------------+
    

18.5.3. Funciones que crean nuevas geometrías a partir de unas existentes

18.5.3.1. Funciones geométricas que producen nuevas geometrías

En la sección Sección 18.5.2, “Funciones , hemos revisado algunas funciones que pueden construir nuevas geometrías a partir de otras ya existentes:

  • )

  • )

  • )

  • ,)

  • )

  • ,)

  • ,)

18.5.3.2. Operadores espaciales

OpenGIS propone varias funciones adicionales que pueden producir geometrías. Están diseñadas para implementar operadores espaciales.

Estas funciones no están implementadas en MySQL. Puede ser que aparezcan en futuras versiones.

  • ,)

    Retorna una geometría que representa todos los puntos cuya distancia hasta el valor geométrico es menor o igual a la distancia .

  • )

    Retorna una geometría que representa el borde convexo del valor geométrico .

  • ,)

    Retorna una geometría que representa el conjunto de puntos resultado de la resta de los valores geométricos y .

  • ,)

    Retorna una geometría que representa el conjunto de puntos resultado de la intersección de los valores geométricos y .

  • ,)

    Retorna una geometría que representa el conjunto de puntos resultado de la resta simétrica de los valores geométricos y .

  • ,)

    Retorna una geometría que representa el conjunto de puntos resultado de la unión de los valores geométricos y .

18.5.4. Funciones para probar relaciones espaciales entre objetos geométricos

Las funciones descritas en estas secciones toman dos geometrías como parámetros de entrada y retornan una relación cuantitativa o cualitativa entre ellas.

18.5.5. Relaciones entre rectángulos MBR (Minimal Bounding Rectangles)

MySQL le provee con algunas funciones que pueden comprobar relaciones entre los rectángulos mínimos que circunscriben a dos geometrías y . Entre ellas se incluyen:

  • ,)

    Retorna 1 o 0 para indicar si el rectángulo mínimo que circunscribe a contiene, o no, al rectángulo mínimo que circunscribe a .

    mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
    mysql> SET @g2 = GeomFromText('Point(1 1)');
    mysql> SELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);
    ----------------------+----------------------+
    | MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |
    +----------------------+----------------------+
    |                    1 |                    0 |
    +----------------------+----------------------+
    

  • ,)

    Retorna 1 o 0 para indicar si los rectángulos mínimos que circunscriben a las geometrías y son disjuntas (no se interseccionan), o no.

  • ,)

    Retorna 1 o 0 para indicar si el rectángulo mínimo que circunscribe a las dos geometrías y es o no es el mismo.

  • ,)

    Retorna 1 o 0 para indicar si los rectángulos mínimos que circunscriben a las geometrías y se interseccionan o no.

  • ,)

    Retorna 1 o 0 para indicar si los rectángulos mínimos que circunscriben a las geometrías y se sobreponen o no.

  • ,)

    Retorna 1 o 0 para indicar si los rectángulos mínimos que circunscriben a las geometrías y se tocan o no.

  • ,)

    Retorna 1 o 0 para indicar si el rectángulo mínimo que circunscribe a la geometría se encuentra o no dentro del rectángulo mínimo que circunscribe a la geometría .

    mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
    mysql> SET @g2 = GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))');
    mysql> SELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);
    +--------------------+--------------------+
    | MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |
    +--------------------+--------------------+
    |                  1 |                  0 |
    +--------------------+--------------------+
    

18.5.6. Funciones que prueban relaciones espaciales entre geometrías

La especificación OpenGIS define las siguientes funciones. Actualmente, MySQL no las implementa de acuerdo a la especificación. Aquéllas que están implementadas retornan el mismo resultado que las funciones basadas en MBR correspondientes. Esto incluye a las funciones de la siguiente lista, además de y .

Estas funciones pueden ser implementadas en futuras versiones con soporte completo para análisis espacial, y no sólo soporte basado en MBR.

Estas funciones operan sobre dos valores geométricos and .

  • ,)

    Retorna 1 o 0 para indicar si contiene completamente o no a .

  • ,)

    Retorna 1 si cruza espacialmente a . Retorna si es un o un , o si es un o un . En cualquier otro caso, retorna 0.

    El término cruza espacialmente denota una relación espacial entre dos geometrías dadas que tiene las siguientes propiedades:

    • Las dos geometrías se interseccionan

    • La intersección resulta en una geometría que tiene una dimensión que es una unidad menor que la dimensión máxima de las dos geometrías dadas

    • Su intersección no es igual a ninguna de las dos geometrías dadas.

  • ,)

    Retorna 1 o 0 para indicar si es o no espacialmente disjunto (no intersecciona) con .

  • ,)

    Retorna un número de doble precisión que representa la distancia más corta entre los puntos de ambas geometrías.

  • ,)

    Retorna 1 o 0 para indicar si es o no igual espacialmente a .

  • ,)

    Retorna 1 o 0 para indicar si intersecciona espacialmente con .

  • ,)

    Retorna 1 o 0 para indicar si se superpone espacialmente o no a . El término superpone espacialmente se utiliza si dos geometrías interseccionan y la intersección resultante es una geometría de las mismas dimensiones pero no igual a ninguna de las geometrías dadas.

  • ,,)

    Retorna 1 o 0 paa indicar si la relación espacial especificada por existe entre y . Retorna -1 si los argumentos son . La matriz de patrones (pattern_matrix) es una cadena. Su especificación se explicará aquí si la función llega a ser implementada.

  • ,)

    Retorna 1 o 0 para indicar si toca espacialmente o no a . Dos geometrías se tocan espacialmente si los interiores de las dos geometrías no interseccionan, pero el límite de una de ellas intersecciona con el límite o el interior de la otra.

  • ,)

    Retorna 1 o 0 para indicar si está o no espacialmente dentro de .