Geography es de tipo espacial, y está implementado como un tipo de datos CLR en Sql Server, es decir es una clase administrada . Este tipo representa daata en un sistema de coordenadas de la tierra, la cual almacena información elipsoidal como latitud y longitud.
Ahora veremos un pequeño ejemplo de como hacer una consulta pero antes necesitamos crear nuestra tabla:
Código
CREATE TABLE [dbo].[Customer]([ID] [decimal](18, 0) IDENTITY(1,1) NOT NULL,[Name] [varchar](250) NOT NULL,[Location] [geography] NOT NULL,CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED([ID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
Simplemente creamos una tabla de clientes, con un ID, Nombre y su posición espacial utilizando el tipo geography. Ejecutamos el Script para crear la tabla y listo.
Ya con nuestra tabla creada ingresaremos la data. Hay que tener en cuenta que la posición es parecido a X,Y, (Longitud y latitud). Otro punto es que la data para ser convertida hay que utilizar ciertos métodos del tipo geography, la lista de métodos pueden verla en http://msdn.microsoft.com/en-us/library/bb933988.aspx los cuales soportan las especificaciones de Open Geospatial Consortium (OGC).
En este caso usaremos STGeomFromText, el cual según msdn se define como: "STGeomFromText (geography Data Type): Returns a geography instance from an Open Geospatial Consortium (OGC) Well-Known Text (WKT) representation augmented with any Z (elevation) and M (measure) values carried by the instance."
La sintaxis es la siguiente:
Código:
STGeomFromText ( 'geography_tagged_text' , SRID )
El primer parámetro es el texto que queremos parsear como coordenadas, puede ser algo como 'POINT(-81.13 -6.17)'
El segundo parámetro es el identificador de referencia espacial. En nuestro caso usaremos el del planeta tierra que es el World Geodetic System 1984 (WGS 84) en donde el valor es: 4326 segun la tabla de sqlserver sys.spatial_reference_systems.
Con todo esto explicado el insert quedaría algo así:
Código
INSERT INTO Customer VALUES('Juan', geography::STGeomFromText('POINT(-81.13 -6.17)',4326))
Hacemos un Query:
Código
SELECT * FROM Customer
Código:
1 Juan 0xE6100000010CAE47E17A14AE18C0B81E85EB514854C0
Pero es muy dificil de comprender, por lo que hacemos un cast a Point:
Código
SELECT ID,Name,Location,CONVERT(Varchar(max),Location) AS Point FROM Customer
Código:
1 0xE6100000010CAE47E17A14AE18C0B81E85EB514854C0 POINT (-81.13 -6.17)
Intentemos algo más interesante: Hay un método llamado STDistance, el cual te regresa la distancia entre dos puntos, entonces hacemos la siguiente consulta:
Código
INSERT INTO Customer VALUES('Juan', geography::STGeomFromText('POINT(-60.13 -6.17)',4326))GOSELECT ID,Name,CONVERT(Varchar(max),Location) AS Point,Location.STDistance(geography::STGeomFromText('POINT(-50.13 -6.17)',4326))FROM CustomerGO
¿Qué hace? Pues, primero añadimos otro registro para darle un poco más valor a esto. Luego ejecutamos el Select, el cual calcula por cada registro la distancia sobre un punto en común: geography::STGeomFromText('POINT(-50.13 -6.17)',4326)
Cuando vemos el resultado es más fácil de entender:
Código:
ID Name Location Distance
1 Juan POINT (-81.13 -6.17) 3430549.19165979
3 Pedro POINT (-60.13 -6.17) 1106773.11874875
De esta forma podemos hacer que la consulta nos traiga los 10 Clientes más cercanos a X punto, qué es mucho más preciso que hacerlo por ciudad o algo parecido.
Un saludo, espero seguir con el tema en cuanto pueda.
Excelente
ResponderEliminarHola, tengo dudas, yo uso coordenadas del tipo 20.80532, -100.25363 con lo cual me da el error de que las coordenadas deben ir de 90 a -90 pero no se como convertirlas ni como se llaman para buscar en internet??? me ayudas con esto
ResponderEliminarHola, No se por qué te falla. Qué SRID estás usando? es el último número en las coordenadas....
ResponderEliminarExcelente! tengo una consulta, la distancia es en metros?
ResponderEliminarHola Alicia! Disculpa que me haya tardado tanto. Casi no tengo tiempo libre.
ResponderEliminarComo ves en STGeomFromText estoy usando el identificador 4326 el cual para STDistance retorna metros.
He conseguido un enlace a un documento que leí hace tiempo. Es interesante: go.microsoft.com/fwlink/?LinkId=226407
Saludos!