2014-08-28 4 views
1

Я пытаюсь получить все точки внутри полигона и после нескольких тестов я наконец поймал.SQL Server 2012 география STIntersects понимание

STIntersects всегда возвращает 1 для всех моих сущностей даже в случаях, когда точка «визуально» не находится в полигоне.

Я нашел сообщения о направлении создания полигона и попробовать его, но didnt't помочь мне :)

Так что я решил создать простой случай:

  1. полигон с 4 Вершины где-то в Россия (углы: 55 37, 56 38)
  2. одна точка внутри этого многоугольника
  3. и еще один снаружи

здесь a link на Google карту с точками

и результатами этого теста сбил меня из колеи

declare @cw geography, @ccw geography, @pointIn geography, @pointOut geography 

-- counterclockwise direction from bottom left corner 
set @ccw = geography::STPolyFromText (
'POLYGON((
55.0 37.0 
,55.0 38.0 
,56.0 38.0 
,56.0 37.0 
,55.0 37.0 
))', 4326 
) 

-- clockwise direction from bottom left corner 
set @cw = geography::STPolyFromText (
'POLYGON((
55.0 37.0 
,56.0 37.0 
,56.0 38.0 
,55.0 38.0 
,55.0 37.0 
))', 4326 
) 

set @pointIn = geography::Point(55.5, 37.5, 4326) 
set @pointOut = geography::Point(54, 36, 4326) 


select @pointIn.STIntersects(@ccw) ccw, @pointIn.STIntersects(@cw) cw 
-- result: 1 0 

--here i should get inversed values, but it didnt happens 
select @pointOut.STIntersects(@ccw) ccw, @pointOut.STIntersects(@cw) cw 
-- result: 1 0 

Почему это происходит? Я просто не могу понять, что мне не хватает

Я ожидаю, что pointIn должен возвращать 1, когда мой многоугольник мал и возвращает 0, когда мой многоугольник весь мир минус выбранная область, и pointOut должна возвращать 0 в первом случае и возврат 1 во втором

Но обе точки возвращают 1 в полигоне против часовой стрелки.

ОБНОВЛЕНИЕ

Моя, наконец ошибка была в порядке входных параметров geography::STPolyFromText первый должен быть LNG и второй лат. и в расширении заказ Diferent msdn says: Point (Lat, Long, SRID)

ответ

1

В случаях SqlGeography, @ccw определяет отверстие (из-за его против часовой стрелки, порядок). Поскольку это отверстие не находится внутри полигона, оно становится дырой в глобусе. Иными словами, вы получаете Polygon, покрывающий весь земной шар, минус ваш полигон @cw.

Geography::Point также использует обратные координаты для WKT, и поэтому я считаю, что ваши координаты по широте и долготе неправильны (невозможно быть абсолютно уверенным), поскольку только вы знаете свои данные. Несмотря на это, прилагаемого изображения должно быть достаточно, чтобы это объяснить. «Оранжевый» цвет - @ccw, синий - @cw, остальное обозначено.

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

select 
'Clockwise' AS Label, 
@cw AS Item 

union all 

select 
'Counter-Clockwise' AS Label, 
@ccw AS Item 

union all 

select 
'Point In' AS Label, 
@pointIn.STBuffer(100000) AS Item 

union all 

select 
'Point Out' AS Label, 
@pointOut.STBuffer(100000) AS Item 

Надеюсь, это поможет.

enter image description here

+0

Спасибо Джон, я только что проверил MSDN о географии :: Point, он говорит, что входные параметры Point (Lat, Long, SRID).Но я получаю правильное поведение на моем примере только в полигоне по часовой стрелке и другом порядке параметров точки - Point (Long, Lat, SRID). Теперь я проверяю это на своих реальных данных и даю вам ответ позже. Спасибо – taburetkin

+0

ok. , наконец. для ms sql 2012 правильный ответ - направление по часовой стрелке для создания многоугольника (квадрат многоугольника, вычисленный по правилу правой руки). и для географии :: Точка - долгота - это первый параметр, а широта - вторая в географии :: STPointFromText используется WKT, в котором Локатор первый, а долгота - вторая. – taburetkin

+0

Добро пожаловать @taburetkin рад, что это помогло. –

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

  • Нет связанных вопросов^_^