Як ArcGIS обчислює відстань між двома точками з нееквідистантною проекцією?


10

Це додаткове запитання до мого попереднього. Чи можете ви запропонувати кілька добре написаних вступних текстів щодо проекцій системи координат?


Припустимо, я працюю з проекцією карти CH1903, яка, наскільки я знаю, є конформною, але не рівномічною. Значення, кути (форма) збереглися, але не області, відстані чи масштаб. (Принаймні, вони не збереглися точно ). Все йде нормально.

Мені цікаво, який обчислення виконує ArcGIS, коли я зараз хочу обчислити відстань між двома точками. В ArcObjects я міг би використовувати IProximityOperatorінтерфейс наступним чином:

IPoint a = ...,
       b = ...;

double distance = ((IProximityOperator)a).ReturnDistance(b);

Питання: Коли я працюю з довідковою системою, яка не точно зберігає відстані, що б робити ArcGIS, коли я запитав її про відстань між двома точками (як показано вище)?

  • Чи просто робиться якась математика Піфагора (a 2 + b 2 = c 2 ), щоб отримати відстань, тобто повернута відстань буде лише такою точною, наскільки дозволяє проекція?

  • Або це зробить щось складніше, на зразок якоїсь форми повторної проекції, щоб отримати більш точну відстань?

( Це ж питання, але загальніше: Після того, як геометрія була спроектована, чи проводить ArcGIS всі обчислення просто в евклідовому просторі, чи використовувана проекція карти все ще впливає на обчислення відстаней, кутів, областей тощо?)


2
Створіть нове запитання замість зміни оригіналу. В іншому випадку ви підриваєте всі механізми на цьому веб-сайті: що означають рейтинги, коли в одній темі грають два чи більше запитань? Що значить означати одну відповідь правильною? І т. Д.
блуд

1
@whuber: Хоча все, що написано в цій темі, все ще є на тему WRT оригінальне запитання, я погоджуюся, що тут справді задаються два питання. Зараз уже занадто пізно це змінити, але пам’ятайте про свої поради наступного разу.
stakx

Відповіді:


10

Якщо ви хочете стабільний метод обчислення геодезичних відстаней, я рекомендую обгортку Річі Кармайкла для проектування двигуна ESRI .

Оновлення: Я просто спробував код Річі з ArcGIS 10.0 на Vista64 і отримав виняток після дзвінка LoadLibrary. Я розгляну це детальніше пізніше.

Поки що, ось якийсь код у відповідь на запитання в коментарях іншої відповіді.

Код порівнює IProximityOperator за точками з просторовими посиланнями і без них. Потім показано, як використовувати азимутальну рівновіддалену проекцію (перша точка - точка дотику), щоб знайти велику відстань кола.

private void Test()
{
    IPoint p1 = new PointClass();
    p1.PutCoords(-98.0, 28.0);

    IPoint p2 = new PointClass();
    p2.PutCoords(-78.0, 28.0);

    Debug.Print("Euclidian Distance {0}", EuclidianDistance(p1, p2));
    Debug.Print("Distance with no spatialref {0}", GetDistance(p1, p2));

    ISpatialReferenceFactory srf = new SpatialReferenceEnvironmentClass();
    IGeographicCoordinateSystem gcs =
    srf.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);

    p1.SpatialReference = gcs;
    p2.SpatialReference = gcs;

    Debug.Print("Distance with spatialref {0}", GetDistance(p1, p2));
    Debug.Print("Great Circle Distance {0}", GreatCircleDist(p1, p2));

}
private double GetDistance(IPoint p1, IPoint p2)
{
    return ((IProximityOperator)p1).ReturnDistance(p2);
}

private double EuclidianDistance(IPoint p1, IPoint p2)
{
    return Math.Sqrt(Math.Pow((p2.X - p1.X),2.0) + Math.Pow((p2.Y - p1.Y), 2.0));
}

private double GreatCircleDist(IPoint p1, IPoint p2)
{
    ISpatialReferenceFactory srf = new SpatialReferenceEnvironmentClass();
    IProjectedCoordinateSystem pcs =
    srf.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_WGS1984N_PoleAziEqui);
    pcs.set_CentralMeridian(true, p1.X);
    ((IProjectedCoordinateSystem2)pcs).LatitudeOfOrigin = p1.Y;
    p1.SpatialReference = pcs.GeographicCoordinateSystem;
    p1.Project(pcs);
    p2.SpatialReference = pcs.GeographicCoordinateSystem;
    p2.Project(pcs);
    return EuclidianDistance(p1, p2);
}

Ось результат:

Euclidian Distance 20
Distance with no spatialref 20
Distance with spatialref 20
Great Circle Distance 1965015.61318737

Думаю, було б цікаво протестувати це проти двигуна проекції dll (pe.dll). Опублікує результати, якщо я коли-небудь зроблю код Річі.

