兩個點已知一個點的方向,判斷另一個點在這個的方位(左前/右後)

使用條件:已知兩個點的經緯度,以及一個點(這個點爲主點,另一個點爲副點)的方向(是一個在原始座標系上的角度),該方向是由定位自動獲取的;

備註:原始座標系:以正北爲y軸正方向, 其中經度爲x軸,緯度爲y軸

   主點座標系:以主點的方向爲y軸正方向,其中以主點的方向所在的直線爲y軸,過主點且與y軸垂直的直線爲x軸,

第一步:求出副點在原始座標系上的方向,

//根據兩個點的經緯度,以一個點(userLocationCoordinate)爲座標中心,y軸正方向爲正北方向(即爲 0°),求出另一個點(rodeLocationCoordinate)關於正北方向的角度(0° ~ 360°)
- (double)judgeAngle:(CLLocationCoordinate2D)userLocationCoordinate andRoadInfoCoordinate:(CLLocationCoordinate2D)rodeLocationCoordinate {
    double a = rodeLocationCoordinate.longitude - userLocationCoordinate.longitude;  //經度差
    double b = rodeLocationCoordinate.latitude - userLocationCoordinate.latitude;    //緯度差
    double c = hypot(fabs(a), fabs(b));
    double cosy = 0.0;
    double angle = 0;
    
    if (a > 0 && b > 0) {                  // 判斷road點在user點的東北位置
        cosy = b / c;
        angle = 0;
    }else if (a == 0 && b > 0) {           //在正北位置
        angle = -90;
    }else if (a > 0 && b < 0) {            // 判斷road點在user點的東南位置
        cosy = a / c;
        angle = 90;
    }else if (a > 0 && b == 0) {           //在正東位置
        angle = 90;
    }else if (a < 0 && b < 0) {            // 判斷road點在user點的西南位置
        cosy = fabs(b) / c;
        angle = 180;
    }else if (a == 0 && b < 0) {           //在正南位置
        angle = 90;
    }else if (a < 0 && b > 0) {            // 判斷road點在user點的西北位置
        cosy = fabs(a) / c;
        angle = 270;
    }else if (a < 0 && b == 0) {           //在正西位置
        angle = 180;
    }
    
    double m = acos(cosy);
    //n 即以正北爲 0 的總角度
    double n = ( m / M_PI ) * 180 + angle;
    
    return n;
}

第二步:先將副點的座標系從原始座標系轉換到主點座標系。下面代碼中返回值即是相應的方位

原理:從兩個點在原始座標系的方向(角度)來判斷,當副點的原方向小於主點的原方向時,副點在主點座標系上的方向爲 “副點原方向 + 360° - 主點原方向”;當副點的原方向小於主點的原方向時,副點在主點座標系的方向爲 “副點原方向 - 主點原方向”,以此來求出副點主方向,當副點主方向大於0小於90時,副點在主點的右前方,當副點主方向等於90時,副點在主點的正右方,以此類推,這樣就能判斷出副點在主點的方位了

備註:副點原方向:第一步中求出的 副點在原始座標系中的方向;

  主點原方向:已知條件中的主點基於原始座標系的方向;

  副點主座標:副點基於主點座標系中的方向;

//根據兩個點經緯度和主點(userLocationCoordinate)的角度,判斷出另一個點(rodeLocationCoordinate)在主點的方位
- (int)judgeDirection:(CLLocationCoordinate2D)userLocationCoordinate andRoadInfo:(CLLocationCoordinate2D)rodeLocationCoordinate andUserAngle:(double)userAngle{
    double roadAngle = [self judgeAngle:userLocationCoordinate andRoadInfoCoordinate:rodeLocationCoordinate];
    double angleGap = roadAngle - userAngle;
    
    int direction = 0;
    
    if (angleGap < 0) {
        angleGap = roadAngle + 360 - userAngle;
    }else {
        angleGap = roadAngle - userAngle;
    }
    
    if (angleGap > 0 && angleGap < 90) {                  // road點在user點的右前方
        direction = 1;
    }else if(angleGap == 90){                             // road點在user點的正右方
        direction = 2;
    }else if (angleGap > 90 && angleGap < 180) {          // road點在user點的右後方
        direction = 3;
    }else if(angleGap == 180){                            // road點在user點的正後方
        direction = 4;
    }else if (angleGap > 180 && angleGap < 270) {         // road點在user點的左後方
        direction = 5;
    }else if(angleGap == 270){                            // road點在user點的正左方
        direction = 6;
    }else if (angleGap > 270 && angleGap < 360) {         // road點在user點的左前方
        direction = 7;
    }else if(angleGap == 0){                              // road點在user點的正前方
        direction = 0;
    }
    return direction;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章