Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Нахождение кратчайшего расстояния между двумя многоугольниками (SqlGeography С#)

Автор вопроса: messiОтветов: 2

Я хочу найти кратчайшее расстояние между двумя полигонами SqlGeography. Я знаю, что есть метод ShortestLineTo (https://msdn.microsoft.com/en-us/library/ff929252.aspx), но при этом выдает пустую строку. Может ли кто-нибудь предложить мне альтернативный способ сделать это? введите здесь описание изображения

  • Можете ли вы опубликовать свой пример кода? Hossein Narimani Rad 20.05.2015
  • добавлен образец. Пожалуйста, посмотрите на изображение. messi 22.05.2015
  • предоставить вам ответ. Hossein Narimani Rad 22.05.2015

sqlsql-serverspatial

Ответы

Ответ 1 · рейтинг 2 · Hossein Narimani Rad

Вы должны определить GEOGRAPHY в порядке против часовой стрелки. Если вы определите его CW, это будет весь мир, кроме региона, который вы определяете:

DECLARE @G1 GEOGRAPHY = 'POLYGON ((1 1, 3 1, 3 3, 1 3, 1 1))';
DECLARE @G2 GEOGRAPHY = 'POLYGON ((45 45, 45 46, 44 46, 44 45, 45 45))';

//This is what you have defined
DECLARE @G3 GEOGRAPHY = 'POLYGON ((45 45, 44 45, 44 46, 45 46, 45 45))';

@G1: порядок точек против часовой стрелки, поэтому @G1 - это многоугольник, содержащий POINT(2,2)

@G2: порядок точек против часовой стрелки, поэтому @G2 - это многоугольник, содержащий POINT(44.5,45.5)

@G3: порядок точек CW, поэтому @G3 - это многоугольник, содержащий весь мир, за исключением многоугольника @G2. Он также содержит полигон @G1, поэтому кратчайшее расстояние между @G1 и @G3 не имеет никакого значения.

Переключение между геометрией CW и CCW

Используя метод ReorientObject(), вы можете переключаться между географией CW и CCW. Итак, если вы попробуете:

SELECT @G3.ReorientObject().STDifference(@G2).STAsText();

Результат будет GEOMETRYCOLLECTION EMPTY, потому что они содержат один и тот же регион. Итак, они пересекаются, и результат ShortestLineTo возвращает LINESTRING EMPTY, потому что они пересекаются друг с другом.

еще один момент

Вы можете проверить, содержит ли полигон слишком большую область, проверив EnvelopeAngle a> чтобы вы знали об ошибочно определенных географических координатах.

Как показано на рисунке, EnvelopeAngle=180 означает, что полигон содержит очень большую область мира.

Ответ 2 · рейтинг 2 · adPartage

Используйте ShortestLineTo

Пустой экземпляр LineString возвращается, когда два экземпляра geography пересекаются друг с другом.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы