Lucas's profileLucas Souza [MCP | MCTS ...PhotosBlogListsMore Tools Help

Blog


    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
    Retorna uma nova instância consistindo em pontos da instância base em que não contém pontos da instância parâmetro

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


    Figura 1.0 (Function - STDifference)

    STIntersects
    Retorna verdadeiro se todos os valores geometric possuír mais de uma interseção, por outro lado 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 ou melhor, este método tem por objetivo conter apenas os pontos comum entre a instância base a instância parâmetro;

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


    Figura 1.1 (Function - STIntersects)

    STSymDifference
    Retorna uma nova instância contendo apenas os pontos únicos da instância base e parâmetro  (i.e., excluindo os pontos que retornam STIntersection() )

    -- Results: MULTIPOLYGON (((50 30, 50 50, 30 50, 40 40, 50 30)),

                             ((10 10, 40 10, 40 40, 10 40, 10 10)))
    DECLARE @g geometry
            = 'POLYGON((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();


    Figura 1.2 (Function - STSysmDifference)

    STUnion
    Retorna uma nova instância contendo todo os pontos aninhados da instância base e parâmetro.

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

     
    Figura 1.3 (Function - STUnion)

    Blended Types
    Este método descreve não justamente os polígonos, no entanto é possível usar diferentes tipos específicos em cada coleção ou em cada tipo de definido.

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


    STArea, STLength
    Retorna a soma de todas as áreas calculadas na superfície definida pelo usuário do tipo geometric
    STArea() retorna o tipo float indicando a área quadrangular da instância
    STLength() retorna o tipo float indicando o tamanho de unidade da instância (0 ou se a instância é um ponto ou se não possui tamanho)

    -- Results: 400           |         121.28990204492
    DECLARE
    @g GEOMETRY = 'POLYGON((10 10, 30 50, 50 50, 10 10))'

    SELECT  @g.STArea(), @g.STLength()


    Figura 1.5 (Function – STArea, STLength)

    STCentroid
    Este é um dos métodos padrões OGC que retorna ‘Point’ indicando o centro da forma quandrangular, se a instância adotada não for Polygon ou MultiPolygon o valor NULL será retornado.

    -- Results: POINT (20 30)

    DECLARE @g GEOMETRY = 'POLYGON((10 10, 10 40, 40 40, 10 10))'

    SELECT  @g.STCentroid().ToString()


    Figura 1.6 (Function - STCentroid)

    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)

     


    Figura 1.7 (Function - STContains)

     

    STPointOnSurface
    Este método irá retornar de certa forma um ponto aleatório o qual nos garante a localização dentro da instância base.

    -- Results: POINT (23 25)
    DECLARE @g geometry = 'POLYGON((10 10, 14 15, 50 12, 45 30,10 30, 10 10))'

    SELECT @g.STPointOnSurface().ToString()


    Figura 1.8 (Function - STPointOnSurface)

    STGeometryType
    Retorna o tipo Open Geospatial Consortium (OGC) o qual representa a instância geometry

    -- 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
    Retorna uma instância geometry da representação Open Geospatial Consortium (OGC) Well-Known Text(WKT) representando assim o argumento de elevações (Z) e medidas (M).

    -- 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
    Retorna verdadeiro se dado o valor geometric faz parte de outro, de outra forma, retorna falso. Este método retorna null se todos SRID (Spatial Reference Identifier) da instância não possuír o valor adequado SRID da outra instância;

    STDistance
    Retorna a distância entre os valores do tipo específico Point geometric. Este método irá retorna null se SRID(Spatial Reference Identifier) da instância não possuír o valor adequado ao SRID da outra instância;


    Figura 1.9 (Geography Methods)

    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

     


    Figura 2.1 (Spatial Results - Map)

     

    OBS: Se por acaso quisermos obter a lista de todos SRIDs suportados pelo SQL Server, podemos executar a instrução:
     SELECT * FROM sys.spatial_reference_systems
    , para mais informações relacionado aos SRIDs,
    visite:
    http://msdn.microsoft.com/en-us/library/bb964707.aspx


    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.
    Geometry: Relaciona-se á um tipo de dados com mapeamento em um plano com duas dimensões (sistema de coordenadas x e y)

     

    ·         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.
    Geography: Relaciona-se á um tipo de dados que armazena informações em relação á superficie terrestre.

     

    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.
    OBS: Polygon pelo qual foi construído nunca terá interseção.

     

    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.
    OBS: MultiPolygon pelo qual foi construído nunca terá interseção.

    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