SQL Пространственный многоугольник наизнанку - PullRequest
11 голосов
/ 10 декабря 2010

Я разрешаю пользователям рисовать многоугольник в Silverlight, нажимая кнопку рисовать.Затем я перебираю точки, преобразую их в долготу и широту, а затем сохраняю в SQL (в столбце geography).

Проблема в том, что из-за того, что мир круглый и все такое, он работает толькоесли пользователь рисует по часовой стрелке.В противном случае он пытается сделать многоугольник правильным вокруг мира и терпит неудачу.

Так, как мне сделать это правильно?Нужно ли мне решать, каким образом они рисуют, и если да, то как?

Ответы [ 5 ]

7 голосов
/ 22 мая 2015

Можно проверить, был ли результат метода EnvelopeAngle() для географии 180, а затем использовать функцию ReorientObject() для его исправления.

Вот образец:

--A CW polygon
DECLARE @G3 GEOGRAPHY = 'POLYGON ((45 45, 44 45, 44 46, 45 46, 45 45))';    
SELECT @G3.EnvelopeAngle();                --180
SELECT @G3.ReorientObject().STAsText();    --POLYGON ((44 46, 44 45, 45 45, 45 46, 44 46))

РЕДАКТИРОВАТЬ , как указано в комментариях, вы можете исправить текущую геометрию, используя простую команду обновления (если вы уверены, что они не верны):

UPDATE foo_table SET bar_column = bar_column.ReorientObject() 
    WHERE bar_column.EnvelopeAngle() > 90
2 голосов
/ 22 июля 2013

Я недавно задал аналогичный вопрос на ГИС StackExchange. Я считаю, что нашел решение только для SQL, которое воспроизводится ниже:

В конце концов нашел ответ на Блог Пространственного Эда .

SQL, демонстрирующий преобразование:

DECLARE @geom GEOMETRY = 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))';
DECLARE @geog GEOGRAPHY = @geom.MakeValid().STUnion(@geom.STStartPoint()).STAsText()

И выдержка из поста Эда:

Ключом к этому поведению является метод STUnion(). Поскольку это метод на основе OGC, работающий со всей геометрией для данного объекта, он приводит полигоны в нужную ориентацию для метода, который, как правило, используется для Geography type [...]. Этот метод иллюстрируется довольно эффективно, сохраняя небольшие накладные расходы [...].

1 голос
/ 11 января 2011

Если вы привязаны к RTM-версии SqlServer 2008, вы всегда можете использовать sqlspatial tools из codeplex , который можно свободно распространять, и из этой библиотеки просто используйте метод makevalid.

Если у вас есть время поиграть с CTP1 SqlServer Denali, вы можете просто выбрать новые пространственные типы, которые могут принимать объекты размером больше полусферы и которые имеют метод ReorientObject для - Reorient Object, если необходимо:)

0 голосов
/ 22 апреля 2017

Правило левой руки управляет этим ... когда вы 'идете' по периметру вашего многоугольника, ваша левая рука всегда должна быть внутри ... так что вещи должны «казаться» оцифрованными против часовой стрелки.это относится и к пончикам и поликам с отверстиями.

Если вы оставите левую руку «внутри» интересующей вас области многоугольника, они будут оцифрованы по часовой стрелке.

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

Рабочий процесс будет выглядеть следующим образом: пользователи будут создавать свои полигоны, создавать другой полигон с противоположной ориентацией (ReorientObject () в SQL Server), а затем сравнивать их области ... Логически, наименьшее правильное.

Просто еще один способ решить эту проблему.

0 голосов
/ 10 декабря 2010

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

В одном направлении вы нарисовали маленький круг, в другом направлении вы нарисовали сферу, охватывающую весь мир, за исключением небольшого круга. Последний, как правило, нарушает географические границы и создает исключение.

Если вы подумаете о том, чтобы нарисовать пончик, у вас есть 2 многоугольника, и вам нужно иметь точки по часовой стрелке / против часовой стрелки, чтобы определить «дыру» в центре.

...