С помощью пространственных функций SQL2008, как я могу создать полигон, содержащий результаты агрегации

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

Вопрос

У меня есть таблица точек, каждая с именем, широтой, долготой и кодом города. То, что я хотел бы сделать, это выполнить агрегацию (то есть выражение «сгруппировать по») и вернуть многоугольник, содержащий все точки для определенного кода области.

Я немного пытаюсь найти хотя бы какие-нибудь встроенные агрегаты для типов данных географии, не говоря уже о том, чтобы дать мне ограничивающий многоугольник

Ради аргумента предположим, что у меня есть таблица, которая выглядит примерно так:

+---------+------+---------+---------+
| 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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top