С помощью пространственных функций SQL2008, как я могу создать полигон, содержащий результаты агрегации
-
06-07-2019 - |
Вопрос
У меня есть таблица точек, каждая с именем, широтой, долготой и кодом города. То, что я хотел бы сделать, это выполнить агрегацию (то есть выражение «сгруппировать по») и вернуть многоугольник, содержащий все точки для определенного кода области. Р>
Я немного пытаюсь найти хотя бы какие-нибудь встроенные агрегаты для типов данных географии, не говоря уже о том, чтобы дать мне ограничивающий многоугольник
Ради аргумента предположим, что у меня есть таблица, которая выглядит примерно так:
+---------+------+---------+---------+ | 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 | +---------+------+---------+---------+
(На самом деле самая маленькая область имеет 57 баллов, а самая большая 626)
Решение
Хотя встроенного способа сделать это нет, агрегаты доступны как часть Sql Spatial Tools. Пакет CodePlex. В зависимости от того, что именно вы хотите, вас может заинтересовать использование агрегата ограничивающего прямоугольника или агрегата объединения с последующим вызовом ConvexHull для получения минимального многоугольника вместо прямоугольника. Р>
Другие советы
Для тех, кто приехал сюда и хочет увидеть код, который вы получаете (удивительный) Sql Пространственные инструменты :
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
Вы можете просмотреть результат в GeoQuery2008 .