2010-12-10 3 views
9

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

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

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

ответ

0

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

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

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

+0

Да, я это понимаю. Но что мне с этим делать? – Matt 2010-12-10 20:45:53

+0

вы должны игнорировать порядок, на который нарисованы очки, но прочитайте их в соответствующем порядке. – Andrew 2010-12-11 11:02:25

+0

И как мне определить, в каком порядке я должен их читать? – Matt 2010-12-13 08:01:36

1

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

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

1

Я спросил a similar question недавно в GIS StackExchange. Я считаю, что нашел решение SQL-only, которое воспроизводится ниже:

В конце концов нашлось ответ на Spatial Ed's Blog.

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 [...]. Этот метод, показанный на рисунке, достаточно эффективен, сохраняя небольшую рабочую нагрузку [...].

3

Вы можете проверить, если результат метода 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)) 
0

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

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

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

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

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

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