Я пытаюсь получить все точки внутри полигона и после нескольких тестов я наконец поймал.SQL Server 2012 география STIntersects понимание
STIntersects
всегда возвращает 1 для всех моих сущностей даже в случаях, когда точка «визуально» не находится в полигоне.
Я нашел сообщения о направлении создания полигона и попробовать его, но didnt't помочь мне :)
Так что я решил создать простой случай:
- полигон с 4 Вершины где-то в Россия (углы: 55 37, 56 38)
- одна точка внутри этого многоугольника
- и еще один снаружи
здесь 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)
Спасибо Джон, я только что проверил MSDN о географии :: Point, он говорит, что входные параметры Point (Lat, Long, SRID).Но я получаю правильное поведение на моем примере только в полигоне по часовой стрелке и другом порядке параметров точки - Point (Long, Lat, SRID). Теперь я проверяю это на своих реальных данных и даю вам ответ позже. Спасибо – taburetkin
ok. , наконец. для ms sql 2012 правильный ответ - направление по часовой стрелке для создания многоугольника (квадрат многоугольника, вычисленный по правилу правой руки). и для географии :: Точка - долгота - это первый параметр, а широта - вторая в географии :: STPointFromText используется WKT, в котором Локатор первый, а долгота - вторая. – taburetkin
Добро пожаловать @taburetkin рад, что это помогло. –