trabalhando com dados espaciais no sql server 2008

18
SQL Server 2008 oferece vários aprimoramentos, incluindo novos ti instruções T-SQL e alterações incrementais em suporte Microsoft .NET Fram a XML e o recurso de agente de serviços. De longe, a alteração de maior e para desenvolvedores é o suporte do SQL Server 2008 para dados uma poderosa adição à caixa de ferramentas do programador do SQL Server. Nest apresente uma visão geral breve dos dadosespaciais e ilustrar algumas utilizações interessantes. Dados espaciais são definidos como dados que são representados por imagen SQL Server 2008 suporta imagens 2D e 3D pode ser adicionado em Dados espaciais podem ser subdivididos em dados geométricos (dado cálculos que envolvam geometria Euclidian) e dados geográficos (dados que geográficos e limites na Terra). Usando o tipo de dados Geografia Vamos começar com um aplicativo simples de dados espaciais, que processamento sistemas (OLTP) que envolvem clientes de mais tradi online. Dados espaciais é útil no caso porque cada cliente tem um endereço. Você geralmente pensar endereços como rua, cidade, estado, país e CEP, mas um ponto na Terra e também pode ser representado como um par de Tecnicamente, um endereço pode compõem uma parcela de Terra que pode ser representada como um polígono, mas vamos continuar em um único apenas para manter a simplicidade. Saber onde um cliente reside como lati permite que você responder perguntas como: Quais são as ramificações de bancário mais próximos três para um client Que vendedor fica mais próximo ao cliente? Como muitos clientes da sua empresa tem em um raio de 10 metros de, por Seattle, Washington? Como muitos clientes live mais de 2 quilômetros de seu local de filial

Upload: mpa1234567

Post on 22-Jul-2015

210 views

Category:

Documents


0 download

TRANSCRIPT

SQL Server 2008 oferece vrios aprimoramentos, incluindo novos tipos de dados, novas instrues T-SQL e alteraes incrementais em suporte Microsoft .NET Framework, suporte a XML e o recurso de agente de servios. De longe, a alterao de maior e mais interessante para desenvolvedores o suporte do SQL Server 2008 para dados espaciais uma poderosa adio caixa de ferramentas do programador do SQL Server. Nesta coluna, vou apresente uma viso geral breve dos dados espaciais e ilustrar algumas utilizaes interessantes. Dados espaciais so definidos como dados que so representados por imagens 2D ou 3D. SQL Server 2008 suporta imagens 2D e 3D pode ser adicionado em uma verso futura. Dados espaciais podem ser subdivididos em dados geomtricos (dados que podem usar clculos que envolvam geometria Euclidian) e dados geogrficos (dados que identifica locais geogrficos e limites na Terra).

Usando o tipo de dados GeografiaVamos comear com um aplicativo simples de dados espaciais, que pode ser til para processamento sistemas (OLTP) que envolvem clientes de mais tradicional transaes online. Dados espaciais til no caso porque cada cliente tem um endereo. Voc geralmente pensar endereos como rua, cidade, estado, pas e CEP, mas um endereo um ponto na Terra e tambm pode ser representado como um par de latitude/longitude. Tecnicamente, um endereo pode compem uma parcela de Terra que pode ser representada como um polgono, mas vamos continuar em um nico ponto nesse caso, apenas para manter a simplicidade. Saber onde um cliente reside como latitude/longitude permite que voc responder perguntas como:

Quais so as ramificaes de bancrio mais prximos trs para um cliente especfico? Que vendedor fica mais prximo ao cliente? Como muitos clientes da sua empresa tem em um raio de 10 metros de, por exemplo, Seattle, Washington?

Como muitos clientes live mais de 2 quilmetros de seu local de filial mais prximo?

O processo de converter um endereo em um par de latitude/longitude chamado endereo geocodificao. Inmeros servios on-line (incluindo MapPoint, Virtual Earth e Google Terra) fornecendo geocodificao como um servio. Para converter um endereo nos EUA para um ponto, voc pode encapsular uma chamada para a geocodificao MapPoint Web Services em uma funo do SQLCLR.

Isso mostrado no exemplo de cdigo . Mas onde voc deve armazenar a latitude/longitude dentro de seu banco de dados do SQL Server?

SQL Server 2008 vem com os dois tipos de dados necessrios para armazenar dados espaciais: geometria e Geografia. Os dois tipos de dados so implementados usando a arquitetura .NET para tipos definidos pelo usurio, que significa que eles podem ter propriedades e mtodos. Vamos continuar com o tipo de dados de Geografia agora porque isso mapeia mais de perto para o problema.

