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

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


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


Ответы (2)


Вы должны определить 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 чтобы вы знали об ошибочно определенных географических координатах.

Демонстрационный снимок экрана с углом конверта

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

person Hossein Narimani Rad    schedule 22.05.2015
comment
@messi рад быть полезным :) - person Hossein Narimani Rad; 22.05.2015

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

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

person adPartage    schedule 20.05.2015
comment
Проблема в том, что два географических экземпляра не пересекаются. Смотрите изображение, чтобы получить ясность. - person messi; 22.05.2015
comment
@messi они пересекаются, поэтому ЛеМара указывает на правильную проблему, но для получения дополнительных объяснений вы можете посмотреть мой ответ. - person Hossein Narimani Rad; 22.05.2015