ArcGIS eşit olmayan bir projeksiyon ile iki nokta arasındaki mesafeyi nasıl hesaplar?


10

Bu bir öncekime bir soru, Koordinat sistemi projeksiyonları hakkında iyi yazılmış tanıtım metinleri önerebilir misiniz?


Diyelim ki, bildiğim kadarıyla uyumlu olan ancak eşitlikçi olmayan CH1903 harita projeksiyonu ile çalışıyorum. Anlamlar, açılar (şekil) korunur, ancak alanlar, mesafeler veya ölçek korunmaz. (En azından bunlar tam olarak korunmamıştır ). Çok uzak çok iyi.

Şimdi iki nokta arasındaki mesafeyi hesaplamak istediğimde ArcGIS'in ne tür bir hesaplama yaptığını merak ediyorum. ArcObjects'te IProximityOperatorarayüzü aşağıdaki gibi kullanabilirim :

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

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

Soru: Mesafeleri tam olarak koruyamayan bir referans sistemiyle çalışırken, iki nokta arasındaki mesafeyi (yukarıda gösterildiği gibi) sorguladığımda ArcGIS ne yapardı?

  • Mesafeyi elde etmek sadece Pisagor matematiğini ( 2 + b 2 = c 2 ) yapıyor mu, yani döndürülen mesafe sadece projeksiyonun izin verdiği kadar doğru olacak mı?

  • Yoksa daha doğru bir mesafe elde etmek için bir tür yeniden projeksiyon gibi daha karmaşık bir şey mi yapacak?

( Aynı soru, ancak daha genel olarak: Geometriler yansıtıldıktan sonra, ArcGIS tüm hesaplamaları sadece Öklid uzayında mı yapıyor, yoksa kullanılan harita projeksiyonu da mesafelerin, açıların, alanların vb. Hesaplamalarını etkiliyor mu?)


2
Lütfen orijinalinizi değiştirmek yerine yeni bir soru oluşturun. Aksi takdirde, bu sitedeki tüm mekanizmaları yıkıyorsunuz: bir iş parçacığında iki veya daha fazla soru olduğunda derecelendirmeler ne anlama geliyor? Bir cevabı doğru olarak işaretlemek ne anlama gelir? Vb
whuber

1
@whuber: Bu konuda yazılanların hepsi hala konu ile ilgili WRT olmasına rağmen, asıl soru sordu, şimdi burada gerçekten iki soru sorulduğunu kabul ediyorum. Bunu şimdi değiştirmek için çok geç, ancak bir dahaki sefere tavsiyenizi aklınızda tutacak.
stakx

Yanıtlar:


10

Jeodezik mesafeleri hesaplamak için istikrarlı bir yöntem istiyorsanız, Richie Carmichael'ın ESRI'nin Projeksiyon Motoru için sarıcısını öneriyorum .

Güncelleme: Vista64'te Richie'nin kodunu ArcGIS 10.0 ile denedim ve aradıktan sonra bir istisna aldım LoadLibrary. Bunu daha sonra inceleyeceğim.

Şimdilik, başka bir cevabın yorumlarındaki sorulara yanıt olarak bazı kodlar.

Kod, uzamsal referansları olan ve olmayan noktalar için IProximityOperator'ı karşılaştırır. Daha sonra, büyük daire mesafesini bulmak için azimutal eşitlikli bir projeksiyonun (ilk nokta teğet noktasıdır) nasıl kullanılacağını gösterir.

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);
}

İşte çıktı:

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

Bu projeksiyon motoru dll (pe.dll) karşı test etmek ilginç olacağını düşünüyorum. Richie'nin kodunu işe yaratırsam sonuç gönderirim.

Güncelleme: x86 için derlemek için Richies kodunu değiştirdikten sonra çalıştırmayı başardım. İlginç ... bana verdiği büyük daire mesafesi 1960273.80162999 - yukarıdaki azimuthal eşitlik yönteminden dönen mesafeden önemli bir fark.


Farklılıkların nedeni büyük olasılıkla noktaları birleştiren çizgi parçasının (PCS'de) yansıtıldığında eğrisel olacak şekilde öngörülen bir jeodezik olmadığıdır. Buna göre, olması gerekenden daha küçük bir değer elde edersiniz. Bu teorinin bir testinin yapılması basittir: basit bir jeodezik (ekvator gibi) alın ve jeodezik üzerinde geniş ölçüde ayrılmış iki nokta arasındaki mesafenin iki hesaplamasını karşılaştırın. Birincisi, kodunuzda olduğu gibi doğrudan hesaplamadır; diğeri jeodezikleri parçalara ayırır, doğrudan segment uzunluklarını hesaplar ve toplar. İkincisi daha doğru olmalıdır.
whuber

9

ArcGIS 10'da, şimdi GetDistanceGeodesic (iki geometri arasındaki jeodezik mesafe), GetLengthsGeodesic (her çoklu çizginin jeodezik uzunluklarını döndürün) ve DensifyGeodesic'e (noktaları bağlayan jeodezik çizgilerin jeodezik uzunluklarını döndürün), IPolycurve4'ü kullanan bir çoklu çizgiyi yoğunlaştıran IGeometryServer2'ye bakın: : GeodesicDensify) yöntemleri.