Voc pode definir uma instncia de um tipo de Geografia com uma simples SQL declarao de varivel (DECLARE @g Geografia) ou como uma coluna em uma tabela, e voc pode inicializar este tipo de dados em uma variedade de formas. Para um tipo de Geografia representando uma instncia de um ponto, a maneira mais simples usar o mtodo esttico STPointFromText do tipo Geografia. O mtodo STPointFromText requer no apenas uma representao textual de um ponto de formato de texto conhecidos do Consortium Geospatial abrir (WKT) ou seja, POINT(x,y) mas tambm um identificador de referncia espacial (SRID). O SRID identifica o sistema de referncia espacial usado para um mapeamento round-Terra ou Terra simples e, por enquanto, suficiente saber que o geocoder MapPoint Web service usa coordenadas GPS que correspondem s SRID 4326. Isso representa o 1984 de sistema Geodetic World (WGS 84). Para localizar todos os os SRIDs que oferea suporte ao SQL Server 2008, basta consultar o sys.spatial_reference_systems de tabela de metadados.

Portanto, seu cdigo para inicializar a Geografia do endereo poderia esta aparncia:

DECLARE @addr nvarchar(256) = 'Some sample address, City, State, Zip'; DECLARE @addr_as_xy nvarchar(30); DECLARE @g geography; SET @addr_as_xy = dbo.Geocoder(@addr); SET @g = geography::STPointFromText(@addr_as_xy, 4326);Observe que como geografia implementada como um tipo de dados baseados no .NET, h alguns pontos interessantes mencionar sobre o cdigo. Em primeiro lugar, STPointFromText um mtodo esttico, para que ela deve ser chamada com a sintaxe datatype::method. Alm disso, os nomes de mtodo de tipos de dados baseados no .NET so distino entre maisculas e minsculas assim, STPointFromText deve usar maisculas e minsculas exata.

H uma coisa mais importante a destacar: a funo geocoder deve ser codificada para retornar o local como "Grficos" em vez de latitude/longitude. Abrir Consortium Geospatial define seu WKB e binrio conhecido (WKB) formata como usar x, y pares de coordenadas. Portanto, o que est sendo no passado para STPointFromText Se deve ser usaria

POINT(Longitude/Latitude),

POINT(Latitude/Longitude).

voc

latitude/longitude em vez disso, SQL Server ser constri instncias de Geografia usando linguagem geogrfico de marcao (GML), um vocabulrio XML que usa latitude/longitude. Ou, se voc tiver um ponto, h um mtodo esttico especial no tipo de dados de geometria que usa trs parmetros: SRID, latitude e longitude.

Agora que voc tiver geocoded suas informaes de cliente, voc pode tambm ir em frente e geocode seu banco ramificar locais (ou outras informaes de escritrio filial, informaes de depsito ou nada relacionados ao local) e seus locais de vendedor, assim. Suponha que voc terminar com tabelas chamadas de cliente, vendedor e ramificao. Cada um deles deve ter uma coluna (vamos cham-lo geog para manter a simplicidade) de Geografia do tipo que indica o local.

Voc pode usar essas informaes para responder s perguntas mencionadas anteriormente. Para isso, voc precisar usar mtodos no tipo de dados Geografia. O mtodo para calcular a distncia entre dois objetos de geografia no surpreendentemente, , chamado STDistance. Os mtodos que pode ser usados para responder pergunta terceira (quantos clientes existem dentro de um raio de 10 metros de Seattle) seria STBuffer e STIntersects. SQL Server tambm tem um mtodo que usado para calcular um buffer mais aproximado chamado BufferWithTolerance (ele um pouco mais rpido do que calcular um buffer exato).

Para responder a primeira pergunta, voc usaria uma consulta semelhante a esta:

SELECT TOP(3) b.name, c.geog.STDistance(b.geog)/1000 [Distance in km] FROM customer c, branch b WHERE c.customerid = '12345' -- this query looks at customer 12345 ORDER BY c.geog.STDistance(b.geog)A consulta para calcular o vendedor mais prximo deve ser feita em aproximadamente da mesma maneira. Quanto as pessoas que moram dentro de um raio de 10 metros de Seattle? Para esta consulta, voc deve colocar um buffer ao redor dos limites de cidade de Seattle (representado por um polgono dos limites de cidade ou um ponto que voc designa como luzes da cidade de Seattle) e selecione todos os pontos (clientes) que fazem a interseo desse buffer. Representados no cdigo, isso :

-- or declare POINT for "downtown Seattle" -- 1609.344 meters per mile DECLARE @Seattle geography = 'POLYGON(....)'; SELECT c.customerid FROM

