Bu cevap birden fazla bölüme ayrılmıştır:
"Hazır" rutinler ile istenen noktanın nasıl bulunacağını gösteren Problemin Analizi ve Azaltılması .
İllüstrasyon: Çalışma kodu veren bir Çalışma Prototipi .
Örnek , çözeltiler örneklerini gösteren.
Tuzaklar , potansiyel sorunları ve onlarla nasıl başa çıkılacağını tartışıyor.
ArcGIS uygulaması , özel bir ArcGIS aracı oluşturma ve gerekli rutinlerin nereden alınacağı hakkında yorumlar.
Sorunun Analizi ve Azaltılması
(Mükemmel yuvarlak) küresel modelde her zaman bir çözüm olacağını gözlemleyerek başlayalım - aslında, tam olarak iki çözüm. A, B ve C taban noktaları verildiğinde, her bir çift, verilen iki noktadan eşit uzaklıkta olan noktalar kümesi olan "dikey açıortayını" belirler. Bu açıortay jeodeziktir (büyük daire). Küresel geometri eliptiktir : herhangi iki jeodezik kesişir (iki benzersiz noktada). Böylece, AB'nin ve BC'nin açıcının kesişme noktaları - tanım gereği - A, B ve C'den eşit uzaklıkta olup, sorunu çözmektedir. (Aşağıdaki ilk şekle bakın.)
Elipsoidde işler daha karmaşık görünüyor, ancak kürenin küçük bir pertürbasyonu olduğu için benzer davranışlar bekleyebiliriz. (Bunun analizi bizi çok uzağa götürür.) Bir elipsoid üzerinde doğru mesafeleri hesaplamak için kullanılan karmaşık formüller (dahili olarak bir CBS içinde) kavramsal bir komplikasyon değildir, sorun temelde aynıdır. Sorunun ne kadar basit olduğunu görmek için, biraz soyut olarak belirtelim. Bu ifadede, "d (U, V)" U ve V noktaları arasındaki gerçek, tamamen doğru mesafeyi ifade eder.
Elipsoid üzerinde üç nokta A, B, C (lat-lon çiftleri olarak) verildiğinde, (1) d (X, A) = d (X, B) = d (X, C) ve ( 2) bu ortak mesafe mümkün olduğunca küçüktür.
Bu üç mesafenin tümü bilinmeyen X'e bağlıdır . Böylece u (X) = d (X, A) - d (X, B) ve v (X) = d (X, B) - d (X, C) mesafelerindeki farklılıklar X'in gerçek değerli işlevleridir. Yine, soyut bir şekilde, bu farklılıkları düzenli bir çift olarak bir araya getirebiliriz. Ayrıca X için koordinatlar olarak (lat, lon) kullanacağız, bunu da düzenli bir çift olarak düşünmemize izin verin, örneğin X = (phi, lambda). Bu kurulumda, işlev
F (phi, lambda) = (u (X), v (X))
iki boyutlu bir uzayın bir kısmından iki boyutlu uzayda değerler alan bir fonksiyon ve sorunumuz
F (phi, lambda) = (0,0) olan tüm olasıları (phi, lambda) bulun.
İşte bu noktada soyutlama karşılığını verir: Bu (tamamen sayısal çok boyutlu kök bulma) problemini çözmek için birçok harika yazılım mevcuttur. Çalışma şekli, F'yi hesaplamak için bir rutin yazmanız , daha sonra girişindeki kısıtlamalar hakkında herhangi bir bilgi ile birlikte yazılıma aktarmanızdır ( phi -90 ile 90 derece arasında olmalı ve lambda -180 ile 180 arasında olmalıdır) derece). Saniyenin bir kısmı için krank eder ve bulabilirse (tipik olarak) yalnızca bir değer ( phi , lambda ) döndürür .
Ele alınacak ayrıntılar var , çünkü bunun bir sanatı var: F'nin nasıl davrandığına bağlı olarak seçim yapabileceğiniz çeşitli çözüm yöntemleri var ; arama için makul bir başlangıç noktası vererek yazılımı "yönlendirmeye" yardımcı olur (bu, başka herhangi bir çözüm yerine en yakın çözümü elde etmenin bir yoludur ); ve genellikle çözümün ne kadar doğru olmasını istediğinizi belirtmeniz gerekir (böylece aramayı ne zaman durduracağını bilir). (CBS analistlerinin CBS problemlerinde çok fazla ortaya çıkan bu tür ayrıntılar hakkında bilmesi gerekenler hakkında daha fazla bilgi için, lütfen Jeo-Uzamsal Teknolojiler için Bilgisayar Bilimi dersine dahil edilecek konuları önerin bölümünü ziyaret edin ve sondaki "Çeşitli" bölümüne bakın. )
Örnek: Çalışan bir Prototip
Analiz, iki şeyi programlamamız gerektiğini gösteriyor: çözümün kaba bir başlangıç tahmini ve F'nin hesaplanması .
İlk tahmin, üç temel noktanın "küresel ortalaması" ile yapılabilir. Bu, onları jeosantrik Kartezyen (x, y, z) koordinatlarında temsil ederek, bu koordinatların ortalamasını alarak ve bu ortalamayı küreye geri yansıtarak ve enlem ve boylamda yeniden ifade ederek elde edilir. Kürenin büyüklüğü önemsizdir ve hesaplamalar böylece basit bir şekilde yapılır: çünkü bu sadece bir başlangıç noktası olduğundan, elipsoidal hesaplamalara ihtiyacımız yok.
Bu çalışma prototipi için Mathematica 8 kullandım .
sphericalMean[points_] := Module[{sToC, cToS, cMean},
sToC[{f_, l_}] := {Cos[f] Cos[l], Cos[f] Sin[l], Sin[f]};
cToS[{x_, y_, z_}] := {ArcTan[x, y], ArcTan[Norm[{x, y}], z]};
cMean = Mean[sToC /@ (points Degree)];
If[Norm[Most@cMean] < 10^(-8), Mean[points], cToS[cMean]] / Degree
]
(Son If
koşul, ortalamanın bir boylamı belirtmek için açıkça başarısız olup olamayacağını test eder; öyleyse, girdisinin enlem ve boylamlarının düz bir aritmetik ortalamasına geri döner - belki de mükemmel bir seçim değil, en azından geçerli bir seçimdir. Bu kodu uygulama rehberliği için kullananlar için, Mathematica'nın argümanlarının ArcTan
diğer birçok uygulamaya kıyasla tersine çevrildiğine dikkat edin : ilk argümanı x koordinatı, ikincisi y koordinatıdır ve vektörün yaptığı açıyı döndürür ( x, y)).
İkinci bölüme gelince, Mathematica - ArcGIS ve neredeyse tüm diğer GIS'ler gibi - elipsoid üzerinde doğru mesafeleri hesaplamak için kod içerdiğinden, yazacak neredeyse hiçbir şey yok. Sadece kök bulma rutini diyoruz:
tri[a_, b_, c_] := Block[{d = sphericalMean[{a, b, c}], sol, f, q},
sol = FindRoot[{GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, a] ==
GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, b] ==
GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, c]},
{{f, d[[1]]}, {q, d[[2]]}},
MaxIterations -> 1000, AccuracyGoal -> Infinity, PrecisionGoal -> 8];
{Mod[f, 180, -90], Mod[q, 360, -180]} /. sol
];
Bu uygulamanın en dikkat çekici yanı , sırasıyla enlem ( f
) ve boylam ( q
) değerlerini her zaman sırasıyla 180 ve 360 derece modulo hesaplayarak nasıl sınırlandırması gerektiğidir . Bu, sorunu sınırlamaktan kaçınır (bu genellikle komplikasyonlar yaratır). Kontrol parametreleri MaxIterations
vb., Bu kodun mümkün olan en yüksek doğruluğu sağlaması için ayarlanmıştır.
Eylem halinde görmek için, ilgili bir soruda verilen üç temel noktaya uygulayalım :
sol = tri @@ (bases = {{-6.28530175, 106.9004975375}, {-6.28955287, 106.89573839}, {-6.28388865789474, 106.908087643421}})
{-6.29692, 106.907}
Bu çözüm ile üç nokta arasındaki hesaplanan mesafeler
{1450.23206979, 1450.23206979, 1450.23206978}
(bunlar metredir). Onbirinci önemli basamaktan anlaşıyorlar (mesafeler nadiren bir milimetreden daha iyiye doğru olduğu için çok kesin). İşte bu üç noktanın (siyah), üç karşılıklı açılayıcılarının ve çözümünün (kırmızı) bir resmi:
Misal
Bu uygulamayı test etmek ve sorunun nasıl davrandığını daha iyi anlamak için, burada üç geniş aralıklı taban noktası için mesafelerde kök ortalama kare tutarsızlığının bir kontur grafiği vardır. (RMS tutarsızlığı, üç (d, X, A) -d (X, B), d (X, B) -d (X, C) ve d (X, C) -d (X) farklarının hesaplanmasıyla elde edilir. , A), karelerinin ortalamasını almak ve karekök almak X'in problemi çözdüğü zaman sıfıra eşittir ve aksi takdirde X bir çözeltiden uzaklaştıkça artar ve böylece herhangi bir yerde ne kadar "yakın" olduğumuzu ölçer. )
Temel noktalar (60, -120), (10, -40) ve (45,10) bu Plaka Carree projeksiyonunda kırmızı renkte gösterilmiştir; hesaplamak için 0.03 saniye gerektiren çözelti (49.2644488, -49.9052992) sarı renktedir. RMS tutarsızlığı, ilgili tüm mesafeler binlerce kilometre olmasına rağmen, üç nanometreden daha azdır . Karanlık alanlar RMS'nin küçük değerlerini ve açık alanlar yüksek değerler gösterir.
Bu harita açıkça (-49.2018206, 130.0297177) yakınında bulunan başka bir çözüm olduğunu göstermektedir (ilk arama değerini ilk çözümün çapına zıt olarak ayarlayarak iki nanometrelik bir RMS ile hesaplanmıştır.)
tuzaklar
Sayısal dengesizlik
Temel noktalar neredeyse birbirine yakın ve birbirine yakın olduğunda, tüm çözümler neredeyse yarım dünya uzakta olacak ve doğru bir şekilde tespit edilmesi son derece zor olacaktır. Bunun nedeni, dünyadaki bir konumdaki küçük değişikliklerin - onu taban noktalarına doğru veya uzağa doğru hareket ettirmenin - mesafeler arasındaki farklılıklarda inanılmaz derecede küçük değişikliklere yol açmasıdır. Sonucu belirlemek için jeodezik mesafelerin olağan hesaplamasında yeterli doğruluk ve kesinlik yoktur.
Örneğin, Prime Meridian boyunca her bir çift arasında sadece 111 metre ayrılan (45.001, 0), (45, 0) ve (44.999,0) temel noktalardan başlayarak tri
çözümü alır (11.8213, 77.745) ). Ondan taban noktalara olan uzaklık 8.127.964.998 77; 8.127.964.998 41; ve sırasıyla 8.127.964.998 65 metre. En yakın milimetreyi kabul ediyorlar! Bu sonucun ne kadar doğru olabileceğinden emin değilim, ancak diğer uygulamalar bu konumdan çok uzak konumlar döndürdüğünde ve üç mesafenin neredeyse eşitliğini gösterdiyse en azından şaşırmazdı.
Hesaplama süresi
Bu hesaplamalar, karmaşık mesafe hesaplamaları kullanarak hatırı sayılır araştırmalar içerdiğinden, hızlı değildir ve genellikle bir saniyenin gözle görülür bir kısmını gerektirir. Gerçek zamanlı uygulamaların bunun farkında olması gerekir.
ArcGIS uygulaması
Python, ArcGIS için tercih edilen kodlama ortamıdır (sürüm 9'dan başlayarak). Scipy.optimize paketi çok değişkenli rootfinder sahiptir root
yapmalı FindRoot
yapar Mathematica kodu. Elbette ArcGIS'in kendisi doğru elipsoidal mesafe hesaplamaları sunar. Geri kalan, tüm uygulama detaylarıdır: taban noktası koordinatlarının nasıl elde edileceğine (kullanıcı tarafından yazılan bir katmandan? Bir metin dosyasından? Fareden?) Ve çıktının nasıl sunulacağına (koordinatlar olarak) karar verin ekranda bir grafik noktası olarak? bir katmandaki yeni bir nokta nesnesi olarak?) görüntüleniyorsa, o arabirimi yazın, burada gösterilen Mathematica kodunu (basit) bağlayın ve hepiniz ayarlanacaktır.