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.
MySQL tiene tipos de datos que corresponden a las clases OpenGIS. Algunos de estos tipos almacenan valores geométricos simples:
-
GEOMETRY
-
POINT
-
LINESTRING
-
POLYGON
GEOMETRY
can store geometry values of any
type. The other single-value types, POINT
and
LINESTRING
and POLYGON
,
restrict their values to a particular geometry type.
The other data types hold collections of values:
-
MULTIPOINT
-
MULTILINESTRING
-
MULTIPOLYGON
-
GEOMETRYCOLLECTION
GEOMETRYCOLLECTION
puede almacenar objetos
de cualquier tipo. Los otros tipos de colección,
MULTIPOINT
y
MULTILINESTRING
y
MULTIPOLYGON
y
GEOMETRYCOLLECTION
, restringen sus miembros
a aquellos que sean de un tipo de geometría particular.
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.
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.
GeomFromText()
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.
-
GeomCollFromText(
wkt
[,srid
]) ,GeometryCollectionFromText(
wkt
[,srid
])Construye un valor
GEOMETRYCOLLECTION
utilizando su representación WKT y su SRID. -
GeomFromText(
wkt
[,srid
]) ,GeometryFromText(
wkt
[,srid
])Construye un valor geométrico de cualquier tipo utilizando su representación WKT y su SRID.
-
LineFromText(
wkt
[,srid
]) ,LineStringFromText(
wkt
[,srid
])Construye un valor
LINESTRING
utilizando su representación WKT y su SRID. -
MLineFromText(
wkt
[,srid
]) ,MultiLineStringFromText(
wkt
[,srid
])Construye un valor
MULTILINESTRING
utilizando su representación WKT y su SRID. -
MPointFromText(
wkt
[,srid
]) ,MultiPointFromText(
wkt
[,srid
])Construye un valor
MULTIPOINT
utilizando su representación WKT y su SRID. -
MPolyFromText(
wkt
[,srid
]) ,MultiPolygonFromText(
wkt
[,srid
])Construye un valor
MULTIPOLYGON
utilizando su representación WKT y su SRID. -
PointFromText(
wkt
[,srid
])Construye un valor
POINT
utilizando su representación WKT y su SRID. -
PolyFromText(
wkt
[,srid
]) ,PolygonFromText(
wkt
[,srid
])Construye un valor
POLYGON
utilizando su representación WKT y su SRID.
La especificación OpenGIS también describe funciones opcionales para construir
valores Polygon
o MultiPolygon
basados en la representación WKT de una colección de anillos o
valores LineString
cerrados. Estos valores
pueden interseccionarse. MySQL no implementa estas funciones:
-
BdMPolyFromText(
wkt
,srid
)Construye un valor
MultiPolygon
desde un valorMultiLineString
en formato WKT conteniendo una colección arbitraria de valoresLineString
cerrados. -
BdPolyFromText(
wkt
,srid
)Construye un valor
Polygon
desde un valorMultiLineString
en formato WKT conteniendo una colección arbitraria de valoresLineString
cerrados.
MySQL provee de varias funciones que toman como parámetros de entrada un BLOB
que contiene una representación Well-Known
Binary y, opcionalmente, un identificador de sistema de referencia espacial (SRID). Éstas retornan la geometría correspondiente.
GeomFromWKB()
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.
-
GeomCollFromWKB(
wkb
[,srid
]) ,GeometryCollectionFromWKB(
wkb
[,srid
])Construye un valor
GEOMETRYCOLLECTION
utilizando su representación WKB y su SRID. -
GeomFromWKB(
wkb
[,srid
]) ,GeometryFromWKB(
wkb
[,srid
])Construye un valor geométrico de cualquier tipo utilizando su representación WKB y su SRID.
-
LineFromWKB(
wkb
[,srid
]) ,LineStringFromWKB(
wkb
[,srid
])Construye un valor
LINESTRING
utilizando su representación WKB y su SRID. -
MLineFromWKB(
wkb
[,srid
]) ,MultiLineStringFromWKB(
wkb
[,srid
])Construye un valor
MULTILINESTRING
utilizando su representación WKB y su SRID. -
MPointFromWKB(
wkb
[,srid
]) ,MultiPointFromWKB(
wkb
[,srid
])Construye un valor
MULTIPOINT
utilizando su representación WKB y su SRID. -
MPolyFromWKB(
wkb
[,srid
]) ,MultiPolygonFromWKB(
wkb
[,srid
])Construye un valor
MULTIPOLYGON
utilizando su representación WKB y su SRID. -
PointFromWKB(
wkb
[,srid
])Construye un valor
POINT
utilizando su representación WKB y su SRID. -
PolyFromWKB(
wkb
[,srid
]) ,PolygonFromWKB(
wkb
[,srid
])Construye un valor
POLYGON
utilizando su representación WKB y su SRID.
La especificación OpenGIS también describe funciones opcionales para construir
valores Polygon
o MultiPolygon
basándose
en la representación WKB de una colección de anillos o valores LineString
cerrados. Estos valores puede interseccionarse.
MySQL no implementa estas funciones:
-
BdMPolyFromWKB(
wkb
,srid
)Construye un valor
MultiPolygon
desde un valorMultiLineString
en formato WKB que contiene una colección arbitraria de valoresLineString
cerrados. -
BdPolyFromWKB(
wkb
,srid
)Construye un valor
Polygon
desde un valorMultiLineString
en formato WKB que contiene una colección arbitraria de valoresLineString
cerrados.
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 BLOB
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 GeomFromWKB()
.
-
GeometryCollection(
g1
,g2
,...)Construye una
GeometryCollection
WKB. Si algún argumento no es una representación WKB bien formada de una geometría, el valor retornado esNULL
. -
LineString(
pt1
,pt2
,...)Construye un valor
LineString
WKB desde varios parámetos WKB de tipoPoint
. Si alguno de los argumentos no es unPoint
WKB, el valor retornado esNULL
. Si el número de parámetrosPoint
es menor de dos, el valor retornado esNULL
. -
MultiLineString(
ls1
,ls2
,...)Construye un valor
MultiLineString
WKB desde varios parámetos WKB de tipoLineString
. Si alguno de los argumentos no es unLineString
WKB, el valor retornado esNULL
. -
MultiPoint(
pt1
,pt2
,...)Construye un valor
MultiPoint
WKB desde varios parámetos WKB de tipoPoint
. Si alguno de los argumentos no es unPoint
WKB, el valor retornado esNULL
. -
MultiPolygon(
poly1
,poly2
,...)Construye un valor
MultiPolygon
WKB desde varios parámetos WKB de tipoPolygon
. Si alguno de los argumentos no es unPolygon
WKB, el valor retornado esNULL
. -
Point(
x
,y
)Construye un
Point
WKB utilizando sus coordenadas. -
Polygon(
ls1
,ls2
,...)Construye un valor
Polygon
WKB desde varios parámetrosLineString
WKB. Si alguno de los argumentos no representa el WKB de unLinearRing
(es decir, unLineString
que no es cerrado y simple), el valor retornado esNULL
.
MySQL le provee de una manera estándar de crear columnas espaciales para tipos
geométricos, por ejemplo, con CREATE TABLE
o
ALTER TABLE
. Actualmente, las columnas espaciales sólo
son soportadas por las tablas MyISAM
.
-
Utilice la sentencia
CREATE TABLE
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
ALTER TABLE
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
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
:
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 INSERT
:
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 GeomFromText()
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
POINT(1 1)
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
BLOB
: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
mysql_real_escape_string()
e incluir el resultado en una consulta que se envía al servidor. Consulte Sección 24.3.3.48, “mysql_real_escape_string()
”.
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.
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;
La funciónAsText()
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) | +-------------------------+