(Büyük daire) yol üzerinde proje konumu


9

Bu SE sitesini birkaç saattir araştırıyorum ve hala soruma bir çözüm bulmakta zorlanıyorum. Amacım OSM'de ve konumumda (lat / lon koordinatları) bir yol verildiğinde, bu şekilde en yakın konumu (lat / lon koordinatları) bulmak istiyorum. Nokta yolun herhangi bir yerinde olabilir, yolu tanımlamak için kullanılan noktalarla sınırlı değildir.

Bu yüzden aşağıdaki algoritmayı düşünüyorum:

  1. Yolu ayrı kenarlara ayırın, her kenar sadece iki noktayı birleştirir.
  2. En yakın kenarı seçin.
  3. Konumumu bu kenara yansıt.

Şimdi bir konum ile yol arasındaki mesafeyi hesaplamakla ilgili birçok soru var:

Ayrıca hesaplamaları doğru veya doğrulanamadığım çok benzer bir soru:

Dr. Math'dan da bu konuda bazı bilgiler var . Ancak adım 3'teki konumu hesaplamak için bir algoritma bulamıyorum. Cebirlere uzunca bir süre dokunmadım (vektör), bu cevaplardaki mantığı tam olarak anlamıyorum.

Birisi bunu yapmak için bir algoritma gösterebilir mi? Herhangi bir makul programlama dilinde bir çözüm benim için iyi.


1
Diğer soruları "reddetmeniz" için kritik göründüğünden, lütfen "konumumu bu kenara yansıtın" konusunu açıklayın. Yansıtma kenarda olmayabilir. Ben sorunu olduğuna inanıyoruz olduğu diğer sorularda hitap etti. (Araştırma için aferin, BTW.)
Martin F


@MartinF bu soru, bir noktadan çizgiye olan mesafeyi hesaplar, ancak çizginin kendisindeki en yakın noktayı hesaplamaz.
bouke

Orada olduğu bir çözüm gis.stackexchange.com/a/23500/3195 olsa olduğunu anlamak belki zor.
Martin F

Ah evet teşekkürler, ref no'yu güncelledim. 3. Söz konusu sorudaki 'çözüm', sorun alanının genel bir açıklamasına bağlanmaktadır. Bu, iyi temellendirilmiş matematikçiler için yeterli olsa da, bu makaledeki matematiği tam olarak anlamıyorum.
bouke

Yanıtlar:


7

Dünyanın küresel bir modelini kullanmak yeterli doğruluk sağlayabilir ve basit hızlı hesaplamalara yol açabilir.

Tüm koordinatları dünya merkezli (3D) kartezyen koordinatlara dönüştürün. Örneğin, formül

(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))

yapacağım. (Dünya yarıçapının uygun olduğu bir birim olduğu bir mesafe ölçüsü kullanır.)

Başlangıç ​​noktası için X0 = (x0, y0, z0) ve hedef noktası için büyük daireyi tanımlayan X1 = (x1, y1, z1) yazmak (X0'ın X1'den farklı olması ve ikisinin çap olarak zıt olmaması şartıyla), U, X0 ve X1'in normalleştirilmiş çapraz ürünü olsun. Bu iki adımda hesaplanır:

V = (xv, yv, zv) = (y0*z1 - z0*y1, z0*x1 - x0*z1, x0*y1 - y0*x1)

V uzunluğu

|V| = sqrt(xv^2 + yv^2 + zv^2)

Normalizasyon V birim uzunluğuna kadar uzanır:

U = (xu, yu, zu) = V / |V| = (xv/|V|, yv/|V|, zv/|V|).

Herhangi bir X = (x, y, z) noktası ile bu büyük dairenin düzlemi arasındaki yönlendirilmiş 3D mesafesi, X'in Z ile Z'nin nokta ürünüdür.

d = X * U = x*xu + y*yu + z*zu

Dünya yüzeyindeki mesafe açısından en yakın nokta , uçağa en yakın olanıdır: bu nedenle, d' nin en küçük mutlak değerine sahiptir .

şekil

Bu şekil, iki beyaz nokta tarafından belirlenen büyük bir daireyi (siyah renkte) ve bu büyük dairenin düzlemine mutlak 3D mesafelerine göre renkli ve gölgeli alandaki 2000 rastgele noktayı gösterir; yani, | d |.

En yakın noktayı bulduktan sonra, onu büyük dairenin düzlemine (3B olarak) yansıtarak ve sonra bunu radyal olarak dışa doğru dünya yüzeyine uzatarak büyük daireye yansıtın. İzdüşüm sadece d * U'yu çıkarır:

X' = (x', y', z') = X - d*U = (x - d*xu, y - d*yu, z - d*zu).

Radyal izdüşüm, X '' i, U 'olarak yeniden düzenlendiği şekilde basitçe renormalize eder:

X'' = X' / |X'|.

(Bu, en yakın nokta büyük dairenin kutuplarından biri olduğunda gerçekleşen | X '| = 0 ise sorunlu olacaktır. Bu durumun koduna, varsa, bir test ekleyin ve ayrı olarak ele alın, hangi kutbu belirlemek için d işaretini kullanarak .)

İstenirse, X '' koordinatlarını normal formülleri kullanarak (lat, lon) haline dönüştürün .


Bir soru. Herhangi bir X1 ve X0'ı (büyük daire üzerinde) seçebileceğimiz çok kesin olmayan bir durumu düşünün, doğruluk açısından X1 ve X0'ı yakın veya uzak ayırmak daha iyidir (yine X0'ın X1 ve X1'den farklı olması şartıyla) ikisi taban tabana zıt değildir)?
user189035

1
@ user189035 90 derece arayla onları seçin. Çok yakın olduklarında, çapraz ürünleri sayısal olarak belirsizdir: çıkarmalarda çok fazla iptal vardır ve bu da önemli rakamların kaybına yol açar.
whuber
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.