Как я могу сгруппировать данные геометрии SQL Server по STWithin? - PullRequest
2 голосов
/ 12 декабря 2011

У меня есть две таблицы, в которых я храню геометрию.

CREATE TABLE config.region
(
    id int identity(1,1) PRIMARY KEY,
    polygon GEOMETRY NOT NULL
)

CREATE TABLE config.location
(
    id int identity(1,1) PRIMARY KEY,
    position GEOMETRY
)

Таблица регионов будет содержать прямоугольные многоугольники. Таблица местоположений будет содержать только точки.

Что я хочу сделать, это выбрать все регионы и СЧЕТ того, сколько точек на самом деле находится в каждом многоугольнике.

Я пришел с этим запросом, который показывает идентификатор многоугольника, идентификатор местоположения и ли местоположение находится в многоугольнике.

SELECT 
    polygon.id as pid, 
    config.location.id as lid, 
    polygon,
    polygon.STContains(config.location.position) as within 
FROM 
    config.polygon, config.location

Как я могу изменить это, чтобы дать счетчики вместо просто списка того, находятся ли они друг в друге?

1 Ответ

3 голосов
/ 12 декабря 2011

У меня нет SQL Server 2008, поэтому я не могу проверить его сейчас.Вы можете попробовать это:

select r.id, count(*) as qty
from config.region r
join config.location l on r.polygon.STContains(l.position) = 1
group by r.id

Все полигоны:

select p.*, isnull(t.qty, 0) as points_within_polygon
from config.region p
left join (
    select r.id, count(*) as qty
    from config.region r
    join config.location l on r.polygon.STContains(l.position) = 1
    group by r.id
) t on t.id = p.id

Добавлено : следующий код в качестве подзапроса также должен работать нормально.Вы можете попробовать, что для вас быстрее.

select r.id, sum(cast(r.polygon.STContains(l.position) as int)) as qty
from config.region r
cross join config.location l
group by r.id

Обновление : добавлено приведение bit к int.

...