customer c WHERE c.geog.STIntersects(@Seattle.STBuffer(10 * 1609.344));Esses exemplos ilustram pontos mais interessantes sobre como voc interage com instncias do tipo Geografia. Quando voc usa STBuffer, por exemplo, que um mtodo de instncia no tipo de dados de Geografia, voc usar a sintaxe instance.method em vez da sintaxe de type::method que voc poderia usar para mtodos estticos como STPointFromText. Alm disso, observe que, quando voc estiver calculando a distncia entre dois localidades ou determinar se uma instncia de Geografia cruza outra, voc usar a sintaxe Instance1.method(Instance2).

Para responder a pergunta sobre o nmero de clientes que moram mais de dois quilmetros partir da ramificao banco mais prximo, voc deve poder agregar as localidades de todas as ramificaes de banco, com um buffer de dois quilmetros ao redor de cada uma delas e ento olhe para os clientes que no fazem a interseo com esse conjunto de localidades. O tipo de dados de geografia tem um mtodo chamado STUnion, mas ele especificado como um mtodo em uma instncia de Geografia que retorna a unio entre essa instncia e outra instncia.

Isso no a agregao de baseada em conjunto que tinha em mente. Felizmente, o SQL Server 2005 introduziu agregados definidos pelo usurio que podem ser gravados no cdigo do .NET, e voc pode usar um aqui para obter uma unio agregada de um conjunto de valores. Sem entrar muito em aspectos especficos da codificao agregados definidos pelo usurio, eles exigem quatro inicializaes de mtodo: inicializao (inicializao de resposta), encerrar (resposta retorno), Accumulate (chamado para cada linha) e direta (chamado ao mesclar o processamento de vrios threads).

Agregada, o mtodo Accumulate pode simplesmente unir a geografia de linha atual com a geografia resposta sempre que ele chamado. Na verdade, voc no precisa escrever esta agregao mesmo; ele faz parte do Projeto de ferramentas espacial do SQL Server no CodePlex . Este agregado ainda permitir que voc passar em um buffer para cada linha,

que resolve o problema de buffer de dois metros. A consulta, em seguida, pode ser escrita assim:

SELECT COUNT(*) FROM customer c WHERE c.geog.STIntersects( SELECT dbo.GeographyUnionAggregate(b.geog,2*1609.344) FROM branch b)=0Como voc pode ver, esses exemplos, endereos de geocodificao e armazen-las junto com de formulrio o escritrio de postagem do endereo podem trazer valor comercial para um aplicativo.

ndices espaciaisDepois que sua empresa recebe maior, calcular a distncia entre cada cliente e cada vendedor ou cada cliente e cada filial de banco pode se tornar muito lenta. Suporte a dados espacial do SQL Server 2008 inclui indexao espacial. Os ndices espaciais so ndices de Brvore comuns que devem fazer consultas espaciais executado mais rapidamente, assim como os ndices relacionais no SQL Server fazem consultas relacionais executado mais rapidamente. Mapear dados espaciais bidimensionais para uma rvore B unidimensional realizada por meio de tessellation; que , dividir a rea de backup em subreas pequenas e registrar as subreas que se cruzam cada instncia espacial. Para o tipo de dados a geografia, isso significa que dividir o mundo inteiro em hemispheres e Projetando cada hemisphere em um plano. Cada instncia de Geografia, em seguida, aborda uma ou mais subsees (lado a lado) desse plano; o ndice espacial deve conter uma linha para cada lado que abrange uma instncia. Para o tipo de clculo, porque voc est especificando seu prprio sistema de

coordenadas rectangular, voc pode especificar os limites (caixa delimitadora) que aborda o ndice espacial. H um nmero de regras que determinam como espaciais instncias que interceptam lado a lado mapeado para linhas em um ndice espacial, e voc pode definir bem como o sistema de grade sero ser para o ndice espacial em vrios nveis. Para obter mais informaes sobre as especificaes de ndices espaciais, Manuais online do SQL Server a melhor referncia. Para retornar para o sistema cliente, voc pode definir um ndice espacial na coluna geog na sua tabela de clientes com a seguinte linguagem de definio de dados (DDL):

Copiar Cdigo

CREATE SPATIAL INDEX cust_geog_idx ON dbo.customer(geog) GRIDS =(LEVEL1=HIGH,LEVEL2=HIGH,LEVEL3=HIGH,LEVEL4=HIGH));Definindo este ndice com uma grade granularidade alta seria melhor para seu ndice porque cada endereo de cliente um ponto, que s apareceria em um quadrado, ao contrrio de linhas ou polgonos, que podem se cruzam muitas peas. Voc deve observar que ndices espaciais so usados somente com certos mtodos espaciais. Atualmente, eles so usados com os seguinte predicados Geografia:

Copiar Cdigo

instance1.STIntersects(instance2) = 1 instance1.STEquals(instance2) = 1 instance1.STDistance(instance2) < number instance1.STDistance(instance2)