martes, enero 08, 2008

Tipos de datos espaciales en MySQL

MySQL soporta dos formatos de datos espaciales, los cuales se emplean indistintamente para escribir consultas Sql, ellos son: el formato Well-Known Text (WKT) y el formato Well-Known Binary (WKB) .

En el formato WKT la forma de descriir una geometría es en ASCII. Así, por ejemplo un objeto punto puede especificarse como POINT(3 4). En cambio, en el formato WKB se utilizan cadenas con datos binarios para representar la información de una geometría. Se usan enteros sin signo de un byte, enteros sin signo de cuatro bytes, y números de ocho bytes de doble precisión. Por ejemplo, una equivalencia del formato ASCII para una geometría POINT(1 1) sería la siguiente cadena hexadecimal “0101000000000000000000F03F000000000000F03F”

El motor de base de datos MySQL soporta los siguientes tipos datos espaciales simples (objetos únicos) de la especificación OpenGIS:

  • POINT almacena punto
  • LINESTRING almacena una cadena de puntos
  • POLYGON almacena un polígono

En cambio los siguientes tipos de datos espaciales soportan conjuntos de objetos:

  • MULTIPOINT almacena una colección de puntos
  • MULTILINESTRING almacena una colección de objetos LineString
  • MULTIPOLYGON almacena una colección de polígonos
  • GEOMETRYCOLLECTION almacena objetos geométricos de cualquier tipo
  • GEOMETRY almacena valores de cualquier tipo

A los efectos de manejar datos espaciales en formato texto (WKT) MySQL posee una serie de funciones que como parámetros de entrada toman una cadena ASCII que representa a la geometría seleccionada, y opcionalmente se le puede añadir un identificador de sistema de referencia espacial (SRID).

Por ejemplo a la función GeomFromText() se le asocia como parámetro una cadena que define una geometría particular. La siguiente instrucción ilustra el uso de la función, ya que se añade un registro a una tabla:

INSERT INTO puntos (nombre, ubicacion)
VALUES ( 'punto A' , GeomFromText( ' POINT(23.5 44.8) ' ) )

INSERT INTO axlVALUES (GeomFromText('LINESTRING(0 0, 3 7, 9 20)'))

INSERT INTO xal VALUES (GeomFromText(
'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3))'))

SET @plg = -> 'Polygon((300 150, 310 150, 310 160, 300 160, 300 150))';
SELECT id, AsText(g) FROM alx WHERE MBRContains(GeomFromText(@poly),g);

Nótese que en la orden anterior se utilizó la función AsTex() la cual convierte un dato en formato binario a formato ASCII.

Alternativamente se pueden utilizar otras funciones de construcción, particulares a cada tipo de geometrías:

GeomCollFromText(wkt[,srid]) o GeometryCollectionFromText(wkt[,srid])
Para datos GeometryCollection .

LineFromText(wkt[,srid]) o LineStringFromText(wkt[,srid])
Para datos LineString.

MLineFromText(wkt[,srid]) , o MultiLineStringFromText(wkt[,srid])
Para datos MultiLineString

MPointFromText(wkt[,srid]) o MultiPointFromText(wkt[,srid])
Para datos MultiPoint

MPolyFromText(wkt[,srid]) ,o MultiPolygonFromText(wkt[,srid])
Para datos MultiPolygon

PointFromText(wkt[,srid])
Para Point

PolyFromText(wkt[,srid]) o PolygonFromText(wkt[,srid])
Para Polygon

Por otro lado existen un juego de funciones para manipular representaciones binarias (WKB) de datos geográficos.

1 comentario:

Bryan Macias dijo...

fue justamente lo que necesitaba, he buscado en otras paginas pero no esta tan bien explicado como tu lo tienes.... Gracias!!