4

Я пытаюсь написать SQL-запрос, который определяет, является ли данная точка в многоугольнике. (Я использую SQL Server 2008 R2).Точка в алгоритме многоугольника для SQL Server

Я следовал this tutorial (просто скопируйте/вставьте его и измените имя какой-либо таблицы), и он работает приблизительно, но он не является точным. Например, давайте рассмотрим заданную точку, координаты которой:
P = 45.7664, 4.87383.

Если нарисовать маленький полигон (приблизительная площадь) вокруг этой точки с 4 вершинами координаты:
S = 45.97215 4.693909, 45.687 4.674683, 45.73302 5.460205, 46.05227 5.366821, 45.97215 4.693909

методике, приведенной в ссылке ниже отвечает точка НЕ ​​в многоугольник, в то время как это .. . Это выход (с моим собственным форматирования текста):
false output
(Polygon 20 является выше многоугольник)

Но если увеличенные площади (в 10 раз больше в моем тесте), рг Ответ на мою точку зрения лежит на площади.

Итак, я ищу еще один алгоритм, более точный.
Вот моя Vertice таблица, содержащий все вершины координаты каждого полигона моей БД Vertice table

мне нужно проверить, для всех многоугольников (есть несколько тысяч), если заданная точка передается в параметре в виде многоугольника (и если да, то какой (ы)). Я могу сделать цикл один, но я пропускаю правильный Точка в полигоне алгоритм.

Не мог бы кто-нибудь мне помочь? спасибо.

РЕЗЮМЕ

Соответствующий SQL скрипку: http://sqlfiddle.com/#!3/0caa4/1

+0

Плохое исполнение, если у вас огромные записи в базе данных, я пробовал этот запрос по 1600000 записей, и потребовалось 2 минуты для завершения. –

+0

Hi Jitendra, это старый вопрос, но проект все еще находится в разработке (это персональный проект).Я реализовал алгоритм, указанный в моей ссылке, с объяснениями @Ben Thul, и он отлично работает, но я никогда не пробовал столько записей. Вы могли бы предложить лучший алгоритм в качестве ответа, это будет приветствоваться! – AlexB

ответ

7

Ваша проблема в том, что вы определили полигон в обратном направлении. Давайте рассмотрим это с типами географии родной SQL

declare @s geography, @t geography, @p geography; 
select @s = geography::STPolyFromText('POLYGON((45.97215 4.693909, 45.687 4.674683, 45.73302 5.460205, 46.05227 5.366821, 45.97215 4.693909))', 4326); 
select @t = geography::STPolyFromText('POLYGON((46.05227 5.366821, 45.73302 5.460205, 45.687 4.674683, 45.97215 4.693909, 46.05227 5.366821))', 4326); 
select @p = geography::STPointFromText('POINT(45.7664 4.87383)', 4326); 

select @p.STIntersects(@s), @p.STIntersects(@t); 
select @p.STBuffer(10), @s, @t; 

Как вы можете видеть, @s держит в значительной степени весь мир. В средстве просмотра результирующего набора, если вы приближаетесь к тому, где находится ваш «квадрат», вы найдете отверстие. Сравните это с @t, который является той областью, которую вы ожидаете. Также обратите внимание, что я запустил это в SQL 2012, который улучшился по ограничению, существовавшему до 2012 года, в котором говорится, что геопространственный экземпляр не может пересекать границу полушария. Если вы запустили вышеприведенный экземпляр 2008 года, вы, скорее всего, получите ошибку на этот счет для @s. Прокомментируйте строку, определяющую @s, и она запустится.

При определении геого (графических/метрических) полигонов существует правило «правой руки». Представьте, что вы были в машине, посетив пункты в указанном вами порядке. Область, которую вы определяете, - это то, что вы увидите, если бы вы смотрели в правую сторону автомобиля.

+0

Спасибо за ваш ответ. Но я не понимаю, почему в '@ s', как вы его определили, вы пересекаете границу полушария ... Это просто многоугольник в северном полушарии!?!? Else, 'STIntersects' кажется лучше, чем алгоритм, который у меня был, я полагаю, что функция была протестирована и проверена ... – AlexB

+0

Потому что, поскольку вы определили многоугольник,' @ s' - это весь мир минус квадрат, который вы предназначена. –

+0

Вы подумаете, что я идиот, но я до сих пор не понимаю ничего: вы говорите мне, что «@ s» - это весь мир минус квадрат, который я хотел. Но '@ s' - многоугольник, расположенный во Франции, который является страной 100% в Северном полушарии, так почему я пересекаю границу полушария? Тогда, если я понимаю вас, когда я рисую многоугольник внутри другого полигона, самый большой многоугольник сам по себе минус маленький? Если да, то как я могу наложить два полигона? – AlexB

Смежные вопросы