Lucas's profileLucas Souza [MCP | MCTS ...PhotosBlogListsMore ![]() | Help |
|
|
August 08 Utilizando dados espaciais no SQL Server 2008 (Parte 02)A Paz do Senhor Esteja Convosco, No artigo anterior falamos qual a importância dos dados espaciais em nossas aplicações, porque e quando devemos utilizar, o que é o plano geométrico e suas dimensões, qual diferença dos tipos de dados geometry e geography os quais são novos tipos de dados que estão presente no SQL Server 2008 e por último vimos quais são os tipos específicos para cada tipo de dados existente. Ao termos conhecido as diferenças dentre os tipos de dados geometry e geography o que nos resta neste momento é conhecermos quais são os diferentes formatos que podem ser utilizados para representar os dados espaciais, existe exatamente três: 1. The Well-Known-Binary (WKB) format 2. The Well-Known-Text (WKT) format 3. The Geography Markup Language (GML) data format. Todos os formatos mostrado acima foram publicados pela Open Geospatial Consortium (OGC) o qual é lider dos padrões geoespaciais e serviços baseados em locazalições. 1. The Well-Known-Binary (WKB) format : Este é o formato binário pelo qual representa a instância do tipo de dados geography, é um dos formatos preferidos serializados das aplicações que necessitam armazenar informações geoespacial em compactação.
2. The Well-Known-Text (WKT) format: Este formato é compacto, ou melhor nos garante uma leitura fácil, isto porque é um formato amigável e o mais comum para se usar em consultas geoespaciais.
3. The Geography Markup Language (GML) data format: Este formato representa o padrão (XML), o qual é a melhor alternativa para incluir informações geoespaciais em documentos XML. Este formato é útil em aplicações onde é necessário alterar informações geoespaciais por meios de XML Web Service. Os padrões conforme foi ilustrado acima nos oferece vastas vantagens, o que precisa ser analisado é: Qual deles se comportaria de melhor forma em nossas aplicações. Os dados espaciais também suportam algumas funções, atualmente existem mais de 60 nos tipo de dados geometry e geography. STDifference -- Results: POLYGON ((10 10, 40 10, 40 26.666666666666668, 20 20, 26.666666666666668 40, 10 40, 10 10)) DECLARE @g geometry = 'POLYGON((10 10, 40 10, 40 40, 10 40, 10 10))' DECLARE @h geometry = 'POLYGON((20 20, 50 30, 50 50, 30 50, 20 20))'
SELECT @G.STDifference(@H).ToString();
STIntersects -- Results: POLYGON ((30 30, 40 30, 40 40, 30 40, 30 30)) DECLARE @g geometry = 'POLYGON((10 10, 40 10, 40 40, 10 40, 10 10))' DECLARE @h geometry = 'POLYGON((30 30, 50 30, 50 50, 30 50, 30 30))'
SELECT @g.STIntersection(@h).ToString();
STSymDifference -- Results: MULTIPOLYGON (((50 30, 50 50, 30 50, 40 40, 50 30)), ((10 10, 40 10, 40 40, 10 40, 10 10))) DECLARE @h geometry = 'POLYGON((40 40, 50 30, 50 50, 30 50, 40 40))'
SELECT @g.STSymDifference(@h).ToString();
STUnion -- Results: MULTIPOLYGON (((50 30, 50 50, 30 50, 40 40, 50 30)), ((40 10, 40 40, 10 40, 20 20, 40 10))) DECLARE @g geometry = 'POLYGON((20 20, 40 10, 40 40, 10 40, 20 20))' DECLARE @h geometry = 'POLYGON((40 40, 50 30, 50 50, 30 50, 40 40))'
SELECT @g.STUnion(@h).ToString();
-- Results: MULTILINESTRING ((40 40, 30 30), (25 25, 8 8)) DECLARE @g geometry = 'LINESTRING(8 8, 40 40)' DECLARE @h geometry = 'POLYGON((25 25, 15 30, 30 30, 30 15, 25 25))'
SELECT @g.STDifference(@h).ToString(); ![]() Figura 1.4 (Function – Blended Types)
-- Results: 400 | 121.28990204492 SELECT @g.STArea(), @g.STLength()
STCentroid -- Results: POINT (20 30) DECLARE @g GEOMETRY = 'POLYGON((10 10, 10 40, 40 40, 10 10))' SELECT @g.STCentroid().ToString() Utilizando dados espaciais no SQL Server 2008 (Parte 03)
Continuação...
STWithin, STContains
Dois métodos que seguem também o padrão OGC retornando 1 ou 0 e indica se todos ‘Points’ da instância existe totalmente ao lado de outra instância STContains() testa se o parâmetro instância está do lado da instância base STWithin() testa se a instância base está do lado da instância parâmetro, retorna verdadeiro se dado o valor geometric estiver juntamente á outro, de outra forma, retorna falso. Este método irá retorna NULL se todos SRID da instância não possuír o valor adequado ao SRID da outra instância; -- Results: 1 0 -- 0 1 DECLARE @g geometry = 'POLYGON ((10 10, 13 30, 30 30, 30 15,10 10))' DECLARE @h geometry = 'LINESTRING (16 16, 16 24, 25 18)'
SELECT @g.STContains(@h), @g.STWithin(@h) SELECT @h.STContains(@g), @h.STWithin(@g)
STPointOnSurface SELECT @g.STPointOnSurface().ToString()
STGeometryType -- Results: Polygon DECLARE @g geometry; SET @g = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))', 0); SELECT @g.STGeometryType(); STGeomFromText -- Results: LINESTRING (100 100, 20 180, 180 180) DECLARE @g geometry; SET @g = geometry::ST GeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0); SELECT @g.ToString(); STTouches STDistance
Aos termos analisado algumas funções e formatos existentes nos dados espaciais, o que nos resta agora é apenas aplicar-los, os tipos específicos podem ser usados ambos em definições de tabela e tipos variáveis. Dependendo de sua manipulação dos dados espaciais sendo plano ou ellipso pode-se usar ambos os tipo de dados geometry e geography, iremos neste momento ao exemplo prático. USE master GO
IF EXISTS(SELECT Name FROM sys.databases WHERE name = N'SpatialDatabase') DROP DATABASE SpatialDatabase
CREATE DATABASE SpatialDatabase ON PRIMARY (NAME = SpatialDatabase_data, FILENAME = 'C:\DatabaseSpatial\SpatialDatabase.mdf'), FILEGROUP SpatialGroup1 (NAME = SpatialGroup2, FILENAME = 'C:\DatabaseSpatial\SpatialDatabase.ndf') LOG ON (NAME = Spatial_log, FILENAME = 'C:\DatabaseSpatial\SpatialDatabase.ldf') GO
USE SpatialDatabase;
CREATE TABLE #GeometrySpatial ( LocationID INT PRIMARY KEY CLUSTERED NOT NULL, LocationName NVARCHAR(30), Position GEOGRAPHY );
INSERT INTO #GeometrySpatial (LocationID,LocationName,Position) VALUES (1,'Nova York', geography::Parse('POLYGON(( -75.17031 39.95601, -75.16786 39.95778, -75.17921 39.96874, -75.18441 39.96512, -75.17031 39.95601 ))'))
INSERT INTO #GeometrySpatial (LocationID,LocationName,Position) VALUES (2,'Chicago', geography::Parse('POLYGON(( -75.17031 39.95601, -75.16786 39.95778, -75.18870 39.97789, -75.18521 39.99237, -75.18603 40.00677, -75.19922 40.01136, -75.21746 40.03142, -75.22534 40.02586, -75.21052 40.01430, -75.19192 40.00634, -75.19248 39.99570, -75.20526 39.98374, -75.19437 39.97704, -75.19087 39.96920, -75.17031 39.95601))'))
INSERT INTO #GeometrySpatial (LocationID,LocationName,Position) VALUES (3,'Miami', geography::Parse('POLYGON(( -75.22280 40.02387, -75.21442 40.02810, -75.21746 40.03142, -75.22534 40.02586, -75.22280 40.02387))'))
-- Trazendo os valores de forma compreensivel. SELECT LocationID,LocationName,Position.ToString() as WKT, Position.STLength() as longitude FROM #GeometrySpatial
Figura 2.0 (Results – measures and longitude) -- Visualizando o Spatial Results SELECT * FROM #GeometrySpatial
OBS: Se por acaso quisermos obter a lista de todos SRIDs suportados pelo SQL Server, podemos executar a instrução: Figura 1.2 (Results - SRIDs)
Ótimo, agora que conhecemos o que são os dados espacias, quando devemos utilizar, quais são as diferença dentre os tipos de dados geometry e geography, quais são os formatos e tipos existentes suportados pelo SQL Server e o exemplo prático, o que resta neste momento é apenas implementar-los em nossa aplicação e assim termos a convicção de que possuímos uma aplicação pelo qual possui ótimas vantagens quando o assunto se relata em buscas (mundialmente).
[]´s
Lucas Souza July 31 Usando Dados Espaciais no SQL Server 2008 (Parte 01)A Paz do Senhor Esteja Convosco, Lembro-me de que há alguns dias atrás estive escrevendo alguns artigos relacionado á dados espaciais no SQL Server 2008, porém devido ao tempo apresentei apenas uma visão geral, nesta série de artigos espero ir bem além do que já vimos. Ótimo, além do SQL Server nos fornecer diversas opções relacionado á Integração de Dados, Relátorio de dados, Replicação de dados, Políticas, Manutenção de Planos, temos também agora suporte á dados espaciais no SQL Server 2008, os dados espaciais são implementados por ‘CLR Types’ interno no banco de dados, os dados espaciais tem por objetivo de armazenar dados representando posições e estruturas geométrica no SQL Server. Tendo isto em mente podemos agora desenvolver aplicações que pode nos conceder a distância, localização e espaço em um certo ponto localizado em uma certa circunstância, podendo assim também vir até de aplicações pelo qual utiliza GPS (Global Positioning System). Porque e quando devemos utilizar os Dados Espaciais? Certa vez ao possuirmos aplicações pelo qual disponibiliza produtos mundialmente um dos grandes aspectos que pode influenciar ao utilizar os dados espaciais são: 01) Aonde o produto será entregue? 02) Aonde o produto se encontra neste momento? 03) Por quais cidades já tem passado? Quando precisamos trabalhar com os dados espaciais temos que ter em mente alguns requisitos, por exemplo: 01) Os tipos de dados de espaciais podem ser usados para além de coordenadas, consistindo assim em mistura de pontos, linhas, um único-segmento ou multi-segmento. 02) Habilidade de executar grandes massa de operações de dados geoespacial, por exemplo: aplicações que necessitam calcular a área de um ponto complexo á outro. 03) Armazenar coordenadas espaciais diretamente dentro do banco de dados, ou melhor armazenar informações de uma localização á outra. Relembro de que alguns dias atrás (ainda este ano) estive estudando geometria e o Plano Geométrico pode descrito por duas dimensões criadas no espaço, dimensões estas que podem ser descritas usando as posições em uma ordem de números indicando a posição de cada uma, ou melhor ‘o verdadeiro X e Y’. A figura acima representa um plano pelo qual possuí dois pontos identificando as coordenadas X (esquerdo e direito) e a coordenada Y (alto e baixo), neste caso com esses valores conforme mostra a imagem podemos identificar dois pontos no espaço dimensional. Qual diferença entre Geometry e Geopraphy ? Temos atualmente esses dois tipos de dados suportados no SQL Server 2008, porém eles possuem algumas diferenças entre si, vale lembrar que apesar de ambos fazerem parte de dados espaciais cada um tem por objetivo uma determinada forma. · Geometry: É um tipo de dados .NET common languague runtime (CLR), tem por objetivo de armazenar dados baseados em pontos nas dimensões(X,Y) e opcionalmente nas coordenadas (Z) em um único modelo traçado, essas dimensões podem ser conhecidas através do ‘plano geométrico’, representando assim os dados em um sistema de coordenadas Euclidean(flat), por mais informações á respeito desse tipo de dados, visite: geometry Data Type Method Reference.
· Geopraphy: Pode ser visto também como outro tipo de dados .NET common language runtime (CLR), os dados geográfico tem por objetivo armazenar linhas, pontos, círculos, polígonos e uma coleção de cada um desses, usando assim um modelo oposto ao ‘round earth’ para o ‘flat earth’ utilizando as coordenadas X e Y, o tipo de dados geometry utiliza as combinações de latitude/longitude (GPS) representando um único ponto, por mais informações á respeito desse tipo de dados, visite: geometry Data Type Method Reference.
OBS: Vale lembrar que os dois tipos de dados armazenam: linhas, pontos, polígonos, círculos. A diferença é que: o tipo de dados geometry utiliza o plano 2d e o tipo de dados geopraphy utiliza o plano 3d. Os dados geometry e geography são abstráidos por tipos específicos, basicamente eles possuem os mesmo modo, a diferença entre eles é apenas se a criação especificada é direcionada para um plano ou espaço. · Polygon · MultiPolygon · LineString · MultiLineString · Point · MultiPoint · GeometryCollection Cada tipo corresponde á uma coleção, podemos armazenar um único ponto utilizando Point, se por acaso for útil armazenar dois pontos podemos utilizar MultiPoint o qual nos provê uma coleção de agregação dos tipos específicos, o SQL Server possuí também uma hierarquia pelo qual pode ser visto pela imagem abaixo. Polygon: Pode ser descrito como um modelo fechado, por exemplo: bola. O Polygon pode consistir em uma bola onde pode conter zero ou mais lados. MultiPolygon: Esse tipo representa uma coleção de polígonos válidos, neste caso se um polígono pelo qual estiver dentro da coleção estiver inválido a coleção estará completamente inválida. LineString: LineString é um objeto de uma dimensão pelo qual consiste em dois ou mais pontos identificados que contêm segmentos em linhas. As linhas não possuem dimensões correta, no entanto pode ser simples, complexa e fechada. MultiLineString: Este tipo representa a coleção dos objetos LineString, similar ao objeto MultiPoint, no entanto pode-se também fornecer expressões WKT sendo identificado por todos LineStrings na coleção. MultiLineString podem ser simples, interseção ou fechado. Point: Representa uma única dimensão sendo referenciado e identificado pelo par. Pode-se utilizar o Point em uma posição para identificar uma localização na superfície. MultiPoint: Representa a coleção de zero ou mais pontos, geralmente é utilizado para identificar a localização na superfície. GeometryCollection: Os tipos conforme mostrados acima é especifico para cada um, o tipo GeometryCollection pode armazenar varios outros tipos de objeto em apenas um só, por exemplo: podemos armazenar tanto LineString como Point em um único GeometryCollection. Continuaremos... []´s Lucas Souza |
|
|