如何求出下一点的经纬度? 已知 第一点的 经纬度 (lon1,lat1) 和航向(a 和正北方向的顺时针夹角) ,及和下一点的距离 S,如何求出下一点的经纬度呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 已知两点的经纬度,计算两点间距离的公式如下(感谢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 涉及的东西太多,建议你不要管了,用一些常用的Gis工具如果 mapx mo算算就行了 不行的呀。我这不只是应用于GIS上的呀。在其他方面也要用到呀。 potlee(一跑就停不下来的兔子) ,您好。什么语言写的无所谓。太谢谢您了。希望能找到。 以前做程序测量卫片中两点距离的一段代码,做的比较简单,没考虑地球的椭圆,(不过这实在影响不大),所以也就没有方向性了,经过验证误差不大,你可以参考一下。//---------------------------------------------------------------------------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; }}//--------------------------------------------------------------------------- Delphi 有没有代码折行的工具 如何把一个clientdataset中的几个字段的数据赋值给另一个Clientdataset啊? 大筆數據運算時的小問題~ 在线等待:为何每次执行ClientDataset的不同CommandText都返回同一结果!!! 如何自动关闭窗口 ?疑惑 ?SOS 怎么让combobox实现ie的地址栏!!!谢谢 Delphi的下一步是什么? 在TRichEdit中如何插入图片??? 给出日期,如何知道是这一年的第几周? 急~!如何动态设定TChart/TDbChart中Series的数据集? 使DELPHI的程序始终获得焦点:
其中A点经度,纬度分别为λA和ΦA,B点的经度、纬度分别为λB和ΦB,d为距离。详细请看:
http://www.gisforum.net/bbs/printpage.asp?BoardID=46&ID=44097
太谢谢您了。希望能找到。
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;
}
}
//---------------------------------------------------------------------------