Datos espaciales en SQL Server: parte 1 - introducción

by fnunez 19. noviembre 2011 11:07

Una de las novedades más interesantes de SQL Server 2008 respecto a ediciones anteriores es sin duda la posibilidad de almacenar y manipular información espacial. Esta característica abre la puerta al desarrollo de sistemas de información geográfica (GIS) basados en el gestor de bases de datos de Microsoft. En esta serie de artículos veremos una breve introducción a los tipos espaciales, importación de mapas y generación de informes. Todo esto lo llevaremos a cabo utilizando la edición gratuita SQL Server 2008 R2 Express

Los tipos geometry y geography

SQL Server 2008 ofrece dos tipos de datos espaciales: geometry y geography. Ambos permiten representar figuras geométricas sencillas como puntos, líneas, polígonos y agrupaciones de las mismas. La diferencia fundamental entre ambos tipos consiste en que el primero (geometry) representa estos objetos en un plano mediante coordenadas cartesianas (x,y), mientras que el segundo (geography) lo hace sobre la superficie de la tierra mediante coordenadas geográficas (latitud y longitud) empleando para ello un sistema de referencia espacial o modelo de la tierra concreto. 

latitud y longitud

El tipo geometry suele ser suficiente para representar datos que provengan de proyecciones cartográficas o que abarquen áreas geográficas reducidas, donde las distorsiones ocasionadas al proyectar la superficie terrestre sobre un plano no son un factor crítico. El tipo geography ofrece mayor precisión a la hora de realizar operaciones sobre áreas de gran tamaño, ya que tiene en cuenta parámetros como la curvatura de la tierra a la hora de calcular la distancia entre dos puntos o el área en km2 de una región.

Ambos están implementados como tipos CLR (Common Language Runtime), característica que permite aprovechar las ventajas de la programación orientada a objetos en SQL Server. Así en el caso de los datos espaciales, los tipos geometry y geography se comportan como clases abstractas de las que heredan las primitivas que utilizaremos para representar puntos, líneas y polígonos. En la página de MSDN tenemos información detallada de los objetos espaciales que podemos representar en SQL Server.

Para almacenar estos objetos en una tabla basta con crear una o más columnas de tipo geometry o geography. En estas columnas podemos guardar cualquiera de las figuras geométricas comentadas anteriormente. Además, SQL Server ofrece un amplio abanico de funciones para llevar a cabo operaciones y transformaciones entre dos o más objetos y devolver valores escalares como el área o la longitud de un objeto por ejemplo. La lista completa de estas funciones la podemos encontrar aquí para el tipo geometry y en este otro enlace para el tipo geography.

Geometry: ejemplo sencillo

A continuación veremos un ejemplo sencillo en el que crearemos una tabla con una columna de tipo geometry. En esta tabla guardaremos dos polígonos y llevaremos a cabo algunas operaciones sencillas de unión, intersección y cálculo de área para ilustrar lo anteriormente comentado.

CREATE TABLE Regiones
(
	ID INT IDENTITY(1,1) NOT NULL,
	NOMBRE VARCHAR(100) NOT NULL,
	GEOM GEOMETRY NOT NULL
)

Una vez creada la tabla “Regiones” declaramos dos polígonos y los insertamos en la tabla:

DECLARE @poligonoA geometry
DECLARE @poligonoB geometry

SET @poligonoA = 'POLYGON((10 10, 40 10, 40 40, 10 40, 10 10))' 
SET @poligonoB = 'POLYGON((30 30, 50 30, 50 50, 30 50, 30 30))'

INSERT INTO Regiones (NOMBRE,GEOM) VALUES ('figuraA',@poligonoA)
INSERT INTO Regiones (NOMBRE,GEOM) VALUES ('figuraB',@poligonoB)

Si ejecutamos una consulta que devuelva todos los registros (SELECT * FROM Regiones) observaremos que junto a la pestaña de resultados aparece una nueva con el título “Resultados espaciales” donde podremos ver la representación gráfica de los objetos almacenados en la tabla.

Para obtener un polígono resultado de la unión de los que declaramos anteriormente bastará con realizar la siguiente consulta:

SELECT @poligonoA.STUnion(@poligonoB).ToString();

Si por el contrario queremos obtener una figura que represente la intersección haremos la siguiente consulta:

SELECT @poligonoA.STIntersection(@poligonoB).ToString();

Y finalmente para obtener el área de cada uno de los polígonos de la tabla haremos:

SELECT nombre, geom.STArea() FROM Regiones

Geography y el sistema de referencia espacial

Al principio de este artículo comentábamos que el tipo geography se utilizaba para representar figuras geométricas sobre la superficie de la tierra según un sistema de referencia. SQL Server almacena en la tabla sys.spatial_reference_systems una lista con los sistemas de referencia geodésicos más comunes identificados por el campo SRID. En esta tabla podemos ver sus características como la unidad de medida, meridiano origen o el tipo de elipsoide empleado para representar la tierra.

A la hora de trabajar con objetos de tipo geography es necesario indicar el sistema de referencia (SRID) en el que se basan las coordenadas de latitud y longitud que indican la posición del objeto sobre la superficie terrestre. Hay que tener presente que si vamos a realizar operaciones con distintos objetos geography estos deben estar en el mismo sistema de referencia para que los resultados sean válidos.

A continuación vamos a realizar un sencillo ejemplo en el que definiremos dos puntos indicando las coordenadas de latitud, longitud y el sistema de referencia (en este caso WGS84 que es el utilizado por los dispositivos GPS convencionales), y llamaremos a la función STDistance para calcular la distancia kilométrica entre ambos puntos.

DECLARE @Cadiz as geography
DECLARE @Madrid as geography

-- El SRID de WGS84 es 4326

SET @Madrid = geography::Point(40.441721,-3.702393,4326) 
SET @Cadiz = geography::Point(36.5336111,-6.2994444,4326)

SELECT @Cadiz.STDistance(@Madrid)/1000
Aquí termina esta breve introducción a los tipos espaciales. En el próximo artículo veremos cómo importar datos espaciales de las fuentes externas que podemos encontrar en la Red. 

Pingbacks and trackbacks (1)+

Agregar comentario

  Country flag

biuquote
  • Comentario
  • Vista previa
Loading

Acerca de este blog

Soy desarrollador de aplicaciones Web. En este blog recopilo artículos, notas y enlaces que considero interesantes para mi trabajo diario.

Archivo