已知 第一点的 经纬度 (lon1,lat1) 和航向(a  和正北方向的顺时针夹角) ,及和下一点的距离 S,如何求出下一点的经纬度呢?

解决方案 »

  1.   

    已知两点的经纬度,计算两点间距离的公式如下(感谢dshueusa提供):d=111.12cos{1/[sinΦAsinΦB十 cosΦAcosΦBcos(λB—λA)]}
    其中A点经度,纬度分别为λA和ΦA,B点的经度、纬度分别为λB和ΦB,d为距离。详细请看:
    http://www.gisforum.net/bbs/printpage.asp?BoardID=46&ID=44097
      

  2.   

    涉及的东西太多,建议你不要管了,用一些常用的Gis工具如果 mapx mo算算就行了
      

  3.   

    不行的呀。我这不只是应用于GIS上的呀。在其他方面也要用到呀。
      

  4.   

    potlee(一跑就停不下来的兔子) ,您好。什么语言写的无所谓。
    太谢谢您了。希望能找到。
      

  5.   

    以前做程序测量卫片中两点距离的一段代码,做的比较简单,没考虑地球的椭圆,(不过这实在影响不大),所以也就没有方向性了,经过验证误差不大,你可以参考一下。//---------------------------------------------------------------------------void __fastcall TForm1::Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    X = long(X);
    Y = long(Y);
    iXt=X;
    iYt=Y;
    AnsiString n_lon_str;
    AnsiString n_lat_str;
    AnsiString fname1;
    AnsiString fname = ExpandFileName(Form1->OpenDialog1->FileName);
    if (DrawEnable)
            {
             MouseDraw = true;
             MouseLeftDown = true;
             DrawOrg_x = X;
             DrawOrg_y = Y;
            } if (InfoFileExist == 1)     //显示当前点的经纬度
            {
              d = sqrt(X*X + (Image_h - Y)*(Image_h - Y));
              double d1 = d * 6.6 /6378000;       // d的弧度          double b = asin(cos(3.1415926*82/180) / cos(3.1415926*s_lat/180));
              double b2 = asin(X / d);
              double b3 = b2 - b;
              double a1 = atan(tan(d1)*cos(b3));
              at_lat = s_lat + a1*180/3.1415926;     //北
              double a2 = asin(sin(d1)*sin(b3));
              double L1 = (90 - s_lat)*3.1415926/180 + a1;
              double A1 = atan(tan(a2)/sin(L1));
              at_lon = s_lon + A1*180/3.1415926;          Label6->Caption = "经纬度:"+FloatToStr(at_lon).SubString(1,8)+"/"+
                                         FloatToStr(at_lat).SubString(1,7);
            }
     if (dingwei == true)         //定位模式
            {
             // InfoFileExist = 0;   //先关闭当前点经纬度的显示,后恢复
              n_lon_str = InputBox("数据输入","请输入当前点经度          ","");
              n_lat_str = InputBox("数据输入","请输入当前点纬度          ","");          if ((n_lon_str!="")&&(n_lat_str!=""))
              {
                  n_lon = StrToFloat(n_lon_str);
                  n_lat = StrToFloat(n_lat_str);
                  //起始点的经纬度
                   d = sqrt(X*X + (Image_h - Y)*(Image_h - Y));
                  double d1 = d * 6.6 /6378000;       // d的弧度
                  double b = asin(cos(3.1415926*82/180) / cos(3.1415926*s_lat/180));
                  double  b2 = asin(X / d);
                  double  b3 = b2 - b;
                  double  a1 = atan(tan(d1)*cos(b3));
                  s_lat = n_lat - a1*180/3.1415926;     //南
                  double  a2 = asin(sin(d1)*sin(b3));
                  double  L1 = (90 - s_lat)*3.1415926/180 + a1;
                  double  A1 = atan(tan(a2)/sin(L1));
                  s_lon = n_lon + A1*180/3.1415926;            /*  angle = atan2((Image_h - Y),X) - 8 * 3.1415926/180;
                  d_x = fabs(d * sin(angle));
                  d_y = fabs(d * cos(angle));
                  s_lon = (d_x / 6378000)*180/3.1415926 + n_lon;
                  s_lat = (d_y / 6378000)*180/3.1415926 + n_lat;   */              //结束点的经纬度
                   d = sqrt((Image_w-X)*(Image_w-X) + Y*Y);
                   d1 = d * 6.6 /6378000;       // d的弧度
                   b2 = asin(X / d);
                   b3 = b2 - b;
                   a1 = atan(tan(d1)*cos(b3));
                   e_lat = n_lat + a1*180/3.1415926;     //北
                   a2 = asin(sin(d1)*sin(b3));
                   L1 = (90 - s_lat)*3.1415926/180 + a1;
                   A1 = atan(tan(a2)/sin(L1));
                   e_lon = n_lon + A1*180/3.1415926;           /*   angle = atan2(Y,(Image_w-X)) - 8 * 3.1415926/180;
                  d_x = fabs(d * sin(angle));
                  d_y = fabs(d * cos(angle));
                  e_lon = (d_x / 6378000)*180/3.1415926 + n_lon;
                  e_lat = (d_y / 6378000)*180/3.1415926 + n_lat;   */              at_lon = n_lon;
                  at_lat = n_lat;
                //  InfoFileExist = 1;
                  FormInfo->Visible = true;
                  FormInfo->Edit5->Text = FloatToStr(s_lon).SubString(1,7);
                  FormInfo->Edit6->Text = FloatToStr(s_lat).SubString(1,6);
                  FormInfo->Edit7->Text = FloatToStr(e_lon).SubString(1,7);
                  FormInfo->Edit8->Text = FloatToStr(e_lat).SubString(1,6);
                  FormInfo->Edit9->Text = FloatToStr(n_lon);
                  FormInfo->Edit10->Text = FloatToStr(n_lat);
                  FormInfo->Memo1->Text = "";
                  fname1=fname.SetLength(fname.Length()-3) + "txt";
                  FormInfo->Edit11->Text = fname1;
                }
              dingwei = false;
             }
    }
    //---------------------------------------------------------------------------