Está en la página 1de 28

Los datos de tipo Geography en Microsoft SQL Server

2008

LOS DATOS DE TIPO GEOGRAPHY EN MICROSOFT SQL SERVER 2008................................1
INTRODUCCIN.........................................................................................................................................1
El estndar OGC ................................................................................................................................2
UTM: Cmo envolver un mandarinoide en una cartulina..............................................................3
Clculos, conversiones, distancias .....................................................................................................6
Geografas y geometras.....................................................................................................................6
Las clases Geography y Geometry de .NET Framework 3.5 .............................................................7
EJ EMPLO EN LA AVIACIN: MEDICIN DE DISTANCIAS E INTERSECCIN DE VAS AREAS.........................8
Qu es volar en instrumental? ..........................................................................................................8
Qu es una radiobaliza VOR? ..........................................................................................................8
Procedimientos para guiarse en vuelo instrumental entre Barcelona y Madrid ................................9
De los datos a las tablas .....................................................................................................................9
Insertando datos geogrficos de prueba...........................................................................................10
Ahora la tabla buena de radiobalizas...............................................................................................11
Transformacin de coordenadas lat/long a puntos geogrficos (geography) ..................................13
La pantalla grfica de datos geoespaciales......................................................................................13
Otros clculos tiles con LineString.................................................................................................16
Clculo de intersecciones entre vas areas .....................................................................................16
Mayor precisin de SQL Server en el clculo ..................................................................................19
SQL 2008 EN OBRAS PBLICAS (EJ EMPLO DE APLICACIN C#) ..............................................................19
Un ejemplo de topografa .................................................................................................................20
Enunciado del problema...................................................................................................................21
Conversin de coordenadas desde expresiones alfanumricas a decimales ....................................22
Polgonos dentro de polgonos: ejemplo de usos del suelo...............................................................24
Preguntando a SQL Server por las parcelas insertadas...................................................................25
Obteniendo los resultados de superficie ...........................................................................................25
Obteniendo los resultados de superficie a expropiar........................................................................26
Elaborando las soluciones en C#......................................................................................................26
CONCLUSIN..........................................................................................................................................28


Introduccin
En este artculo vamos a ver la utilidad de los nuevos tipos de datos geoespaciales
presentes en Microsoft SQL Server.

Primeramente veremos una introduccin al sistema de coordenadas geogrficas y sus
transformacones.

A continuacin veremos dos ejemplos completos que nos ilustrarn sobre mtodos de
uso, trucos y tcnicas tanto de SQL Server 2008 como de C#en combinacin con el
servidor de base de datos.

El primero de estos ejemplos slo emplea Transact SQL y trata sobre encontrar la
interseccin entre las trayectorias de dos vas areas. En este primer ejemplo
encontraremos:


SQL Server 2008 proporciona varios nuevos tipos de datos. Entre ellos tenemos uno
orientado a manejar coordenadas topogrficas: Geography.

Esto facilita mucho el manejo de datos de ingenieras diversas abre el camino para que
las empresas de obras pblicas, organismos de control de datos medioambientales, de
trazado de lneas elctricas, distribucin de infraestructuras, de transportes areos,
navieras y de geografa estadstica o econmica puedan trabajar de forma nativa con
datos que referencian terrenos de formas arbitrarias, pero siempre georeferenciados.

Esto marca muchas diferencias con la forma clsica de trabajar.

Antes debamos crear estructuras de datos compuestas por mltiples columnas y
mltiples tablas y debamos implementar en cdigo fuente el manejo de los criterios de
ordenacin de estos datos.

Ahora toda esta lgica se encuentra dentro del motor de base de datos de SQL Server y
el lenguaje Transact SQL puede trabajar con ellos de forma especfica, como si se
tratara de un topgrafo experto.

Geography es adems un tipo de dato soportado en el Framework 3.5 de .NET, de
manera que los datos que leamos de la base de datos pueden ser recogidos en Visual
Basic, C#o C++dentro de una clase nativa especfica, con mtodos propios para
gestionarlos desde nuestras aplicaciones.

Esto implica que los motores inteligentes de Linq pueden trabajar desde el Entity
Framework y desde Linq to SQL con contextos geogrficos, lo cual sumado a los
mtodos intrnsecos de las clases, permite desarrollar aplicaciones de gran exactitud en
el manejo de coordenadas y objetos georeferenciados.

En este artculo vamos a entrar en SQL Server y ver las herramientas geogrficas que
nos brinda.

El estndar OGC

El Open Geospatial Consortium (OGC) ha establecido una forma estndar de
almacenar datos georeferenciados dentro de un servidor de bases de datos relacionales y
unos procedimientos para consultar, crear, actualizar y borrar estos datos desde lenguaje
SQL.

Por tanto, cuando hablamos del OGC, estamos hablando de un dialecto SQL
estandarizado para trabajar con datos geogrficos.

El tipo de dato Geography usa coordenadas vinculadas a un geoide o elipsoide. Qu
es un elipsoide?

Un elipsoide es un objeto global de forma aproximada a nuestro planeta, es decir, como
una mandarina a escala planetaria. Se le supone liso, es decir, referenciado al nivel
medio del mar. Para entendernos: un mandarinoide; un modelo matemtico capaz de
expresar cualquier punto sobre la superficie de la Tierra.

Modelos matemticos hay muchos y algunos se adaptan mejor que otros a la forma real
de la Tierra.

Entre los elipsoides empleados tenemos:

Airy
AustralianNational
Bessel1841
Bessel1841Nambia
Clarke1866
Clarke1880
Everest
Fischer1960
Fischer1968
GRS1967
GRS1980
Helmert1906
Hough
International
Krassovsky
ModifiedAiry
ModifiedEverest
ModifiedFischer1960
SouthAmerican1969
WGS60
WGS66
WGS72
WGS84

De todos ellos, el estndar para los GPS es el WGS84.

Los GPS pueden entregarnos los datos de posicin de dos formas diferentes:

1. Mediante las coordenadas geogrficas, basadas en latitud y longitud (mtodo
clsico) con medidas en grados, minutos y segundos de arco.
2. Mediante coordenadas UTM, sistema X-Y, en los que las unidades son metros.

UTM: Cmo envolver un mandarinoide en una cartulina

La forma UTM es conocida tambin como forma euclidiana. Es una proyeccin de una
porcin de superficie en la que se puede despreciar el error de curvatura de la Tierra y
asimilarlo a un mapa plano con coordenadas X-Y: las coordenadas UTM.



UTM viene de Universal Transversal Mercator y se basa en la proyeccin de Mercator,
pero no referenciada al ecuador, sino a un meridiano.

Si tomamos esta mandarina elipsoidal y la envolvemos con una cartulina que toque los
polos tenemos:



Sus unidades no son grados, minutos y segundos, sino metros lineales a nivel del mar.

Imaginemos un armazn metlico elipsoidal, de una altura como la de una habitacin
que estuviera hecho de meridianos y paralelos:


Imaginemos que dividimos los meridianos (lneas verticales) cada 6 grados hasta
conseguir 60 divisiones. Ya tenemos los husos UTM. Los husos se enumeran del 1 al
60. Hasta aqu poco misterio.

Imaginemos que los paralelos (las lneas horizontales) fueran 20 en total repartidos cada
8 para abarcar los 360 grados. Cada franja horizontal entre paralelos es una zona
UTM..
Las zonas se denominan mediante letras que van desde la C hasta la X, excluyendo la I
y la O para que no puedan confundirse con el 1 y el 0.

Si nos dijeran que cada interseccin es una esquina, podramos subirnos en una escalera
e ir colocando lminas metlicas rectangulares con remaches claveteados sobre el
armazn. Cada una de esas lminas metlicas es una cuadrcula UTM.



Las cuadrculas UTM se denominan mediante el nmero del huso y la letra de la zona.

Por ejemplo, Galicia est en la cuadrcula 29T, Asturias y Euskadi estn en la 30T,
Catalua est en la 31T, y Andaluca est repartida entre la 29S y la 30S:



Existen excepciones como las zonas 32V y 31V. Las dos juntas ocupan el tamao
correcto, pero una es ms pequea que la otra. La zona 32V se extendi para cubrir en
una sola zona la costa de Noruega. Por tanto se recort en la misma medida la zona 31V.
Hay otra excepcin ms al norte de Escandinavia en la zona conocida como Sbarvald:



Se trata de las cuadrculas 31X, 33X, 35X y 37X.

Clculos, conversiones, distancias

Existen, como comentbamos, formas de traducir del sistema de coordenadas
geogrficas (latitud y longitud) al sistema UTM y viceversa.

Tambin existen clculos que indican en qu cuadrcula UTM se encuentra cualquier
coordenada geogrfica propuesta.

Otros clculos indican la distancia entre dos puntos, expresndolos tanto en sistema
geogrfico como en sistema UTM.

Y ya de cara a mayor sofisticacin, hay clculos de reas encerradas dentro de
polgonos y formas diversas georeferenciadas, as como clculo de intersecciones y todo
un lujo de funciones ya creadas, comprobadas y listas para su uso.

Todos estos clculos son los que puede realizar SQL Server 2008 para nosotros y
tambin son los clculos que podemos obtener empleando desde programa el
framework .NET de la versin 3.5.

Geografas y geometras

Tenemos dos necesidades diferentes si vamos a trabajar con puntos, distancias,
permetros y reas:

1. Trabajar desde planos como por ejemplo los de arquitectura, que no estn
georeferenciados. Para ellos tenemos la biblioteca Geometry. En estos no entra
el clculo de grados, minutos, segundos ni transformaciones UTM.
2. Trabajar desde planos georeferenciados en los que s intervienen estos clculos.
Para ello tenemos la biblioteca Geography.

Las clases Geography y Geometry de .NET Framework 3.5

La biblioteca Geometry y la Geography contienen clases con el mismo nombre pero
con distinto tratamiento. De hecho, la base de Geography es Geometry.


En azul vemos los tipos instanciables y en amarillo los no instanciables.

Vamos a ver pero no estbamos hablando de un tipo Geography? Qu implica un
esquema jerrquico como este si tenemos un solo tipo de dato?

Bien, pues aqu es donde tenemos un cambio importante en el concepto de Codd. No
tenemos un tipo de dato fijo, sino que se trata de un espacio en el que cabe cualquier
objeto de esta jerarqua.

Disponemos de dos constructores para cada objeto:

Constructor en forma de texto (WKT o Well Known Text).
Constructor en forma binaria (WKB o Well Known Binary).

Si llamamos a un constructor de texto de un punto (Point) mediante la sintaxis concreta
de un punto, tendremos un objeto Geography que almacena la informacin de un punto.

Si hacemos lo propio con un objeto Polygon llamando al constructor de texto propio de
los polgonos, la informacin guardada ser un polgono.

Dnde est el secreto? En que internamente estos tipos de datos son bloques binarios
(BLOB) que se pueden cargar con diferentes estndares expresados en la biblioteca y de
este modo Transact SQL puede diferenciarlos en tiempo real por su longitud y saber con
qu est trabajando en cada caso.

Potente no?

Ejemplo en la aviacin: medicin de distancias e interseccin
de vas areas

Vamos a poner un ejemplo con datos reales del mundo de la aviacin comercial.
Qu es volar en instrumental?

Para ir de Barcelona a Madrid, por ejemplo, podemos ir de dos maneras: volando en
visual (VFR o Visual Flight Rules) o en vuelo instrumental (IFR o Instrumental Flight
Rules).

Volar en visual es irse guiando por los accidentes del terreno (ros, montaas, lagos) e
ir planificando etapas y rumbos al ver cada uno de ellos, como por ejemplo el pantano
de Mequinenza en Huesca, la sierra de Gredos...

Volar en instrumental es guiarse mediante radiobalizas, como si no hiciera falta mirar
fuera sino simplemente guiarse por seales elctricas e gran precisin.

Vamos a cargar en una tabla SQL la ubicacin geogrfica de unas radio balizas
comocidas como VORs para navegacin area, situadas sobre el territorio, que estn
entre Barcelona y Madrid y que utiliza cada da el puente areo entre estas dos
localidades.

Qu es una radiobaliza VOR?

Las radiobalizas direccionales, conocidas como VOR en aviacin, producen haces de
seales que se pueden interceptar como si fueran los haces de luces de un antiguo faro,
pero en formato de seal de radio. Un VOR emite una seal de radio diferente para cada
ngulo de los 360 de abanico a su alrededor. Tiene, por tanto, 360 radiales.

De esta forma un avin sabe qu ngulo tiene respecto al VOR.

Los VOR permiten sintonizarse en acercamiento (modo TO) o en alejamiento (modo
FROM). En acercamiento, el radial sintonizado es el rumbo que debemos poner para
acercarnos al VOR. En alejamiento es el rumbo opuesto para huir del VOR.

La mayor parte de los VOR tienen prestaciones DME; esto es, emiten una segunda seal
que permite que el avin averige qu distancia existe entre l y el VOR. Es lo que se
conoce como VOR/DME.

Finalmente existe un tercer tipo de VOR que se conoce como ILS, que proporciona una
seal horizontal que informa del ngulo de incidencia (altura de la senda de
aproximacin) sobre la pista de aterrizaje. Ofrecen una visin de cruz sobre el panel de
instrumentos, ms o menos centrada segn la precisin del piloto en adaptarse a la
senda.

A bordo de un avin hay al menos dos receptores de VOR que permiten saber la
posicin del avin con mayor exactitud y sin depender de que sean VOR/DME.

El piloto automtico puede configurarse para que persiga un VOR durante el curso de
una etapa de vuelo, manteniendo a la vez una velocidad y un nivel de vuelo (altura) fijo.

Por esta razn, durante las fases de vuelo, los pilotos no suelen actuar sobre las palancas
de mando, sino que se limitan a programar el piloto automtico, el cual lleva el avin
con absoluta precisin y suavidad.

Y por esta razn pasan la mayor parte del vuelo pendientes del trfico areo por radio y
radar de aproximacin, de las turbulencias, verificando rutinariamente parmetros
mecnicos y tomando zumo de naranja.

Procedimientos para guiarse en vuelo instrumental entre Barcelona
y Madrid

Cuando un avin despega de Barcelona con destino Madrid, el piloto sintoniza el VOR
de Barcelona en alejamiento, tras ello libra a 4.000 pies (sale del circuito del aeropuerto
por encima de 1 Km de altura) y pone rumbo hacia Maella (MLL), Castejn (CJ N),
Robledillo de Mohernando (RBO), Perales de Tajua (PDT) y Madrid-Barajas con la
radiobaliza de la pista que le toque para aterrizar.

En sentido contrario, es Madrid-Barajas, PDT, RBO, CJ N, MLL, y pista de Barcelona.

Por eso en los datos de tipo Geography es importante el sentido de las curvas y los
polgonos, porque definen la direccin del movimiento.

En Geometry, en cambio, el orden en que se especifican no tiene sentido.

El listado de los puntos geogrficos en sentido Barcelona-Madrid tal como suministra
los datos AENA (Aeropuertos Espaoles y Navegacin Aea) es el siguiente:

Identificador Frecuencia Latitud Longitud
LEBL Barcelona 114.30 41 17 49 N 002 04 42 E
MLL Maella 112.10 41 07 48 N 000 10 00 E
CJ N Castejn 115.60 40 22 18 N 002 32 48 W
RBO Robledillo 113.95 40 51 14 N 003 14 47 W
PDT Perales 116.95 40 15 10 N 003 20 52 W
LEMD Madrid 116.45 40 28 09 N 003 33 28 W

Esto es lo que se llama WayPoints, que tambin se pueden verificar mediante GPS.

Llegados a unos 40 km de destino (20 millas nuticas), la torre de control proporciona
una pista en servicio para aterrizar y a travs de las cartas de navegacin J eppessen o del
sistema ATIS se averigua la frecuencia de una radiobaliza ms exacta (ILS) para el
aterrizaje semiautomtico en clase II.

De los datos a las tablas

Si pasamos los grados, minutos y segundos de sexagesimal a decimal tenemos que las
coordenadas son:

LEBL 41.298831, 2.078476
MLL 41.130000, 0.166667
CJ N 40.371667, -2.546667
RBO 40.853889, -3.246389
PDT 40.252778, -3.347778
LEMD 40.469167, -3.557778

Insertando datos geogrficos de prueba

Antes de insertar estos valores en la tabla buena de clculo, vamos a hacer pruebas en
una tabla bsica para aprender a invertir las coordenadas. Plantearemos la siguiente
estructura de tabla:

Columna Tipo Clave nica
WGUID nvarchar(50) ndice principal
Polyplot Geography No
IDPlot nvarchar(50) No

Esta estructura se puede crear mediante SQL con la siguiente sentencia:

CREATE TABLE [dbo].[Plot](
[WGUID] [nvarchar](50) NULL,
[polyplot] [geography] NULL,
[IDPlot] [nvarchar](50) NULL
) ON [PRIMARY]

Para introducir los datos geogrficos se usa el orden longitud, latitud ya que OGC
utiliza el orden X,Y y la latitud se asimila al eje vertical.

Ahora vamos a ver cmo se puede utilizar el formato WKT (well known text) para
almacenar los valores de las coordenadas geogrficas en el campo geoelemento.

La instruccin POINT sirve para instanciar un valor (longitud latitud) y retorna un tipo
de dato Geography. Por ejemplo:

i nser t i nt o Pl ot ( WGUI D, pol ypl ot , I DPl ot ) val ues ( ' WGUI D001' ,
' POI NT( 10 10) ' , 1)

En esta forma se asume que el elipsoide por defecto es el WGS84, pero podemos
especificar elipsoides diferentes. Empleando la forma POINT (Longitud Latitud SRID)
podemos especificar un nmero de elipsoide determinado.

Por ejemplo, el elipsoide WGS84 es el que se referencia con el cdigo 4326, con lo que
la instruccin anterior es equivalente a:

i nser t i nt o dbo. Pl ot ( WGUI D, pol ypl ot , I DPl ot )
val ues ( ' WGUI D003' , geogr aphy: : STGeomFr omText ( ' POI NT( 10 10) ' , 4326) , 3)

La primera cuestin interesante, antes incluso de ver cmo se realizan nuestros
objetivos de insercin, es darse cuenta que estamos empleando desde dentro de SQL
una librera .NET.

Esta es una prestacin crucial en la que se basa un aumento de potencia sustancial en la
versin de SQL Server 2008.

Al instanciar geogr aphy: : STGeomFr omText estamos llamando a la funcin de la
librera geography que nos proporciona la funcin de interpretacin de la sintaxis del
punto geogrfico.

En esta funcin los parmetros de latitud y longitud van cambiados de orden.

Ahora, sabiendo que el orden de los parmetros es longitud primero y latitud despus,
ya podemos insertar los puntos del ejemplo anterior.

Ahora la tabla buena de radiobalizas

Vamos a crear una tabla con la forma clsica de trazar los puntos

La estructura de la tabla es la siguiente:

WGUID nvarchar(50) Clave principal
Identificador nchar(10) Permite nulos
Descripcion varchar(50) Permite nulos
Frecuencia Real Permite nulos
Latitud Real Permite nulos
Longitud Real Permite nulos
GeoLugar Geography Permite nulos

Crearemos la tabla con este script:

CREATE TABLE [ dbo] . [ r adi obal i zas] (
[ WGUI D] [ var char ] ( 50) NOT NULL,
[ I dent i f i cador ] [ nchar ] ( 10) NULL,
[ Descr i pci on] [ var char ] ( 50) NULL,
[ Fr ecuenci a] [ r eal ] NULL,
[ Lat i t ud] [ r eal ] NULL,
[ Longi t ud] [ r eal ] NULL,
[ geol ugar ] [ geogr aphy] NULL,
CONSTRAI NT [ PK_r adi obal i zas] PRI MARY KEY CLUSTERED
(
[ WGUI D] ASC
) WI TH ( PAD_I NDEX = OFF, STATI STI CS_NORECOMPUTE = OFF, I GNORE_DUP_KEY
= OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [ PRI MARY]
) ON [ PRI MARY]

Ahora vamos a insertar los valores de latitud y longitud tal como los conocemos,
dejando la representacin de la columna geography para ms adelante:

i nser t i nt o r adi obal i zas
( WGUI D, I dent i f i cador , Descr i pci on, Fr ecuenci a, l at i t ud, l ongi t ud)
val ues
( ' WGUI D0001' , ' LEBL' , ' Bar cel ona' , 114. 30, 41. 298831, 2. 078476)

i nser t i nt o r adi obal i zas
( WGUI D, I dent i f i cador , Descr i pci on, Fr ecuenci a, l at i t ud, l ongi t ud)
val ues
( ' WGUI D0002' , ' MLL' , ' Mael l a' , 112. 10, 41. 130000, 0. 166667)

i nser t i nt o r adi obal i zas
( WGUI D, I dent i f i cador , Descr i pci on, Fr ecuenci a, l at i t ud, l ongi t ud)
val ues
( ' WGUI D0003' , ' CJ N' , ' Cast ej n' , 115. 60, 40. 371667, - 2. 546667)

i nser t i nt o r adi obal i zas
( WGUI D, I dent i f i cador , Descr i pci on, Fr ecuenci a, l at i t ud, l ongi t ud)
val ues
( ' WGUI D0005' , ' PDT' , ' Per al es' , 116. 95, 40. 252778, - 3. 347778)

i nser t i nt o r adi obal i zas
( WGUI D, I dent i f i cador , Descr i pci on, Fr ecuenci a, l at i t ud, l ongi t ud)
val ues
( ' WGUI D0006' , ' LEMD' , ' Madr i d' , 116. 45, 40. 469167, - 3. 557778)


Insertadas estas filas, la tabla tendr esta apariencia:



Observemos que en la ventana en la que se nos muestran las filas y columnas
disponemos de una pestaa que pone Spatial Results. Dejmosla donde est de
momento. Ya veremos sus resultados ms adelante.

Transformacin de coordenadas lat/long a puntos geogrficos
(geography)
Ahora vamos a lanzar la siguiente instruccin para rellenar el campo geolugar de tipo
geography a partir de los datos de latitud y longitud que hemos introducido:

updat e r adi obal i zas
set geol ugar = geogr aphy: : STPoi nt Fr omText ( ' POI NT( ' + CAST( Longi t ud AS
VARCHAR( 20) ) + ' ' +CAST( Lat i t ud AS VARCHAR( 20) ) + ' ) ' , 4326)

Al ejecutar la instruccin habremos rellenado los valores de geography a partir de las
columnas de latitud y longitud tal como se usaban a la antigua usanza.

La tabla queda como sigue:



La pantalla grfica de datos geoespaciales

Si seleccionamos ahora la pestaa Spatial Results del conjunto de resultados tenemos:



Los puntos son casi invisibles pero los tenemos ah posicionados en el mapa de
coordenadas.

SQL Server nos ha centrado automticamente el zoom horizontal entre los -4 y los 3
grados de longitud y entre los 40 y 42 grados de latitud.

Vemos que en la parte superior derecha, bajo el nmero 2, partimos de Barcelona. Un
poco ms abajo, cerca de los 0 tenemos el VOR de Maella, casi en el meridiano de
Greenwich, ms abajo an, entre los -2 y los -3 tenemos Castejn y Perales entre -3 y
-4. Finalmente a su derecha, un poco ms arriba est el destino Madrid-Barajas.

Una ruta perfecta para entrar por la pista 33 por el radial 326 en alejamiento desde el
VOR de Perales y en acercamiento al ILS de la cualquiera de las pistas paralelas 33
(33L o 33R).

En el caso que nos ocupa, en el que se visualizan slo puntos, no est disponible la
opcin de etiquetar cada punto en el mapa con el contenido de otro campo.

Vamos a calcular ahora este conjunto de puntos como una ruta para hallar la longitud
del camino.

Para insertar el camino vamos a utilizar el mismo tipo de dato Geography, pero esta
vez vamos a usar la clase geography::LineString.

Veamos cmo se puede insertar un valor de tipo LineString dentro de una columna de
tipo geography, teniendo en cuenta que las coordenadas de latitud y longitud cambian
de orden y deben especificarse como longitud, latitud:

i nser t i nt o r adi obal i zas ( WGUI D, I dent i f i cador , Descr i pci on, geol ugar )
val ues ( ' WGUI D0100' ,
' BCN- MAD' ,
' Rut a Bar cel ona- Madr i d' ,
geogr aphy: : STGeomFr omText ( ' LI NESTRI NG( 2. 078476 41. 298831,
0. 166667 41. 130000, - 2. 546667 40. 371667, - 3. 347778 40. 252778, -
3. 557778 40. 469167) ' , 4326) )

Ahora lanzamos la consulta SELECT * FROM Radiobalizas WHERE WGUID
=' WGUI D0100'



Y esta es la representacin grfica que obtenemos de la ruta Madrid-Barcelona.
Entendmosla desde derecha a izquierda, o sea, desde el Este al Oeste.

Obsrvese que esta vez, al tratarse de un objeto geogrfico diferente del punto, podemos
seleccionar el campo que queremos emplear como etiqueta. En este caso, el campo de la
descripcin de la fila.

Para obtener su distancia (la suma de la longitud de los segmentos entre waypoints),
lanzamos la consulta:

sel ect geol ugar . STLengt h( ) f r omr adi obal i zas WHERE WGUI D =' WGUI D0100'

Y el resultado es 504.822 m, es decir, casi 505 km de distancia en lnea casi recta.

Las coordenadas pueden darse en tres dimensiones. Esto nos permitira reflejar en la
ruta los niveles de vuelo (altura) en los diferentes tramos, cosa que normalmente
asignan los controladores de torre. El clculo de la longitud de la lnea sera la longitud
del vector considerando las tres dimensiones.

Para los ms entusiastas de la aviacin y los curiosos, reproducimos un fragmento de la
carta de aproximacin, que corresponde al final de la lnea que va desde Castejn a
Perales y la aproximacin final desde Perales hasta Madrid-Barajas, pista 33R.



Nosotros vamos a parar al VOR de Perales viniendo desde el VOR de Castejn (CJ N)
por el radial 82 de Perales (PDT) en aproximacin. Desde ah viraje a la derecha y
retomamos el radial 325 en alejamiento y el VOR/ILS de la pista de aterrizaje que nos
hayan dado en servicio.

Todos estos dispositivos (VOR, ILS, DME, NDB) se pueden mostrar sobre el plano
sin mayor problema.

Otros clculos tiles con LineString

Volviendo a los objetos LineString, acabamos de ver cmo se pueden medir. Si los
puntos estn cerrados, esto es, el primero es igual al ltimo, tendremos un polgono. La
medicin de la longitud equivaldr en este caso al permetro del polgono.

Deseamos saber cuantros metros lineales de alambrada necesitamos para rodear un
terreno? Introducimos las coordenadas y SQL Server las calcula para nosotros.

Clculo de intersecciones entre vas areas
Sin querer saltar ya hacia el clculo de reas, vamos a ver ahora otro clculo interesante
que puede hacer por nosotros SQL Server: el clculo de intersecciones entre lneas.

Para hacerse una idea de la importancia que tienen las intersecciones en navegacin
area slo hace falta que echemos un vistazo al siguiente plano:



Sobre este plano tenemos nuestra ruta marcada en color negro, y el resto de rutas que se
cruzan en color naranja.

En color amarillo tenemos marcados crculos alrededor de los VOR de Barcelona,
Maella, Castejn, Perales y Madrid.

Este grfico es la carta de navegacin instrumental de alta cota (espacio areo superior)
por el que circula, por ejemplo el puente areo.

Estas intersecciones, al igual que la informacin de aeronavegabilidad que hemos dado
antes, estn controladas por AENA, un organismo encargado de aeropuertos y
navegacin area, del que depende la jerarqua de torres de control, pasadizos y zonas
restringidas, y que tambin se encarga de establecer las alturas (niveles) de vuelo para
evitar conflictos.

Si hacemos un zoom, descubriremos que junto a estas vas imaginarias tenemos unos
cdigos que ponen FL y un nmero al lado. Se trata del Flight Level o nivel de vuelo
expresado mediante una cifra que se multiplica por 100 para hallar la altura en pies, o
por 33,3 peridico para hallar la altura en metros sobre el nivel del mar.

Busquemos ahora conflictos entre vas areas que tengan un mismo nivel de vuelo. Por
ejemplo, en la zona entre Madrid y Guadalajara existe un punto llamado ADUXO en el
que se cruza nuestra ruta Barcelona-Madrid con una ruta entre Zaragoza y Mlaga,
estando ambas rutas a nivel de vuelo 245, es decir 24.500 pies o 8.166 metros de altura.

La lnea que se cruza va desde Zaragoza hasta otro punto de distribucin imaginario
llamado NASOS en su camino hacia Mlaga. Expongamos sus coordenadas:

Punto Latitud Longitud
Zaragoza ZRZ 41 39 28 N 001 01 51 W
NASOS 39 23 57 N 0030140 W

Pasando estos valores de sexagesimal a decimal tenemos:

Zaragoza 41.657778 1.030833
NASOS 39.399167 3.027778

Recordando ahora que los puntos se entran en el orden longitud-latitud, la instruccin que nos
da de alta en la base de datos la ruta entre Zaragoza y NASOS es esta:

i nser t i nt o r adi obal i zas ( WGUI D, I dent i f i cador , Descr i pci on, geol ugar )
val ues ( ' WGUI D0101' ,
' ZRZ- NASOS' ,
' Rut a Zar agoza- NASOS' ,
geogr aphy: : STGeomFr omText ( ' LI NESTRI NG( - 1. 030833 41. 657778,
- 3. 027778 39. 399167) ' , 4326) )

Con esto, para ver las dos rutas sobre plano enviaremos la siguiente consulta a SQL
Server:

sel ect * f r omr adi obal i zas wher e wgui d > ' WGUI D0099'

Y visualizaremos:



Ahora podemos hallar la interseccin de ambas rutas:

decl ar e @r ut aBCNMAD geogr aphy;
decl ar e @r ut aZRZNASOS geogr aphy;
decl ar e @aduxo geogr aphy;

sel ect @r ut aBCNMAD = geol ugar f r omRadi obal i zas wher e wgui d =
' WGUI D0100' ;
sel ect @r ut aZRZNASOS = geol ugar f r omRadi obal i zas wher e wgui d =
' WGUI D0101' ;
set @aduxo = @r ut aBCNMAD. STI nt er sect i on( @r ut aZRZNASOS) ;
SELECT @aduxo. STAsText ( ) as conf l i ct o

El resultado es: POINT (-2.064054075908976 40.512484201408782)

Este punto se encuentra cerca del manantial de Soln de Cabras y sus coordenadas
pasadas a geogrficas sexagesimales son 40 30 44.94 N, 002 3 50.59 W.

Los datos que aparecen en el plano son ADUXO =40 30 44 N, 002 03 51, con lo
cual podemos determinar que el clculo realizado por SQL Server es ms exacto que
el propio plano de aviacin civil.



En la imagen podemos ver el mapa de aviacin civil con las coordenadas que nosotros
hemos hallado an con mayor precisin.



Mayor precisin de SQL Server en el clculo

Coordenadas de aviacin civil: 40 30 44 N, 002 0351 W
Coordenadas calculadas por SQL Server: 40 30 44.94 N, 002 3 50.59

Precisin al centmetro.
SQL 2008 en obras pblicas (ejemplo de aplicacin C#)

A continuacin vamos a escribir un ejemplo en C#sobre uso de variables geoespaciales
de SQL Server 2008.

Lo primero que debemos hacer en nuestro proyecto es asegurarnos de que vamos a
poder usar la referencia de Microsoft.SqlServer.Types.

sta se encuentra en una librera DLL de .NET que podemos referenciar desde nuestro
proyecto yendo al men Proyecto, opcin Referencias:



Esta librera se puede localizar en c:\Archivos de Programa\Microsoft SQL
Server\100\SDK\Assemblies\Microsoft.SqlServer.Types.DLL.

Una vez referenciada esta librera, podremos usar los nuevos tipos de datos definidos en
SQL 2008.

Desde nuestro cdigo fuente, en las cabeceras en las que colocamos nuestras clusulas
using aadiremos:

usi ng Mi cr osof t . Sql Ser ver . Types;

Desde este momento estar disponible el tipo SqlGeography.

Tambin es til declarar en esta misma seccin:

usi ng Syst em. Dat a. Sql Types;
Un ejemplo de topografa

El tema de aviacin es slo uno de los campos en los que podemos sacar un buen
rendimiento de SQL Server, pero si ahora hablamos del campo de aplicaciones en obras
pblicas, el abanico de soluciones se dispara.

SQL Server 2008 permite calcular reas e intersecciones (solapamientos) de reas, con
lo que podemos pedirle directamente si un punto geogrfico est afectado por una
superficie urbanstica y en qu medida o en qu parte de su superficie se encuentra.

Por ejemplo, imaginemos una base de datos de terrenos rsticos que van a atravesarse
por una planificacin de una nueva carretera.

Podemos trazar N hiptesis de carreteras y ver cul es la que afecta ms o menos a
propiedades pblicas para calcular el trazado ms barato; la que afecta ms o menos a
terrenos de inters natural para preservar la ecologa, la que se construye sobre suelos de
mayor o menor resistencia geolgica para garantizar la seguridad y prever los costes; la
ms llana, etc.

La misma funcin que hemos empleado para encontrar la interseccin de dos lneas es
la que nos sirve para encontrar el rea de solapamiento cuando sus argumentos son
polgonos en vez de lneas.

Imaginemos que tenemos una tabla con una columna del tipo geography y que dicha
columna contiene polgonos, esto es, Polygon cerrados.

Antes de entrar un polgono en SQL Server debemos tener en cuenta dos normas:

Para cerrar un Polygon, su coordenada inicial tiene que ser la misma que su
coordenada final, de modo que un cuadriltero est definido por cinco puntos, de
los cuales el primero y el quinto son el mismo. Por tanto, un polgono cerrado
de N lados estar siempre definido por N+1 puntos.
Un polgono define siempre dos reas: un rea interior y un rea exterior. Para
indicar qu queda dentro y qu queda fuera, SQL Server usa una convencin de
entrada de datos: los puntos de los vrtices del polgono deben entrarse en
orden contrario a las agujas del reloj. Si nos situsemos con un GPS en un
vrtice, deberemos emplear la regla de la mano izquierda; esto es, caminando de
un punto a otro de forma que el rea interior quede siempre a mano izquierda.
De lo contrario, SQL Server dir que la informacin geogrfica del objeto es
incorrecta.

Enunciado del problema

Tenemos dos parcelas que sumndolas componen un rectngulo irregular, a travs del
cual se debe construir un camino en diagonal.

El ayuntamiento ha decidido expropiar la parte de las parcelas correspondiente al
camino. Se desea saber en cunta superficie quedan afectadas estas parcelas para
indemnizar a sus dueos y qu superficie de pavimentacin vamos a necesitar.



Para ello vamos a crear una tabla llamada Poligonos, en la cual entraremos los datos de
cada objeto.

La tabla de polgonos deber tener un campo de cdigo alfanumrico que nosotros en
este ejemplo nos inventaremos. Normalmente se trata de la referencia catastral (el
cdigo del terreno) y un geoelemento de tipo geography, dentro del cual colocaremos
un objeto geogrfico de tipo Polygon.

Para insertar los datos desde un programa en C#utilizaremos este cdigo fuente:

pr i vat e voi d but t on1_Cl i ck( obj ect sender , Event Ar gs e)
{
/ / Hay que decl ar ar l as si gui ent es l i br er as
/ / a pr i nci pi o de pr ogr ama:
/ / usi ng Mi cr osof t . Sql Ser ver . Types;
/ / usi ng Syst em. Dat a. Sql Types;
/ / usi ng Syst em. Dat a. Sql Cl i ent ;

Sql Geogr aphy [ ] pol i gono1;
Sql Geogr aphy [ ] pol i gono2;
Sql Geogr aphy[ ] pol i gono3;
Sql Geogr aphy par cel a1;
Sql Geogr aphy par cel a2;
Sql Geogr aphy cami no;

/ / At enci n: l os punt os de un pol gono deben dar se en oden cont r ar i o
/ / a l as aguj as del r el oj , como si r ecor r i r amos el pol gono dej ando
/ / si empr e l a par t e i nt er i or a nuest r a i zqui er da.

/ / Pr i mer t er r eno:
pol i gono1 = new Sql Geogr aphy[ 5] ;

/ / Conver t i r de gr ados, mi nut os y segundos a deci mal :
pol i gono1[ 4] = ConvCoor d( " 41 33' 14. 05\ " N" , " 2 23' 56. 59\ " E" ) ;
pol i gono1[ 3] = ConvCoor d( " 41 33' 14. 26\ " N" , " 2 23' 57. 30\ " E" ) ;
pol i gono1[ 2] = ConvCoor d( " 41 33' 13. 83\ " N" , " 2 23' 57. 50\ " E" ) ;
pol i gono1[ 1] = ConvCoor d( " 41 33' 13. 60\ " N" , " 2 23' 56. 78\ " E" ) ;
pol i gono1[ 0] = ConvCoor d( " 41 33' 14. 05\ " N" , " 2 23' 56. 59\ " E" ) ;

par cel a1 = Cr ear Pol i gono( pol i gono1) ;

/ / Segundo t er r eno:
pol i gono2 = new Sql Geogr aphy[ 7] ;

/ / Conver t i r de gr ados, mi nut os y segundos a deci mal :
pol i gono2[ 6] = ConvCoor d( " 41 33' 14. 26\ " N" , " 2 23' 57. 30\ " E" ) ;
pol i gono2[ 5] = ConvCoor d( " 41 33' 14. 40\ " N" , " 2 23' 57. 77\ " E" ) ;
pol i gono2[ 4] = ConvCoor d( " 41 33' 13. 55\ " N" , " 2 23' 58. 15\ " E" ) ;
pol i gono2[ 3] = ConvCoor d( " 41 33' 13. 21\ " N" , " 2 23' 56. 99\ " E" ) ;
pol i gono2[ 2] = ConvCoor d( " 41 33' 13. 60\ " N" , " 2 23' 56. 78\ " E" ) ;
pol i gono2[ 1] = ConvCoor d( " 41 33' 13. 83\ " N" , " 2 23' 57. 50\ " E" ) ;
pol i gono2[ 0] = ConvCoor d( " 41 33' 14. 26\ " N" , " 2 23' 57. 30\ " E" ) ;

par cel a2 = Cr ear Pol i gono( pol i gono2) ;

/ / El cami no que at r avesar l os dos t er r enos en di agonal :
pol i gono3 = new Sql Geogr aphy[ 5] ;

/ / Coor denadas del cami no, anchur a i ncl ui da, como pol gono:
pol i gono3[ 4] = ConvCoor d( " 41 33' 14. 00\ " N" , " 2 23' 56. 55\ " E" ) ;
pol i gono3[ 3] = ConvCoor d( " 41 33' 14. 12\ " N" , " 2 23' 56. 61\ " E" ) ;
pol i gono3[ 2] = ConvCoor d( " 41 33' 13. 62\ " N" , " 2 23' 58. 16\ " E" ) ;
pol i gono3[ 1] = ConvCoor d( " 41 33' 13. 48\ " N" , " 2 23' 58. 09\ " E" ) ;
pol i gono3[ 0] = ConvCoor d( " 41 33' 14. 00\ " N" , " 2 23' 56. 55\ " E" ) ;

cami no = Cr ear Pol i gono( pol i gono3) ;

I nser t ar Pol i gono( " PARCELA0001" , par cel a1) ;
I nser t ar Pol i gono( " PARCELA0002" , par cel a2) ;
I nser t ar Pol i gono( " CAMI NO_0001" , cami no) ;
}

Para trabajar con las coordenadas en formato grados/minutos/segundos hemos empleado
unas rutinas auxiliares que se encargan de la conversin a sistema decimal.

Conversin de coordenadas desde expresiones alfanumricas a
decimales

La conversin de una coordenada latitud/longitud hacia un punto de Geography basado
en longitud/latitud se realiza a travs de la rutina ConvCoord:

pr i vat e Sql Geogr aphy ConvCoor d( st r i ng st r Lat i t ud, st r i ng st r Longi t ud)
{
Sql Geogr aphy punt o;
st r i ng st r Char sLat i t ud;
st r i ng st r Char sLongi t ud;
Sql Char s Expr esi onPunt o;
doubl e dbl Lat i t ud;
doubl e dbl Longi t ud;

dbl Longi t ud = Conver t i r Gr ados_Deci mal ( st r Longi t ud) ;
dbl Lat i t ud = Conver t i r Gr ados_Deci mal ( st r Lat i t ud) ;

st r Char sLongi t ud = dbl Longi t ud. ToSt r i ng( ) ;
st r Char sLat i t ud = dbl Lat i t ud. ToSt r i ng( ) ;

/ / Pr eveni r cont r a coma deci mal :
st r Char sLongi t ud = st r Char sLongi t ud. Repl ace( ' , ' , ' . ' ) ;
st r Char sLat i t ud = st r Char sLat i t ud. Repl ace( ' , ' , ' . ' ) ;

/ / El or den de l as coor denadas debe ser l ongi t ud pr i mer o y l at i t ud despus:
Expr esi onPunt o = new System. Data. Sql Types. Sql Chars( "POI NT("+strCharsLongi tud+"
"+strCharsLati tud+")");

punt o = Sql Geogr aphy. STGeomFr omText ( Expr esi onPunt o, 4326) ;

r et ur n punt o;
}

Pongamos especial atencin a las instrucciones Replace, puesto que las comas
decimales se deben sustituir por puntos o viceversa segn el caso. Esto pasa debido a la
configuracin internacional de Windows y al hecho de que en Espaa se usan las comas
en vez de los puntos como separador decimal.

Como podemos apreciar, esta rutina llama a su vez a la rutina
ConvertirGrados_Decimal, la cual contiene el siguiente cdigo fuente:

pr i vat e doubl e Conver t i r Gr ados_Deci mal ( st r i ng st r Gr ados)
{
doubl e dbl Val or Deci mal = 0. 0;
doubl e gr ados = 0. 0;
doubl e mi nut os = 0. 0;
doubl e segundos = 0. 0;
i nt pos = 0;
st r i ng st r Temp = " " ;
st r i ng st r Copi a = st r Gr ados;
st r i ng st r Ul t i moCar act er = " " ;

pos = st r Copi a. I ndexOf ( ' ' ) ;
i f ( pos > 0)
{
st r Temp = st r Copi a. Subst r i ng( 0, pos) ;
gr ados = Conver t . ToDoubl e( st r Temp) ;
st r Copi a = st r Copi a. Subst r i ng( pos+1, st r Copi a. Lengt h - pos- 1) ;
st r Copi a = st r Copi a. Tr i m( ) ;

pos = st r Copi a. I ndexOf ( " ' " ) ;
i f ( pos > 0)
{
st r Temp = st r Copi a. Subst r i ng( 0, pos) ;
mi nut os = Conver t . ToDoubl e( st r Temp) ;
st r Copi a = st r Copi a. Subst r i ng( pos + 1, st r Copi a. Lengt h - pos - 1) ;
st r Copi a = st r Copi a. Tr i m( ) ;

pos = st r Copi a. I ndexOf ( " \ " " ) ;
i f ( pos > 0)
{
st r Temp = st r Copi a. Subst r i ng( 0, pos) ;
st r Temp = st r Temp. Repl ace( " . " , " , " ) ; / / Par a espaa: coma deci mal
segundos = Conver t . ToDoubl e( st r Temp) ;

mi nut os = mi nut os / 60;
segundos = segundos / 3600;

dbl Val or Deci mal = gr ados + mi nut os + segundos;

/ / Si es del Oest e o del Sur , pasar a negat i vo:
st r Ul t i moCar act er = st r Copi a. Subst r i ng( st r Copi a. Lengt h - 1, 1) ;
st r Ul t i moCar act er = st r Ul t i moCar act er . ToUpper ( ) ;
i f ( st r Ul t i moCar act er == " W" | |
st r Ul t i moCar act er == " O" | |
st r Ul t i moCar act er == " S" )
{
dbl Val or Deci mal = dbl Val or Deci mal * ( - 1) ;
}
}
}
}
r et ur n dbl Val or Deci mal ;
}

Recordemos de nuevo la importancia del Replace con las comas y los puntos decimales.
De lo contrario podramos obtener errores importantes en el clculo.

La coleccin de todos estos puntos para crear un polgono debe hacerse ordenadamente
mediante la funcin CrearPoligono que recibe como parmetro una matriz de puntos y
devuelve un objeto Polygon.

Este es su cdigo fuente:

pr i vat e Sql Geogr aphy Cr ear Pol i gono( Sql Geogr aphy [ ] pol i punt os)
{
/ / At enci n: l os punt os del per met r o deben dar se en oden cont r ar i o
/ / a l as aguj as del r el oj , como si r ecor r i r amos el pol gono dej ando
/ / si empr e l a par t e i nt er i or a nuest r a i zqui er da.
st r i ng st r Par cel a;
Sql Char s Expr esi onPol i gono;
Sql Geogr aphy pol i gono;

/ / Cr ear el pol gono:
st r Par cel a = " POLYGON( ( " ;
f or each ( Sql Geogr aphy coor denada i n pol i punt os)
{
i f ( coor denada ! = nul l )
{
st r Par cel a += coor denada. Long. ToSt r i ng( ) . Repl ace( " , " , " . " ) + " " +
coor denada. Lat . ToSt r i ng( ) . Repl ace( " , " , " . " ) + " , " ;
}
}
st r Par cel a = st r Par cel a. Subst r i ng( 0, st r Par cel a. Lengt h - 2) ;
st r Par cel a += " ) ) " ;

Expr esi onPol i gono = new Sql Char s( st r Par cel a) ;

pol i gono = new Sql Geogr aphy( ) ;
pol i gono = Sql Geogr aphy. STPol yFr omText ( Expr esi onPol i gono, 4326) ;

r et ur n pol i gono;
}

Polgonos dentro de polgonos: ejemplo de usos del suelo

Como podemos apreciar, la sintaxis del polgono emplea dos parntesis al principio y
dos al final. No se trata de un error de Microsoft.

Esta sintaxis est pensada para definir polgonos con agujeros, o sea, polgonos dentro
de polgonos, como un queso de Gruyre, de foma que el polgono exterior es macizo y
el polgono interior est vaco.

Esto es ideal para definir los usos del suelo en la administracin pblica. Por ejemplo,
un polgono de zona residencial que contien en su interior una zona verde.

La superficie residencial es una, mientras que la zona verde es otra.

Para definir los puntos de la zona residencial deberamos tomarlos en orden contrario a
las aguas del reloj, mientras que el agujero de la zona verde se debera tomar en el
orden de las agujas del reloj, esto es: regla de la mano izquierda para el polgono
residencial, regla de la mano derecha para la zona verde.

A partir de este momento, este polgono complejo ofrece sus resultados de rea restando
el agujero de la zona verde de forma automtica y SQL Server 2008 nos los sirve
siguiendo esta norma implcitamente.

Potente verdad?

Preguntando a SQL Server por las parcelas insertadas

Ya podemos enviar la consulta ms simple posible para saber qu tenemos dentro de la
tabla Poligonos:

sel ect * f r omPol i gonos

Si seleccionamos la pestaa de datos geoespaciales, veremos la representacin sobre el
plano de los dos terrenos y el camino que los atraviesa en diagonal:



Obteniendo los resultados de superficie

Para saber el rea de cada parcela emplearemos:

sel ect I DPol i gono, geopol i gono, geopol i gono. STAr ea( ) as super f i ci e
f r ompol i gonos

Esto nos proporciona el siguiente conjunto de resultados:



Ya tenemos las superficies de los polgonos calculadas en metros cuadrados.

Por tanto, ya podemos responder a la pregunta de cuntos metros cuadrados debemos
pavimentar en el camino: 167.25 m2

Obteniendo los resultados de superficie a expropiar

Ahora vamos a hallar la interseccin entre la parcela pequea (PARCELA0001) y el
camino.

El resultado, en tres lneas SQL:

decl ar e @cami no as geogr aphy;

sel ect @cami no = geopol i gono f r omPol i gonos wher e I DPol i gono =
' CAMI NO_0001'

sel ect I DPol i gono, geopol i gono, geopol i gono. STAr ea( ) as super f i ci e,
geopol i gono. STI nt er sect i on( @cami no) . STAr ea( ) as i nt er secci on
f r ompol i gonos WHERE I DPol i gono LI KE ' PARCELA%'

El resultado es:



Por tanto, a la parcela1 se le deber indemnizar por expropiarle 79.06 m2 y a la parcela2
se le deber indemnizar por expropiarle 80.13 m2.

Elaborando las soluciones en C#

Cmo se resuelven estas consultas en C#?

Mediante un SQLDataReader, por ejemplo:

doubl e Obt ener Super f i ci e( st r i ng st r I DPol i gono)
{
Sql Connect i on conn;
Sql Command comando;
Sql Dat aReader l ect or ;
st r i ng st r Conexi on;
st r i ng st r ComandoSQL;
doubl e dbl Super f i ci e = 0. 0;
/ / Cadena de conexi n con l a base de dat os:
st r Conexi on = " DATA SOURCE=ESTUDI \ \ NEWSQL2008; " ;
st r Conexi on += " I NI TI AL CATALOG=GeoMake; " ;
st r Conexi on += " I NTEGRATED SECURI TY=SSPI ; " ;

conn = new Sql Connect i on( st r Conexi on) ;
t r y
{
conn. Open( ) ;
}
cat ch ( Sql Except i on ex)
{
MessageBox. Show( ex. Message) ;
r et ur n dbl Super f i ci e;
}

comando = new Sql Command( ) ;
st r ComandoSQL = " SELECT geopol i gono. STAr ea( ) FROM Pol i gonos WHERE I DPol i gono
= ' " + st r I DPol i gono + " ' " ;
comando. Connect i on = conn;
comando. CommandText = st r ComandoSQL;

t r y
{
l ect or = comando. Execut eReader ( ) ;
}
cat ch ( Sql Except i on ex)
{
MessageBox. Show( ex. Message) ;
r et ur n dbl Super f i ci e;
}
i f ( l ect or . Read( ) )
{
dbl Super f i ci e = l ect or . Get Doubl e( 0) ;
}

conn. Cl ose( ) ;
r et ur n dbl Super f i ci e;
}

Una rutina equivalente recoge el resultado para las intersecciones.

He aqu las tres respuestas:







Conclusin

Las nuevas prestaciones relacionadas con los datos geoespaciales de Microsoft SQL
Server 2008 van mucho ms all de proporcionar un tipo de dato para trabajar con
coordenadas.

El hecho de disponer conjuntaente de diferentes tipos de datos geogrficos agrupados
dentro de geography nos abre un campo importantsimo en aplicaciones geogrficas y
de ingeniera y nos facilita mucho el trabajo:

Implementa polimorfismo, permitiendo guardar puntos, lneas, ruras, polgonos,
curvas, etc. dentro de un mismo tipo de dato y permitiendo averiguar el tipo en
tiempo real (Run Time Type Identification).
Permite acceder a todo el objeto almacenado como un todo o a sus componentes
(primer punto, primer polgono, punto N de una polilnea).
Permite emplear diferentes modelizaciones del elipsoide del globo terrqueo,
adems del estndar de captacin de puntos por GPS que acta por defecto, lo
cual a su vez permite fundir nuestros datos normalizados captados sobre el
campo con datos provinientes de programas GIS que emplean otros elipsoides,
como por ejemplo ESRI. Ahora resulta muy sencillo realizar migraciones de
ESRI a SQL Server para evitar las diferencias con los sistemas de GPS.
Permite emplear la librera SQLCLR, lo cual permite emplear .NET dentro de
sentencias SQL.
Proporciona funciones de altsima precisin para el clculo de distancias, reas,
intersecciones, solapamientos, inclusiones o exclusiones, que pueden emplearse
no slo como resultado sino como parte de una condicin de filtro, etc.
Proporciona una capa de programacin .NET que es la traduccin de la librera
geogrfica para trabajar en lenguajes .NET como VB, C#o Visual C++.NET
directamente con estos tipos y funciones de ingeniera.
Modifica la manera de construir aplicaciones geogrficas a partir de este
momento, centrando el trabajo en la captacin de puntos y en a devolucin de
resultados y dejand que sea SQL Server quien almacene los datos y realice los
clculos.

Espero que este artculo sirva para dar una mayor idea en la prctica de las nuevas
prestaciones de SQL Server y anime al lector a sacarle pronto beneficio.

Alfons Gonzlez

También podría gustarte