Оновлення: Після того як я змінив код Richies на компіляцію для x86, я його запустив. Цікаво ... велика відстань кола, яку він мені надає, - 1960273.80162999 - істотна відмінність від поверненого методом азимутального рівновіддаленого вище.


Причина розбіжності, ймовірно, полягає в тому, що відрізок лінії (у ПКС), що з'єднує точки, не є проектованою геодезичною, яка була б криволінійною при проектуванні. Відповідно, ви отримуєте менше значення, ніж слід. Тест цієї теорії зробити нескладно: взяти просту геодезичну (наприклад, екватор) і порівняти два обчислення відстані між двома широко відокремленими точками на геодезичній. Один - це прямий розрахунок, як у вашому коді; інший розбиває геодезичну на сегменти, безпосередньо обчислює довжини відрізків і додає їх. Останнє повинно бути більш точним.
whuber

9

В ArcGIS 10 перевірте IGeometryServer2, який тепер має GetDistanceGeodesic (геодезична відстань між двома геометріями), GetLengthsGeodesic (повертає геодезичні довжини кожної полілінії) та DensifyGeodesic (ущільнюють полілінію, будуючи графіки точок уздовж геодезичних ліній, що з'єднують вершини, використовує IPly4 : Геодезичний метод зменшення).

Як вже згадувалося в інших відповідях, ArcGIS все ще використовує здебільшого планарні обчислення.

Меліта Кеннеді


Деякі коментарі до інших відповідей (недостатньо представників, щоб коментувати безпосередньо!).

Азимутальна проекція азимутальної Есрі підтримує еліпсоїди. Код GreatCircleDist створює PCS, який використовує GCS на основі еліпсоїда / сфероїда, таким чином відстані від центру / точки початку будуть геодезичні відстані, а не великі відстані в колі. Це також може бути спрощене. Ми знаємо проектовані координати першої точки, тому що це центр проекції: 0,0. Тож потрібно спроектувати лише 2-ю точку. Потім може бути використана спрощена функція EuclidianDistance.

Я перевірив результати на предмет геодезичних функцій pe.dll і він збігався. Схоже, додаток Річі використовує сферу, тому він повертає великі відстані / координати кола у своїй тестовій програмі. Тому результати не відповідають. Я не розпізнав значення радіусу; Я думаю, що мені потрібно поговорити з ним про це!


2
Меліта - Приємно бачити вас тут!
Кірк Куйкендалл

1
Я згоден, ласкаво просимо на борт!
matt wilkie

8

Точність будь-якої відповіді про ArcGIS може змінюватися в будь-який час - оскільки всі ми знаємо, нові процедури будуть введені в наступному пакеті обслуговування без попередження та документації. При цьому, програмне забезпечення ESRI давно використовує евклідові обчислення ( наприклад , формулу Піфагора для відстаней), коли застосовуються прогнозовані координати. Часто в обчисленнях, як той, який ви ілюструєте, програмне забезпечення навіть не має доступу до інформації про проекцію, тож що ще можна зробити?

Здається, саме ваше запитання підказує, що обчислення евклідової відстані для рівнобедреної проекції є правильними. Ніщо не могло бути далі від істини. Для одноточкової рівновіддаленої проекції евклідова відстань до базової точки гарантується рівною геодезичній відстані; для двоточкової еквідистантної проекції евклідова відстань до будь-якої базової точки гарантується рівною геодезичній відстані. Натомість за ці гарантії метричне спотворення між усіма іншими парами точок зазвичай сильно збільшується порівняно з іншими прогнозами, які можна вибрати.


@whuber: Дякую за відповідь. Щодо першого абзацу: я зрозумів, що ArcGIS може побачити, що використовується проекція карти CH1903 (в якій використовується еліпсоїд Bessel 1841), а потім проектувати точки назад на цей еліпсоїд через дату, а потім робити обчислення відстані на еліпсоїді. З вашої відповіді я вважаю, що ArcGIS цього не зробить і залишиться в евклідовому просторі XY, щоб робити розрахунки. (Як щодо іншого програмного забезпечення ГІС?) - 2-й абзац: Ви, звичайно, праві, дякую за уточнення цього пункту.
stakx

Прихований механізм перепроекції можливий лише в тому випадку, якщо точкові об'єкти підтримують посилання на проекцію. Я не вірю, що вони так роблять.
whuber

@whuber: Чи достатньо (для більш точних розрахунків) знати еліпсоїд, який використовується для проекції? AFAIK, ArcGIS зберігає посилання на використану проекцію з кожним класом характеристик (рівень даних).
stakx

1
Насправді IPoint, що походить від IGeometry, має SpatialReference як властивість. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/… Однак я не думаю, що ReturnDistance використовує це. Можливо, варто перевірити, чи не змінилося це.
Кірк Куйкендалл

1
@stakx Я оновив свою відповідь, щоб включити код, який показує, що встановлення просторового рефлексу не впливає на ReturnDistance.
Кірк Куйкендалл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.