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(); |