Diğer cevaplarda belirtildiği gibi, ArcGIS hala daha düzlemsel hesaplamalar kullanıyor.

Melita Kennedy


Diğer cevaplarla ilgili bazı yorumlar (henüz doğrudan yorum yapmak için yeterli temsilci yok!).

Esri'nin azimuthal eşitlikli çıkıntısı elipsoidleri destekler. GreatCircleDist kodu elipsoid / sferoid tabanlı bir GCS kullanan bir PCS oluşturuyor, bu nedenle merkez / başlangıç ​​noktasından uzaklıklar büyük daire mesafeleri değil, jeodezik mesafeler olacak. Ayrıca basitleştirilebilir. İlk noktanın tahmin edilen koordinatlarını biliyoruz çünkü bu projeksiyonun merkezi: 0,0. Bu yüzden sadece 2. noktanın yansıtılması gerekir. Daha sonra basitleştirilmiş bir EuclidianDistance işlevi kullanılabilir.

Pe.dll jeodezik işlevlere karşı sonuçları kontrol ve eşleşti. Görünüşe göre Richie'nin uygulaması bir küre kullanıyor, bu yüzden test uygulamasında büyük daire mesafeleri / koordinatları döndürüyor. Bu yüzden sonuçlar uyuşmuyor. Yarıçap değerlerini tanımıyordum; Bence onunla bunun hakkında konuşmam gerek!


2
Melita - Seni burada görmek çok güzel!
Kirk Kuykendall

1
Kabul ediyorum, hoş geldiniz!
matt wilkie

8

ArcGIS ile ilgili herhangi bir cevabın doğruluğu her zaman değişebilir - bildiğimiz her şey için, yeni prosedürler uyarı veya dokümantasyon olmadan bir sonraki servis paketine sunulacaktır. Bununla birlikte, öngörülen koordinatlar kullanıldığında ESRI yazılımı uzun bir süre Öklid hesaplamaları ( örneğin mesafeler için Pisagor formülü) kullanmıştır. Genellikle, açıkladığınız gibi hesaplamalarda, yazılımın projeksiyon bilgilerine erişimi bile yoktur, bu yüzden başka ne yapılabilir?

Sorunuzun kendisi, eşit uzaklıktaki bir projeksiyon için Öklid uzaklık hesaplamalarının doğru olduğunu gösteriyor gibi görünüyor. Hiçbir şey gerçeğin ötesinde olamaz. Tek noktalı eşit mesafeli bir projeksiyon için, taban noktaya Öklid mesafesinin jeodezik mesafeye eşit olması garanti edilir; iki noktadan eşit uzaklıktaki bir projeksiyon için, her iki taban noktasına olan Öklid mesafesinin jeodezik mesafeye eşit olması garanti edilir. Bu garantiler karşılığında, diğer tüm nokta çiftleri arasındaki metrik bozulma, birinin seçebileceği diğer projeksiyonlara kıyasla tipik olarak büyük ölçüde artar.


@whuber: Yanıtladığınız için teşekkürler. İlgili ilk paragrafı: Ben figürlü ArcGIS olabilir noktaları datum aracılığıyla o Elipsoidde üzerine geri ve proje sonra (Bessel 1841 elipsoid kullanır) CH1903 harita projeksiyonu kullanıldığını görmek ve sonra Elipsoidde mesafe hesaplamalarını yapmak. Cevabınızdan, ArcGIS'in tüm bunları yapmayacağını ve hesaplama yapmak için Öklid XY uzayında kalacağını düşünüyorum. (Diğer CBS yazılımlarına ne dersiniz?) - 2. paragraf: Elbette haklısınız, bu noktayı açıklığa kavuştuğunuz için teşekkürler.
stakx

Gizli bir yeniden projeksiyon mekanizması, yalnızca nokta nesneleri bir projeksiyona referansları koruyorsa mümkündür. Yaptıklarına inanmıyorum.
whuber

@whuber: İzdüşüm için kullanılan elipsoidi bilmek (daha doğru hesaplamalar için) yeterli olur mu? AFAIK, ArcGIS, her özellik sınıfıyla (veri katmanı) kullanılan projeksiyona bir referans depolar.
stakx

1
Aslında IGeometry'den türetilen IPoint, bir özellik olarak SpatialReference özelliğine sahiptir. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/… Ancak, ReturnDistance'ın bunu kullandığını düşünmüyorum. Bunun değişip değişmediğini görmek test etmeye değer olabilir.
Kirk Kuykendall

1
@stakx Cevabımı spatialref ayarının ReturnDistance üzerinde hiçbir etkisi olmadığını gösteren kodu içerecek şekilde güncelledim.
Kirk Kuykendall
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.