2017-01-10 2 views
0

Я пытаюсь определить, находится ли точка внутри многоугольника. Результаты, о которых я возвращаюсь, всегда возвращаются 1 независимо от того, находится ли точка в пределах границы или нет.SQL Geography Intersect всегда возвращает 1

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(54.2225,-4.5366, 4326) 
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326) 

SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon) 

Я использую SQL Express 2014 работает локально

ответ

4

У вас есть классическая проблема. Порядок, в котором вы указываете точки в геометрическом многоугольнике, имеет смысл. Как вы это определили, вы создали многоугольник, который является целым глобусом минус маленькое отверстие. К счастью, оба теста для этой проблемы и исправления довольно просты.

DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326) 
set @polygon = @polygon.ReorientObject(); 
select @polygon.EnvelopeAngle() 

Если закомментировать вызов ReorientObject(), вы увидите, что угол конверта составляет 180 градусов. Это эвристика, которую я использую лично, чтобы увидеть, есть ли проблема с кольцевой ориентацией. Вы также можете проверить площадь с помощью STArea(). В любом случае, переориентированный объект - это то, что вы, вероятно, ожидаете, и должно дать вам лучшие результаты при выполнении тестов пересечения!

+0

Спасибо за ответ - это имеет большой смысл. Я использую следующий код, но все равно получаю возвращаемое значение '0' 'DECLARE @point GEOGRAPHY = GEOGRAPHY :: Point (54.1826, -4.5420, 4326) --INSIDE --DECLARE @point GEOGRAPHY = ГЕОГРАФИЯ :: Точка (57.1826, -3.5420, 4326) --OUTSIDE DECLARE @polygon ГЕОГРАФИЯ = ГЕОГРАФИЯ :: STGeomFromText ('POLYGON ((54,2826 -4,4420, 54,2904 -4,6564, 54,0467 -4,7031, 54,2826 -4,4420)), 4326) если @ polygon.EnvelopeAngle() = 180 \t комплект @polygon = @ polygon.ReorientObject(); SELECT @ polygon.STContains (@point) ' – Braydie

+2

Вам понравится: метод' POINT() 'принимает аргументы в противоположном порядке WKT, которые вы предоставляете для многоугольника! То есть, как вы это определили, вы переключили широту и долготу. Проверьте 'SELECT @ polygon.STPointN (1). [Lat], @point. [Lat]' –

+0

Ах, вау, я бы никогда этого не нашел! Еще раз спасибо! Я изменил порядок моих коордов в cторе Точки, но, похоже, все равно получаю нуль ... Мой мозг сейчас немного озадачен, но я не думаю, что это правильно ..? – Braydie

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