2010-04-16 29 views

cevap

32
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:long1]; 
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:lat2 longitude:long2]; 
NSLog(@"Distance i meters: %f", [location1 distanceFromLocation:location2]); 
[location1 release]; 
[location2 release]; 

Ayrıca projeye CoreLocation.framework ekleyin ve import ifadesini eklemeniz gerekir:

#import <CoreLocation/CoreLocation.h> 
5

Bu bunu yapmanın en etkili yöntem olmayabilir, ancak işe yarayacaktır.

Enlem ve boylam ile belirtilen iki konumunuz vektörler olarak kabul edilebilir. Koordinatların kartesion koordinatlarına dönüştürüldüğü varsayıldığında, iki vektörün nokta çarpımını hesaplayın.

Verilen v1 = (x1, y1, z1) ve v2 = (x2, y2, z2), sonra ...

v1 dot v2 = magnitude(v1) * magnitude(v2) * cos (theta) 

elverişli, v1 ve v2 büyüklüğü aynı olacaktır .. dünyanın (R) yarıçapı.

x1*x2 + y1*y2 + z1*z2 = R*R*cos(theta) 

Teta için çözün.

theta = acos ((x1*x2 + y1*y2 + z1*z2)/(R * R)); 

Artık iki vektör arasında radyan cinsinden açı var. toprak yüzeyinin böylelikle olduğunu genelinde seyahat eden iki nokta betwen mesafe ...

distance = theta * R. 

Orada tamamen küresel koordinatlar kapsamında Bunu yapmanın daha kolay bir yolu daha var ama o bölgede benim matematik çok olduğu bulanık - dolayısıyla kartezyen koordinatlara dönüşüm.

... kartezyen koordinat dönüştürmek

Let alfa enlem olmak ve beta boylam olmak.

x = R * cos (alpha) * cos (beta) 
y = R * sin (alpha) 
z = R * cos (alpha) * sin (beta) 

Matematik işlevinin genellikle radyanlarla uğraştığını ve enlem/boylam derecelerinin derece olarak çalıştığını unutmayın.

+3

Bu bir yaklaşımdır, çünkü toprak daha fazla bir oblik sferoidin (daha hassas olması için armut şeklinde yapılmış) ve yüzeyi düz değil. – outis

+1

Dünya için küresel bir model (http://trac.osgeo.org/proj/wiki/GeodesicCalculations) kullanma hatasıyla ilgili bir tartışma için 'proj.4' web sitesine bakın. Alt satırda, R için iyi bir değer seçerseniz, bu yaklaşımla% 1'e varabilirsiniz. – mtrw

+0

+1. Muhtemelen bu cevap "Büyük daire rotası nasıl hesaplanır" (deniz navigasyon terimi) olarak adlandırılabilir. UPVOTE DISCLAIMER: Bu konuda matematik doğrulamak için sıfır yeteneğim var. Ben sadece onu üreten yeteneği kıskanıyorum ve net sunumu saygılıyorum. – Smandoli

1

Matematikten geçtim ve şimdi çözümü çok kolaylaştırabilirim.

Dünyayı döndürüp, ilk vektörün 0 derece enlem ve 0 derece boylamında olduğunu düşünün. İkinci vektör, (alpha2-alfa1) derece enlem ve (beta2-beta1) derecelerde enlemdedir. Yana

...

sin(0) = 0 and cos(0) = 1 

eden nokta ürün simplies için ...

cos(delta_alpha) * cos(delta_beta) = cos(theta) 

matematik kalanı değişmeden kalır.

theta = acos (cos(delta_alpha) * cos(delta_beta)) 
distance = radius * theta 

Bu yardımcı olur umarım.

İlgili konular