Com funções SQL2008 espaciais, Como posso gerar um polígono que contém os resultados de uma aggreation
-
06-07-2019 - |
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)
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 .