SQLGeography in SQL Server

196
21 февраля 2018, 07:45

Строю полигоны в c# и заполняю ими соответствующую табличку в sqlserver(где уже есть информация и айдишники полигонов), примерно вот так:

updateCommandRelations.CommandText = "UPDATE [Polygons] SET [Polygon] = geography::STGeomFromText('" + polygonString + "', 4326) WHERE IdPolygons = " + idPolygons; 
updateCommandRelations.ExecuteNonQuery();

Всё вроде без ошибок проходит, но тут я решил проверить, как же они строятся, используя возможности SSMS, и вижу это: Почему же полигон охватывает весь земной шар? Такс, давайте разбираться, приближаем:

То есть, почти то, что я и хотел, только наоборот, выделенная область должна быть внутри, а не снаружи) Пришлось перерыть интернет, и оказалось, что действительно, есть разница как выстраивать точки в полигоне: по часовой стрелке(полигон - область вне): или против часовой(полигон - область внутри):

Но заметил это, когда отстроил около 500 тысяч полигонов(прошу заметить примерно 48 часов работы приложения), когда встал вопрос: "входит ли точка в полигон?" (проверял только в самом программе замкнутость полигонов и порядок выстраивания точек, но не мог и догадываться, что направление имеет значение).

Использовал функцию STContains и ,естественно, полигонов в ответе было больше, чем мне нужно.

selectCommand.CommandText = "DECLARE @g geography; 
SET @g=geography::STGeomFromText('POINT(" + lng.Replace(",", ".") + " " + lat.Replace(",", ".") + ")', 4326); 
SELECT Info FROM [Polygons] WHERE ([Polygon].MakeValid()).STContains(@g) = 1;";

Так подошли к сути вопроса, как с этим бороться, не перестраивая полигоны(использовать отрицание нельзя, так как половина полигонов построилось по часовой стрелке, половина против)?(есть идея костыля типа проверки какой-нибудь крайней точки, и если входит, то инверсия ответа)

А если это, увы, невозможно после построения, то как же отследить при построении, что полигон строится именно против часовой стрелки?

READ ALSO
Проблема с делегатами и событиями в Unity

Проблема с делегатами и событиями в Unity

Не могу разобраться как использовать делегаты и события в проекте UnityУ меня есть класс Observer

146
Как создать измененный exe c# [требует правки]

Как создать измененный exe c# [требует правки]

Есть форма туда вводишь данные и должен создаваться билд программы с измененными данными

183
C# Как ускорить поиск?

C# Как ускорить поиск?

У меня есть клас в котором есть List обьектов другого класа в котором есть еще один List обьектов другого класаМне нужно сравнить найти обьект...

187