Я хочу найти кратчайшее расстояние между двумя полигонами SqlGeography. Я знаю, что есть метод ShortestLineTo (https://msdn.microsoft.com/en-us/library/ff929252.aspx), но при этом выдает пустую строку. Может ли кто-нибудь предложить мне альтернативный способ сделать это? 
Нахождение кратчайшего расстояния между двумя многоугольниками (SqlGeography С#)
Ответы (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 a> чтобы вы знали об ошибочно определенных географических координатах.

Как показано на рисунке, EnvelopeAngle=180 означает, что полигон содержит очень большую область мира.
Используйте ShortestLineTo
Пустой экземпляр LineString возвращается, когда два экземпляра geography пересекаются друг с другом.