Вычитание объединения DbGeography вместо объединения

#c# #union #dbgeography

#c# #объединение #dbgeography

Вопрос:

Я пытаюсь объединить тысячи прямоугольников в один многоугольник, используя DbGeography. Для тестирования я начинаю всего с двух прямоугольников (потому что тысячи завершились ошибкой с результатом fullglobe). Когда я использую метод объединения DbGeography, он возвращает многоугольник с одним прямоугольником, вычитаемым из другого, вместо их объединения. Я попробовал тот же процесс с SqlGeography и получил тот же результат. Кто-нибудь может увидеть, что я делаю неправильно? Или, может быть, я неправильно понимаю метод объединения?

Два отдельных прямоугольника, показывающие перекрытие:

введите описание изображения здесь

Результирующий полигон после объединения:

введите описание изображения здесь

Код (geog1 — верхний левый прямоугольник, geog2 — нижний правый):

 DbGeography geogUnion = geog1;     
geogUnion = geogUnion.Union(geog2);
  

И вот значения для полигонов, которые я объединяю, и результирующий полигон:

 geog1: POLYGON ((-114.964104 36.008963, -114.964104 36.005183, -114.958248 36.005183, -114.958248 36.008963, -114.964104 36.008963))

geog2: POLYGON ((-114.957387 36.006575, -114.957387 36.000681, -114.9608 36.000681, -114.9608 36.006575, -114.957387 36.006575))

geogUnion: POLYGON ((-114.957387 36.000681, -114.9608 36.000681, -114.96080000000012 36.005183034992221, -114.958248 36.005183, -114.95824799999998 36.00657500911889, -114.957387 36.006575, -114.957387 36.000681))
  

Ответ №1:

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

Как только я нормализовал данные, ориентировав оба прямоугольника одинаковым образом, они вели себя так, как ожидалось. Я надеюсь, что это поможет кому-то еще с подобной проблемой.