2014-04-09 3 views
0

Ошибка, сгенерированная SQL Server, говорит о том, что метод MakeValid может привести к незначительному сдвигу точек. Я искал, что именно, «Немного» означает здесь, но ничего не нашел.SQL Server Geo MakeValid

Может кто-то прояснить, что именно этот метод считает «незначительным?».

ответ

1

Функция .MakeValid() просто пытается сдвинуть координаты геометрии на минимальную степень, необходимую для обеспечения правильности геометрии, как это определено стандартами OGC.

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

Я стараюсь везде, где это возможно, гарантировать, что геометрия действительна, а функция не требуется, поскольку при использовании присущая природа точности с плавающей запятой означает, что каждое значение X и Y заканчивается тем, что оно содержит 13 знаков после запятой, что добавляет много " вес "к геометрии с точки зрения хранения и пропускной способности. Однако есть много источников, которые требуют, чтобы их использование соответствовало.

Это не окончательный ответ, но я не уверен, что он доступен и не нужен.

+0

Спасибо. Я буду использовать функцию для довольно простых полигонов, в основном квадратов или, по крайней мере, четырехглавых. В основном он будет использоваться для определения точек в пределах определенного многоугольника. Таким образом, пользователь даст 4 балла, и система найдет известные точки, уже сохраненные в виде точек географии, пересекаемых полигоном. В основном я использую MakeValid, если пользователь передает точки по часовой стрелке. Я не ожидаю, что пользователь будет передавать десятичные значения с более чем пяти десятичными знаками. По вашему мнению, действительно ли сдвиг будет иметь большое влияние здесь? – user1873604

+0

Я бы не стал беспокоиться об этом. На экваторе (так на самом большом) пятое десятичное место составляет 11 метров на широте, поэтому сверх минимального изменения. Могу ли я предположить, что вы используете SqlGeometry, если вы используете 'MakeValid()' на SQL 2008? Вы могли бы просто передать четыре координаты обратно на сервер, используя 'STUnion()', чтобы склеивать их вместе ('var geom = p1.STUnion (p2) .STUnion (p3) .STUnion (p4);', а затем используя ' var box = geom.STConvexHull() ', чтобы создать поле, которое« присоединяет »их к разрешенному простейшему полигону. Таким образом, вам не нужно беспокоиться о влиянии' MakeValid() '. –