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
MySQL soporta las siguientes funciones para convertir valores geométricos entre formato interno y los formatos WKT o WKB:
-
AsBinary(g)Convierte un valor en formato interno a su representación WKB y devuelve el resultado binario.
-
AsText(g)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) | +--------------------------+
-
GeomFromText(wkt[,srid])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
PointFromText()yLineFromText(); consulte Sección 18.4.2.1, “Crear valores geométricos utilizando funciones WKT”. -
GeomFromWKB(wkb[,srid])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
PointFromWKB()yLineFromWKB(); consulte Sección 18.4.2.2, “Crear valores geométricos utilizando funciones WKB”.
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
NULL si el argumento es de un tipo geométrico incorrecto.
Por ejemplo, Area() retorna NULL si el tipo
del objeto no es Polygon ni MultiPolygon.
Las funciones enumeradas en esta sección no restringen el tipo de sus argumentos y aceptan cualquier tipo de valor geométrico.
-
Dimension(g)Retorna la dimensión inherente al valor geométrico
g. El resultado puede ser -1, 0, 1, o 2 (El significado de estos valores se explica en Sección 18.2.2, “La claseGeometry”.)mysql> SELECT Dimension(GeomFromText('LineString(1 1,2 2)')); +------------------------------------------------+ | Dimension(GeomFromText('LineString(1 1,2 2)')) | +------------------------------------------------+ | 1 | +------------------------------------------------+ -
Envelope(g)Retorna el rectángulo mínimo que circunscribe (Minimum Bounding Rectangle (MBR)) el valor geométrico
g. El resultado que se retorna es de tipoPolygon.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))
-
GeometryType(g)Retorna en una cadena el nombre del tipo de la geometría de la que la instancia
ges miembro. El nombre corresponde a una de las subclases instanciables deGeometry.mysql> SELECT GeometryType(GeomFromText('POINT(1 1)')); +------------------------------------------+ | GeometryType(GeomFromText('POINT(1 1)')) | +------------------------------------------+ | POINT | +------------------------------------------+ -
SRID(g)Retorna un entero que indica el Identificador de Sistema de Referencia Espacial del valor geométrico
g.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:
-
Boundary(g)Retorna una geometría que es el cierre del límite combinacional del valor geométrico
g. -
IsEmpty(g)Retorna 1 si el valor geométrico
gcorresponde a la geometría vacía, 0 si no está vacía, y -1 si el argumento esNULL. Si la geometría está vacía, representa el conjunto de puntos vacío. -
IsSimple(g)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
gno tiene puntos geométricos anómalos, tales como auto-intersección o auto-tangencia.IsSimple()retorna 0 si el argumento no es simple, y -1 si esNULL.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.
Un Point consiste en sus coordenadas X e Y,
que pueden ser obtenidas utilizando las siguientes funciones:
-
X(p)Retorna el valor de la coordenada X del punto
pcomo 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 | +--------------------------------------+ -
Y(p)Retorna el valor de la coordenada Y del punto
pcomo 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 | +--------------------------------------+
Un LineString se compone de valores Point.
Puede extraer valores particulares de dentro de una LineString,
contar los puntos que contiene u obtener su longitud.
-
EndPoint(ls)Devuelve el
Pointque es el punto final del valorLineStringls.mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT AsText(EndPoint(GeomFromText(@ls))); +-------------------------------------+ | AsText(EndPoint(GeomFromText(@ls))) | +-------------------------------------+ | POINT(3 3) | +-------------------------------------+
-
GLength(ls)Devuelve la longitud del valor
LineStringlscomo 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 | +----------------------------+
-
IsClosed(ls)Retorna 1 si el valor
LineStringlses cerrado (es decir, su punto inicialStartPoint()y punto finalEndPoint()tienen el mismo valor). Retorna 0 silses no cerrado, y -1 si esNULL.mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT IsClosed(GeomFromText(@ls)); +-----------------------------+ | IsClosed(GeomFromText(@ls)) | +-----------------------------+ | 0 | +-----------------------------+
-
NumPoints(ls)Retorna el número de puntos en el valor
LineStringls.mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT NumPoints(GeomFromText(@ls)); +------------------------------+ | NumPoints(GeomFromText(@ls)) | +------------------------------+ | 3 | +------------------------------+
-
PointN(ls,n)Retorna el punto e-
n-ésimo en el valorLinestringls. 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) | +-------------------------------------+
-
StartPoint(ls)Retorna el
Pointque es el punto inicial del valorLineStringls.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:
-
GLength(mls)Retorna la longitud del valor
MultiLineStringmlscomo un entero de doble precisión. La longitud demlses 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 | +-----------------------------+
-
IsClosed(mls)Retorna 1 si el valor
MultiLineStringmlses cerrado (es decir, los valores del punto inicial y el punto final de cadaLineStringenmlsson iguales entre sí). Retorna 0 simlses no cerrado, y -1 si esNULL.mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))'; mysql> SELECT IsClosed(GeomFromText(@mls)); +------------------------------+ | IsClosed(GeomFromText(@mls)) | +------------------------------+ | 0 | +------------------------------+
-
Area(poly)Retorna, como número de doble precisión, el área del valor
Polygonpoly, 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 | +---------------------------+
-
ExteriorRing(poly)Retorna el anillo exterior del valor
Polygonpolycomo unLineString.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) | +-------------------------------------------+ -
InteriorRingN(poly,n)Retorna el e-
n-ésimo anillo interior del valorPolygonpolycomo unLineString. 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) | +----------------------------------------------+ -
NumInteriorRings(poly)Retorna el número de anillos interiores en el valor
Polygonpoly.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 | +---------------------------------------+
-
Area(mpoly)Retorna, como un número de doble precisión, el área del valor
MultiPolygonmpoly, 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:
-
GeometryN(gc,n)Retorna la e-
n-ésima geometría en el valorGeometryCollectiongc. 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) | +----------------------------------------+
-
NumGeometries(gc)Retorna el número de geometrías contenidas en la
GeometryCollectiongc.mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2 2, 3 3))'; mysql> SELECT NumGeometries(GeomFromText(@gc)); +----------------------------------+ | NumGeometries(GeomFromText(@gc)) | +----------------------------------+ | 2 | +----------------------------------+
En la sección Sección 18.5.2, “Funciones Geometry”, hemos revisado algunas funciones
que pueden construir nuevas geometrías a partir de otras ya existentes:
-
Envelope(g) -
StartPoint(ls) -
EndPoint(ls) -
PointN(ls,n) -
ExteriorRing(poly) -
InteriorRingN(poly,n) -
GeometryN(gc,n)
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.
-
Buffer(g,d)Retorna una geometría que representa todos los puntos cuya distancia hasta el valor geométrico
ges menor o igual a la distanciad. -
ConvexHull(g)Retorna una geometría que representa el borde convexo del valor geométrico
g. -
Difference(g1,g2)Retorna una geometría que representa el conjunto de puntos resultado de la resta de los valores geométricos
g1yg2. -
Intersection(g1,g2)Retorna una geometría que representa el conjunto de puntos resultado de la intersección de los valores geométricos
g1yg2. -
SymDifference(g1,g2)Retorna una geometría que representa el conjunto de puntos resultado de la resta simétrica de los valores geométricos
g1yg2. -
Union(g1,g2)Retorna una geometría que representa el conjunto de puntos resultado de la unión de los valores geométricos
g1yg2.
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.
MySQL le provee con algunas funciones que pueden comprobar relaciones entre los rectángulos mínimos
que circunscriben a dos geometrías g1 y g2. Entre ellas se
incluyen:
-
MBRContains(g1,g2)Retorna 1 o 0 para indicar si el rectángulo mínimo que circunscribe a
g1contiene, o no, al rectángulo mínimo que circunscribe ag2.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 | +----------------------+----------------------+ -
MBRDisjoint(g1,g2)Retorna 1 o 0 para indicar si los rectángulos mínimos que circunscriben a las geometrías
g1yg2son disjuntas (no se interseccionan), o no. -
MBREqual(g1,g2)Retorna 1 o 0 para indicar si el rectángulo mínimo que circunscribe a las dos geometrías
g1yg2es o no es el mismo. -
MBRIntersects(g1,g2)Retorna 1 o 0 para indicar si los rectángulos mínimos que circunscriben a las geometrías
g1yg2se interseccionan o no. -
MBROverlaps(g1,g2)Retorna 1 o 0 para indicar si los rectángulos mínimos que circunscriben a las geometrías
g1yg2se sobreponen o no. -
MBRTouches(g1,g2)Retorna 1 o 0 para indicar si los rectángulos mínimos que circunscriben a las geometrías
g1yg2se tocan o no. -
MBRWithin(g1,g2)Retorna 1 o 0 para indicar si el rectángulo mínimo que circunscribe a la geometría
g1se encuentra o no dentro del rectángulo mínimo que circunscribe a la geometríag2.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 | +--------------------+--------------------+
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 Distance()
y Related().
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
g1 and g2.
-
Contains(g1,g2)Retorna 1 o 0 para indicar si
g1contiene completamente o no ag2. -
Crosses(g1,g2)Retorna 1 si
g1cruza espacialmente ag2. RetornaNULLsig1es unPolygono unMultiPolygon, o sig2es unPointo unMultiPoint. 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.
-
-
Disjoint(g1,g2)Retorna 1 o 0 para indicar si
g1es o no espacialmente disjunto (no intersecciona) cong2. -
Distance(g1,g2)Retorna un número de doble precisión que representa la distancia más corta entre los puntos de ambas geometrías.
-
Equals(g1,g2)Retorna 1 o 0 para indicar si
g1es o no igual espacialmente ag2. -
Intersects(g1,g2)Retorna 1 o 0 para indicar si
g1intersecciona espacialmente cong2. -
Overlaps(g1,g2)Retorna 1 o 0 para indicar si
g1se superpone espacialmente o no ag2. 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. -
Related(g1,g2,pattern_matrix)Retorna 1 o 0 paa indicar si la relación espacial especificada por
pattern_matrixexiste entreg1yg2. Retorna -1 si los argumentos sonNULL. La matriz de patrones (pattern_matrix) es una cadena. Su especificación se explicará aquí si la función llega a ser implementada. -
Touches(g1,g2)Retorna 1 o 0 para indicar si
g1toca espacialmente o no ag2. 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. -
Within(g1,g2)Retorna 1 o 0 para indicar si
g1está o no espacialmente dentro deg2.