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
g
es 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
g
corresponde 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
g
no 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
p
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 | +--------------------------------------+
-
Y(
p
)Retorna el valor de la coordenada Y del punto
p
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 | +--------------------------------------+
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
Point
que es el punto final del valorLineString
ls
.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
LineString
ls
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 | +----------------------------+
-
IsClosed(
ls
)Retorna 1 si el valor
LineString
ls
es cerrado (es decir, su punto inicialStartPoint()
y punto finalEndPoint()
tienen el mismo valor). Retorna 0 sils
es 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
LineString
ls
.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 valorLinestring
ls
. 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
Point
que es el punto inicial del valorLineString
ls
.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
MultiLineString
mls
como un entero de doble precisión. La longitud demls
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 | +-----------------------------+
-
IsClosed(
mls
)Retorna 1 si el valor
MultiLineString
mls
es cerrado (es decir, los valores del punto inicial y el punto final de cadaLineString
enmls
son iguales entre sí). Retorna 0 simls
es 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
Polygon
poly
, 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
Polygon
poly
como 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 valorPolygon
poly
como 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
Polygon
poly
.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
MultiPolygon
mpoly
, 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 valorGeometryCollection
gc
. 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
GeometryCollection
gc
.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
g
es 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
g1
yg2
. -
Intersection(
g1
,g2
)Retorna una geometría que representa el conjunto de puntos resultado de la intersección de los valores geométricos
g1
yg2
. -
SymDifference(
g1
,g2
)Retorna una geometría que representa el conjunto de puntos resultado de la resta simétrica de los valores geométricos
g1
yg2
. -
Union(
g1
,g2
)Retorna una geometría que representa el conjunto de puntos resultado de la unión de los valores geométricos
g1
yg2
.
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
g1
contiene, 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
g1
yg2
son 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
g1
yg2
es 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
g1
yg2
se interseccionan o no. -
MBROverlaps(
g1
,g2
)Retorna 1 o 0 para indicar si los rectángulos mínimos que circunscriben a las geometrías
g1
yg2
se sobreponen o no. -
MBRTouches(
g1
,g2
)Retorna 1 o 0 para indicar si los rectángulos mínimos que circunscriben a las geometrías
g1
yg2
se tocan o no. -
MBRWithin(
g1
,g2
)Retorna 1 o 0 para indicar si el rectángulo mínimo que circunscribe a la geometría
g1
se 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
g1
contiene completamente o no ag2
. -
Crosses(
g1
,g2
)Retorna 1 si
g1
cruza espacialmente ag2
. RetornaNULL
sig1
es unPolygon
o unMultiPolygon
, o sig2
es unPoint
o 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
g1
es 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
g1
es o no igual espacialmente ag2
. -
Intersects(
g1
,g2
)Retorna 1 o 0 para indicar si
g1
intersecciona espacialmente cong2
. -
Overlaps(
g1
,g2
)Retorna 1 o 0 para indicar si
g1
se 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_matrix
existe entreg1
yg2
. 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
g1
toca 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
g1
está o no espacialmente dentro deg2
.