Com funções SQL2008 espaciais, Como posso gerar um polígono que contém os resultados de uma aggreation

StackOverflow https://stackoverflow.com/questions/1212297

Pergunta

Eu tenho uma tabela de pontos, cada um com um nome, latitude, longitude, e um código de área. O que eu gostaria de fazer é executar uma agregação (ou seja, um "grupo por" cláusula) e retornar um polígono que contém todos os pontos de um código de área particular.

Eu estou lutando um pouco até mesmo para descobrir se há qualquer construído em agregações para os tipos de geografia de dados, porém, muito menos para me dar delimitadora polígono

Por uma questão de argumento, supor que eu tenho uma tabela que parece um pouco como:

+---------+------+---------+---------+
| Name    | Area | Lat     | Long    |
+---------+------+---------+---------+
| Ipswich | A    | 52.053  |  1.156  |
| Luton   | A    | 51.8717 | -0.4246 |
| Melton  | A    | 52.1064 |  1.3322 |
| Didcot  | B    | 51.6024 | -1.2321 |
| Oxford  | B    | 51.7486 | -1.265  |
+---------+------+---------+---------+

(Na realidade, a menor área tem 57 pontos, eo maior 626)

Foi útil?

Solução

Enquanto não há como built-in maneira de fazer isso, existem Agregados disponível como parte dos Sql Espaciais Tools pacote CodePlex. Dependendo exatamente o que você quer, você pode estar interessado em utilizando a caixa delimitadora global ou a União Aggregate seguido de uma chamada para envoltória convexa para obter o polígono mínimo em vez de uma caixa.

Outras dicas

Para os benefícios de quem chegou aqui e quer ver o código que você começa com (o incrível) Sql Ferramentas espaciais :

DECLARE @points TABLE
(
 Name VARCHAR(50),
 Area CHAR(1),
 Point GEOGRAPHY
)

INSERT INTO @points VALUES ('Ipswich', 'A', geography::STGeomFromText('POINT( 1.156  52.053  )', 4326))
INSERT INTO @points VALUES ('Luton', 'A', geography::STGeomFromText('POINT(  -0.4246 51.8717 )', 4326))
INSERT INTO @points VALUES ('Melton', 'A', geography::STGeomFromText('POINT( 1.3322  52.1064 )', 4326))

INSERT INTO @points VALUES ('Didcot', 'B', geography::STGeomFromText('POINT( -1.2321 51.6024 )', 4326))
INSERT INTO @points VALUES ('Oxford', 'B', geography::STGeomFromText('POINT( -1.265  51.7486 )', 4326))

SELECT  dbo.ConvexHullGeography(dbo.GeographyUnionAggregate(point)), 'red' as color, 1 as thickness
FROM @points
GROUP BY Area

Você pode ver o resultado na GeoQuery2008 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top