SQL Server 2008 presenta los nuevos tipos de datos geometry y geography, destinados al almacenamiento de datos espaciales.

Se agregan dos tipos de datos puesto que se nos presenta la posibilidad de trabajar con los datos espaciales de dos formas: plana y elipsoidal

En ambos casos, el tipo de datos espaciales almacenados, se refieren a tipos de datos en 2 Dimensiones; la diferencia radica en la superficie donde se encuentran ubicados los datos a almacenar: mientras que el tipo de datos geometry está destinado a almacenar datos sobre una superficie plana (tierra plana), los datos geography están preparados para trabajar sobre una superficie elipsoidal (tierra-redonda).

Ambos tipos de datos están disponibles como nuevos tipos de datos del sistema, de forma que pueden utilizarse directamente en las nuevas BBDD con compatibilidad 100. Además, están implementados como tipos de datos CLR en SQL Server y como novedad, podemos utilizarlos desde nuestras aplicaciones cliente utilizando su ensamblado (Microsoft.SqlServer.SqlDataTypes) para mejorar la cohesión entre ambas.

Geography está basado en el tipo de datos geometry y es un subconjunto del mismo, por lo que no todos los métodos de geometry se pueden aplicar sobre geography.

Entendiendo los tipos de datos espaciales

Como ya hemos introducido, los nuevos tipos de datos geometry y geography sirven para almacenar datos en 2 Dimensiones. La forma de almacenar dichos datos viene dada por los tipos de datos Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon y GeometryCollection; los cuales pueden verse jerarquizados en la siguiente figura:

NOTA: Azul representa los tipos instanciables (tanto por geometry como por geography)

  • Point: Representa un punto 0-dimensional que indica una localización (x,y) . Puede contener coordenada Z y medida asociada (M) ,pero puesto que hablamos de información en 2D, es la aplicación cliente la que ha de dar significado a esta información extra.

declare @g as geometry

set @g = geometry::STGeomFromText(‘POINT(6 4 7)’,0);

SELECT @g.STX as X , @g.STY as Y, @g.Z as Z, @g.M as M

  • MultiPoint: Representa un conjunto de puntos

DECLARE @g geometry;

SET @g = geometry::STMPointFromText(‘MULTIPOINT((2 3), (7 8 9.5))’, 23);

— Visualización de los datos almacenados

SELECT @g.STGeometryN(1).STAsText();

  • LineString: Representa la línea formada por un conjunto de puntos dado.

    La 3 está cerrada y además es un anillo

    La 4 está cerrada pero no es un anillo, puesto que la línea intersecta consigo misma

DECLARE @g geometry;

SET @g = geometry::STGeomFromText(‘LINESTRING(1 1 NULL 0, 2 4 NULL 12.3, 3 9 NULL 24.5)’, 0);

 

  • MultiLineString: Representa un conjunto de LineStrings

DECLARE @g geometry; SET @g = geometry::Parse(‘MULTILINESTRING((0 5, 1 1), (7 8, 6 4))’);
  • Polygon: Representa el polígono formado por un conjunto de puntos dado.

declare @g geography = ‘POLYGON((0 0,0 10,0 20,0 30, 0 40, 50 40,50 30 ,50 20, 50 10, 50 0, 0 0))’

NOTA: En este caso, estamos ante un polígono en un espacio euclídeo, por lo que su representación gráfica varia un poco si se muestra sobre un mapa redondo. Por simplicidad, se ha mostrado en un espacio plano.

  • MultiPoligon: Representa un conjunto de polígonos.

DECLARE @g geometry;

SET @g = geometry::Parse(‘MULTIPOLYGON(((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1)), ((9 9, 9 10, 10 9, 9 9)))’);

SELECT @g.STGeometryN(2).STAsText();

  • GeomCollection: Representa un conjunto de cero a mas elementos de los tipos anteriores

Algo importante a tener en cuenta, es que todas las instancias espaciales poseen un identificador de referencia espacial (SRID) que se corresponde con el sistema espacial de referencia utilizado ( elipsoidal o plano ). Pese que una columna de tipo de datos espacial puede contener información sobre instancias espaciales con diferentes SRID´s, solo se van a poder realizar operaciones entre aquellas instancias que poseen el mismo SRID. Por defecto, se asume que el SRID de los datos geometry es 0 , mientras que el de los datos geography ha de ser un SRID válido según el estándar EPSG, y que por defecto es 4326 ( sistema de referencia WGS 84 ).

Gracias al SRID se pueden realizar cálculos de intersección, áreas, extracción de distancias,…sobre los datos espaciales almacenados. Esa es la razón por la cual solo se pueden aplicar métodos de cálculo espacial a instancias que posean el mismo sistema de referencia.

Enrique Catalá

Microsoft MVP & SolidQ Technical Leader at SolidQ
I´m technical leader at SolidQ, Microsoft Data Platform MVP,Computer engineer graduated with honors and Microsoft Certified Trainer (MCT). I am focused on the SQL Server relational engine and I am passionate on solving performance problems and scalability in OLTP systems.

I also works with the definition and implementation of reliable high availability environments, where I have successfully led more than 100 projects not only in Spain but in different countries like USA, Netherlands, Mexico, etc. I am the principal architect of the solutions called HealthCheck, QueryAnalytics and DatabaseObfuscator... I wrote the book "Planning for migration to SQL Server SQL Server 2008 R2" (ISBN : 978-84-936417-9-5).
Enrique Catalá