Tipos de dato espaciales de SQL Server
SQL Server no tiene ningún problema en guardar información relacionada con coordenadas, para obtener posicionamientos es decir ubicaciones o calculo de áreas geográficas o geométricas, para esto se vale de dos tipos de dato, que son geometry y geography .
Hay que tener en cuenta que en la industria, los datos espaciales vienen en muchas formas, contamos con sistemas basados en ráster que representan los datos como una serie de píxeles o puntos. y también tenemos los sistemas basados en vectores que representan formas como una serie de pequeños segmentos de línea. El soporte espacial para SQL Server se basa en datos vectoriales.
También hay sistemas que se basan en la tecnología 2-D, 3-D y 4-D. SQL Server actualmente admite aplicaciones 2-D. Puede almacenar y recuperar información tridimensional, pero no la utiliza durante la realización de cálculos.
SQL Server admite dos tipos de datos espaciales:
El tipo de datos geometry que admite datos planos o euclidianos (tierra plana) y se ajusta a las características simples del Open Geospatial Consortium (OGC) para la especificación SQL versión 1.1.0 y cumple con SQL MM (estándar ISO).
Además, SQL Server admite el tipo de datos de geography , que almacena datos elipsoidales (tierra redonda), como las coordenadas de latitud y longitud del GPS.
Ambos tipos de datos se implementan como tipos de datos .NET Common Language Runtime (CLR) en SQL Server, es decir bajo un asembly.
Los tipos de datos de geometry y geography admiten dieciséis objetos de datos espaciales, o tipos de instancia. Sin embargo, solo once de estos tipos de instancias son instanciables ; puede crear y trabajar con estas instancias (o instanciarlas) en una base de datos. Estos casos se derivan ciertas propiedades de sus tipos de datos de los padres que los distinguen como Puntos , cadenas lineales, circularStrings , CompoundCurves , polígonos , CurvePolygons o como múltiples geometría o geografía instancias en un GeometryCollection .
El tipo de geografía tiene un tipo de instancia adicional,FullGlobe
Creemos algunas variables de tipo espacial como ejemplo :
–Empecemos por consultar los sistemas de referencias con los que cuenta el sql server
Use tempdb;
go
Select * from sys.spatial_reference_systems
go
Select * from sys.spatial_reference_systems
where spatial_reference_id=4326
go
SELECT DISTINCT unit_of_measure, unit_conversion_factor
FROM sys.spatial_reference_systems;
GO
—Dibujar una forma usando geometría
Declare @shape geometry;
Set @shape= geometry::STGeomFromText(‘POLYGON((10 10, 25 15, 35 15, 40 10, 10 10))’,0);
Select @shape
go
–Dibujar un Circulo
DECLARE @G geometry = ‘CIRCULARSTRING(1 1, 2 2, 3 1, 2 0, 1 1)’
Select @G
—Dibujar dos forma usando geometría
Declare @shape1 geometry;
Declare @shape2 geometry;
Set @shape1= geometry::STGeomFromText(‘POLYGON((10 10, 25 15, 35 15, 40 10, 10 10))’,0);
Set @shape2= geometry::STGeomFromText(‘POLYGON((10 10, 25 5, 35 5, 40 10, 10 10))’,0);
Select @shape1
Union all
Select @shape2
go
—Dibujar la dos formas juntas
Declare @shape1 geometry;
Declare @shape2 geometry;
Set @shape1= geometry::STGeomFromText(‘POLYGON((10 10, 25 15, 35 15, 40 10, 10 10))’,0);
Set @shape2= geometry::STGeomFromText(‘POLYGON((10 10, 25 5, 35 5, 40 10, 10 10))’,0);
Select @shape1.STUnion(@shape2)
–Dibujar un pentágono
DECLARE @Pentagon geography;
SET @Pentagon = geography::STPolyFromText(
‘POLYGON(( -77.0532219483429 38.870863029297695,
-77.05468297004701 38.87304314667469,
-77.05788016319276 38.872800914712734,
-77.05849170684814 38.870219840133124,
-77.05556273460198 38.8690670969195,
-77.0532219483429 38.870863029297695),
( -77.05582022666931 38.8702866652523,
-77.0569360256195 38.870734733163644,
-77.05673214773439 38.87170668418343,
-77.0554769039154 38.871848684516294,
-77.05491900444031 38.87097997215688,
-77.05582022666931 38.8702866652523))’,
4326);
SELECT @Pentagon;
GO
–Medir la distancia entre los Angeles y Nueva York
Declare @NewYork geography;
Declare @LosAngeles geography;
Set @NewYork= geography::STGeomFromText(‘POINT(-74.0007339 40.726966)’, 4326);
Set @LosAngeles= geography::STGeomFromText(‘POINT(-118.24585 34.083375)’, 4326);
Select @NewYork.STDistance(@LosAngeles);
go
–Metodo Tostring
DECLARE @Point geometry;
SET @Point = geometry::STPointFromText(‘POINT(10 20 15 5)’, 0);
SELECT @Point.ToString()
GO
–Entrada GML
DECLARE @Point geography;
SET @Point = geography::GeomFromGml(‘ 12 50 ‘,4326);
SELECT @Point;
GO
–Medir la distancia entre los Guatemala y Nueva York
Declare @NewYork geography;
Declare @Guatemala geography;
Set @NewYork= geography::STGeomFromText(‘POINT(-74.0007339 40.726966)’, 4326);
Set @Guatemala= geography::STGeomFromText(‘POINT(-90.2307587 15.7834711)’, 4326);
Select @NewYork.STDistance(@Guatemala);
GO
–Agregar una columna a una tabla con el tipo de dato geográfico y agregarle datos
Use Northwind
GO
Alter table customers
add GeogCol1 geography;
go
Alter table customers
add GeogCol2 as GeogCol1.STAsText()
go
–– Es posible también asignar un índice espacial para este tipo de datos
Create spatial index SIndx_Customers on Customers (GeogCol1)
Update Customers Set GeogCol1 =
geography::STGeomFromText(‘LINESTRING(-122.360 47.656, -122.343 47.656 )’, 4326) where customerid=’ALFKI’
GO
–Consultemos el registro
Select * from customers where customerid=’ALFKI’