ユーザーに彼と約500の座標との間の距離を表示する必要があることを願って、アプリを完成させています。
CLLocationメソッドを使用して計算するとうまく機能しますが、iPhone4では各場所の計算が完了するまでに約1分かかります。
それを行うための最良の方法は何ですか?スパンを使用していますか?他のより速い方法はありますか?
皆さんありがとう、
ルイ
ユーザーに彼と約500の座標との間の距離を表示する必要があることを願って、アプリを完成させています。
CLLocationメソッドを使用して計算するとうまく機能しますが、iPhone4では各場所の計算が完了するまでに約1分かかります。
それを行うための最良の方法は何ですか?スパンを使用していますか?他のより速い方法はありますか?
皆さんありがとう、
ルイ
私はSahgalが正しいと思います.ここにいくつかのコードがあります.おそらくそれはあなたを助けるでしょう.
+(CGFloat)calculateDistanceBetweenSource:(CLLocationCoordinate2D)firstCoords andDestination:(CLLocationCoordinate2D)secondCoords
{
// this radius is in KM => if miles are needed it is calculated during setter of Place.distance
double nRadius = 6371;
// Get the difference between our two points
// then convert the difference into radians
double nDLat = (firstCoords.latitude - secondCoords.latitude)* (M_PI/180);
double nDLon = (firstCoords.longitude - secondCoords.longitude)* (M_PI/180);
double nLat1 = secondCoords.latitude * (M_PI/180);
double nLat2 = secondCoords.latitude * (M_PI/180);
double nA = pow ( sin(nDLat/2), 2 ) + cos(nLat1) * cos(nLat2) * pow ( sin(nDLon/2), 2 );
double nC = 2 * atan2( sqrt(nA), sqrt( 1 - nA ));
double nD = nRadius * nC;
NSLog(@"Distance is %f",nD);
return nD; // converts to miles or not (if en_) => implicit in method
}
私は他の答えを見てきましたが、それらが正しいかどうかはわかりませんが、より良い解決策があると思います:
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
次のように使用できます。
- (CLLocationDistance) DistanceBetweenCoordinate:(CLLocationCoordinate2D)originCoordinate andCoordinate:(CLLocationCoordinate2D)destinationCoordinate {
CLLocation *originLocation = [[CLLocation alloc] initWithLatitude:originCoordinate.latitude longitude:originCoordinate.longitude];
CLLocation *destinationLocation = [[CLLocation alloc] initWithLatitude:destinationCoordinate.latitude longitude:destinationCoordinate.longitude];
CLLocationDistance distance = [originLocation distanceFromLocation:destinationLocation];
[originLocation release];
[destinationLocation release];
return distance;
}
ここにそのためのコードがあります..
-(NSString *)findDistanceBetweenTwoLatLon
{
int intEarthRadius = 3963;
double dblLat1 = DegreesToRadians(firstLatitude);
double dblLon1 = DegreesToRadians(firstLongitude);
double dblLat2 = DegreesToRadians(secondLatitude);
double dblLon2 = DegreesToRadians(secondLongitude);
float fltLat = dblLat2 - dblLat1;
float fltLon = dblLon2 - dblLon1;
double a = sin(fltLat/2) * sin(fltLat/2) + cos(dblLat2) * cos(dblLat2) * sin(fltLon/2) * sin(fltLon/2) ;
double c = 2 * atan2(sqrt(a), sqrt(1-a));
double d = intEarthRadius * c;
double dMeters = d * kOneMileMeters;
NSString *strDistance = [NSString stringWithFormat:@"%1.2f meters",dMeters];
return strDistance;
}
このすべてのマクロを定義します..
ラジアンへの度
#define DegreesToRadians(degrees) (degrees * M_PI / 180)
ここで M_PI
#define M_PI 3.14159265358979323846264338327950288
#define kOneMileMeters 1609.344
別のアプローチを試すことができます。両方のポイントの緯度経度を取得できます (緯度経度の検索にそれほど時間がかからないと仮定します)。緯度経度を使用して距離を計算する式があります。