2012-07-30 2 views
1

좋은 날, 나는 Objective C Dev를 처음 접했고 여기서 http://www.movable-type.co.uk/scripts/latlong.html에있는 중점 수식의 구현을 묻고 있습니다. = 코사인 바이GPS 사이의 중간 점 좌표를 얻기위한 수식 구현 코드

= Bx로 COS (LAT2) .cos (Δlong)

(LAT2) .sin (Δlong)

latm = ATAN2 (SIN (LAT1) + 죄 :

화학식

(LAT2) √ ((COS (LAT1) + Bx로) ² + By²))

lonm = lon1 + ATAN2 (저자, COS (LAT1) + Bx로)

목표 C이 화학식 내 구현 입니다.

- (CLLocationCoordinate2D) getMidPointCoords 
{ 
    double dLon = (self.toCoordinate.longitude - self.fromCoordinate.longitude) * (M_PI/180); 
    double Bx = cos(self.toCoordinate.latitude)*cos(dLon); 
    double By = cos(self.toCoordinate.latitude)*sin(dLon); 
    double latM = atan2(sin(self.fromCoordinate.latitude)+sin(self.toCoordinate.latitude), sqrt((cos(self.fromCoordinate.latitude)+Bx)*(cos(self.fromCoordinate.latitude)+Bx) + By*By)); 
    double lonM = self.fromCoordinate.longitude + atan2(By, cos(self.fromCoordinate.latitude) + Bx); 

    CLLocationCoordinate2D midPoint; 
    midPoint.latitude = latM; 
    midPoint.longitude = lonM; 
} 

분명히 잘못된 좌표를 반환하지만이 코드를 디버깅 할 때. 기본적으로 내 질문은 "내가 복식을 사용하고 있다는 사실 때문입니까?" 또는이 공식을 단순히 구현 한 것입니까?

사전에 도움이나 통찰력을 제공해 주셔서 감사합니다.

+0

그래서 어떤 변수가 잘못 계산 되었습니까? 결과를 계산기로 계산하고 단계별로 비교 했습니까? –

+0

ABS (lon1 - lon2)로 델타 계산을 시도하십시오 – Felix

답변

1

사용중인 삼각 함수 (sin, cos, atan2)는 매개 변수가 각도가 아닌 라디안이어야합니다. 이 라인에서 예를 들어

: self.toCoordinate.latitude이도에 있지만 cos 라디안을 필요로하기 때문에

double Bx = cos(self.toCoordinate.latitude)*cos(dLon); 

cos(self.toCoordinate.latitude)가 잘못된 것입니다.

삼각 함수를 호출하는 모든 곳에서 매개 변수를도 단위에서 라디안 단위로 변환합니다 (도에 (M_PI/180.0) 곱하기). 이 줄뿐만


:

double lonM = self.fromCoordinate.longitude + atan2(... 

self.fromCoordinate.longitude 또한 식의 나머지 라디안 또한 때문에 라디안으로 변환 될 필요.


마지막으로 latMlonM의 중간 점은 라디안 (도가 아님)입니다. midPoint.latitudemidPoint.longitude를 설정할 때

그래서, 당신은 (180.0/M_PI)에 의해을 곱하여 다시도까지 라디안에서 latMlonM을 변환해야합니다.

+0

아, 답장을 보내 주셔서 대단히 감사합니다. – Ian

+0

변환이 제대로 완료되면 제대로 작동합니다. 대단히 감사합니다. 앞으로는 수식을 구현하기 전에 좀 더 많은 연구를 할 것입니다. – Ian

관련 문제