Я хочу найти кратчайшее расстояние между двумя полигонами SqlGeography. Я знаю, что есть метод ShortestLineTo (https://msdn.microsoft.com/en-us/library/ff929252.aspx), но при этом выдает пустую строку. Может ли кто-нибудь предложить мне альтернативный способ сделать это? 
Вопрос
Нахождение кратчайшего расстояния между двумя многоугольниками (SqlGeography С#)
- Можете ли вы опубликовать свой пример кода? Hossein Narimani Rad 20.05.2015
- добавлен образец. Пожалуйста, посмотрите на изображение. messi 22.05.2015
- предоставить вам ответ. Hossein Narimani Rad 22.05.2015
Ответы
Ответ 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.
Похожие материалы
- Упрощенный: соединения SQL
- SQL-инъекция: старая киберугроза все еще надвигается
- Базы данных 101
- Новый подход к преобразованию текста в SQL: подход с двумя преобразователями
- Завершение SQL. Часть 1: Трудности с парсингом или сказки о полировке ANTLR
- Сборка "System.Threading.Channels" ссылается на сборку "system.threading.tasks.extensions, v.", которой нет в