En la primera parte del post sobre tipos de datos espaciales, nos adentramos en la teoría sobre los tipos de datos espaciales. En esta ocasión, vamos a continuar, mostrando ejemplos de utilización de los mismos

Teniendo presente la siguiente línea definida como instancia geométrica

DECLARE @g geometry;

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

Podemos aplicarle métodos que extraen información:

DECLARE @g geometry;

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

–Obtiene el punto de inicio

SELECT @g.STStartPoint().STAsText();

— Obtiene el punto final

SELECT @g.STEndPoint().STAsText();

— Obtiene el punto nº 2

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

— Obtiene el nº de puntos que conforman el LineString

SELECT @g.STNumPoints();

— Nos dice si la cadena forma un anillo

SELECT @g.STIsRing();

— Nos dice si la cadena se cierra

SELECT @g.STIsClosed();

— Nos dice cualquier punto que pertenezca a la línea de forma aleatoria

SELECT @g.STPointOnSurface().STAsText();

NOTA: Recuerda que se trata de un tipo de datos CLR y por lo tanto los métodos son sensibles a mayúsculas y minúsculas.

Además de trabajar con los datos utilizando los métodos disponibles, la aplicación real se la daremos a datos almacenados en la base de datos.

El siguiente código crea una columna en la que almacenamos un tipo de datos geometry, y otra columna calculada que nos reporta como texto (WKT) el contenido de la columna geometry

if not exists(select 1 from sys.databases where name = ‘SQM_Spatial’)

    create database SQM_Spatial;

go

use SQM_Spatial;

IF OBJECT_ID ( ‘dbo.SpatialTable’, ‘U’ ) IS NOT NULL

DROP TABLE dbo.SpatialTable;

GO

CREATE TABLE SpatialTable

( id int IDENTITY (1,1),

GeomCol1 geometry,

GeomCol2 AS GeomCol1.STAsText() );

GO

 

Aquí podemos ver como almacenar datos en la columna, tal y como lo hemos estado viento anteriormente (usando formato WKT ó Well Known Text)

INSERT INTO SpatialTable (GeomCol1)VALUES (geometry::STGeomFromText(‘LINESTRING (100 100, 20 180, 180 180)’, 0));

INSERT INTO SpatialTable (GeomCol1) VALUES (geometry::STGeomFromText(‘POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))’, 0));

GO

 

También disponemos de la opción de trabajar con datos en formato WKB ( Well Known Binary )

INSERT INTO SpatialTable (GeomCol1) VALUES (geometry::STGeomFromWKB(0x0102000000270000000000000000C05140000000000090764000000000000052400000000000

7076400000000000C052400000000000207640000000000040534

00000000000F07540000000000040544000000000009075400000

00000040554000000000007075400000000000005640000000000

0707540000000000080584000000000007075400000000000405B

4000000000009075400000000000805D400000000000F07540000

0000000405E4000000000001076400000000000C05F4000000000

0060764000000000006060400000000000C076400000000000606

0400000000000F076400000000000606040000000000030774000

00000000606040000000000070774000000000006060400000000

000D0774000000000004060400000000000107840000000000000

604000000000003078400000000000405F4000000000006078400

000000000805E4000000000008078400000000000005D40000000

00008078400000000000005C40000000000080784000000000000

05A4000000000008078400000000000C058400000000000807840

00000000008057400000000000707840000000000080554000000

00000407840000000000000544000000000000078400000000000

4053400000000000F077400000000000C052400000000000C0774

00000000000005240000000000090774000000000004051400000

00000060774000000000004051400000000000507740000000000

0405140000000000010774000000000008051400000000000C076

400000000000C051400000000000B076400000000000C05140000

0000000A076400000000000C05140000000000090764000000000

008051400000000000807640,0))

NOTA: Hay retornos de carro dentro del WKB por facilitar la lectura del post

Si queremos realizar una consulta sobre los datos, podemos utilizar métodos sobre los mismos, para interpretar mejor la información

DECLARE @geom1 geometry;

DECLARE @geom2 geometry;

DECLARE @result geometry;

SELECT @geom1 = GeomCol1 FROM SpatialTable WHERE id = 1;

SELECT @geom2 = GeomCol1 FROM SpatialTable WHERE id = 2;

— Calculamos la intersección entre ambos objetos

SELECT @result = @geom1.STIntersection(@geom2);

— Mostramos en WKT la intersección dada

SELECT @result.STAsText();

— Incluso podemos verlos en su representación WKB

select GeomCol1.STAsBinary() from SpatialTable

 

Los tipos de datos Espaciales también disponen de métodos de modificación y tratamiento de datos. De esta forma podemos generar un polígono en base a dos polígonos origen

DECLARE @g geography;

DECLARE @h geography;

SET @g = geography::STGeomFromText(‘POLYGON((47.653 -122.358, 47.649 -122.348, 47.658 -122.348, 47.658 -122.358, 47.653 -122.358))’, 4326);

SET @h = geography::STGeomFromText(‘POLYGON((47.656 -122.351, 47.656 -122.341, 47.661 -122.341, 47.661 -122.351, 47.656 -122.351))’, 4326);

— El resultado de la unión de ambos polígonos lo podemos calcular de la siguiente forma

SELECT @g.STUnion(@h).ToString();

 

 

Al igual que los métodos de manipulación, también disponemos de métodos de determinación de relaciones entre instancias geography.

DECLARE @g geography;

DECLARE @h geography;

SET @g = geography::STGeomFromText(‘POLYGON((47.653 -122.358, 47.649 -122.348, 47.658 -122.348, 47.658 -122.358, 47.653 -122.358))’, 4326);

SET @h = geography::STGeomFromText(‘LINESTRING(47.656 -122.360, 47.656 -122.343)’, 4326);

SELECT @g.STIntersection(@h).ToString();

 

 

 

 

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á