用来计算经纬度距离的
2009-05-13 12:09:17来源:未知 阅读 ()
下面以54坐标系为例,介绍具体的计算方法。
完成经纬度BL到平面直角坐标XY的换算。在EXCEL中,选择输入公式的起始单元格,例如:第2行第1列(A2格)为起始单元格,各单元格的格式如下:
单元格;单元格内容;说明
A2;输入中央子午线,以度.分秒形式输入,如115度30分则输入115.30;起算数据L0
B2;=INT(A2)+(INT(A2*100)-INT(A2)*100)/60+(A2*10000-INT(A2*100)*100)/3600;把L0化成度
C2;以度小数形式输入纬度值,如38°14′20″则输入38.1420;起算数据B
D2;以度小数形式输入经度值;起算数据L
E2;=INT(C2)+(INT(C2*100)-INT(C2)*100)/60+(C2*10000-INT(C2*100)*100)/3600;把B化成度
F2;=INT(D2)+(INT(D2*100)-INT(D2)*100)/60+(D2*10000-INT(D2*100)*100)/3600;把L化成度
G2;=F2-B2;L-L0
H2;=G2/57.2957795130823;化作弧度
I2;=TAN(RADIANS(E2));Tan(B)
J2;=COS(RADIANS(E2));COS(B)
K2;=0.006738525415*J2*J2
L2;=I2*I2
M2;=1+K2
N2;=6399698.9018/SQRT(M2)
O2;=H2*H2*J2*J2
P2;=I2*J2
Q2;=P2*P2
R2;=(32005.78006+Q2*(133.92133+Q2*0.7031))
S2;=6367558.49686*E2/57.29577951308-P2*J2*R2+((((L2-58)*L2+61)*
O2/30+(4*K2+5)*M2-L2)*O2/12+1)*N2*I2*O2/2
计算结果X
T2;=((((L2-18)*L2-(58*L2-14)*K2+5)*O2/20+M2-L2)*O2/6+1)*N2*(H2*J2)
计算结果Y
按上面表格中的公式输入到相应单元格后,就可方便地由经纬度求得平面直角坐标。当输入完所有的经纬度后,用鼠标下拉即可得到所有的计算结果。
经纬度算距离的算法两个:
设地球上某点的经度为lambda,纬度为phi,
则这点的空间坐标是
x=cos(phi)*cos(lambda)
y=cos(phi)*sin(lambda)
z=sin(phi)
设地球上两点的空间坐标分别为(x1,y1,z1),(x2,y2,z2)
则它们的夹角为
A=acos(x1*x2+y1*y2+z1*z2),A是角度
则两地距离为
A/180*pi*R,其中R为地球平均半径6371
误差不超过1%
CREATE OR REPLACE FUNCTION Get_Distance(
bw1 IN NUMBER, dj1 IN NUMBER,
bw2 IN NUMBER, dj2 IN NUMBER) RETURN NUMBER
AS
n_size NUMBER;
BEGIN
SELECT 3.1415926 * (12756/2) / 180 * ACOS( SIN(bw1)*SIN(bw2) + COS(bw1)*COS(bw2)*COS(dj1-dj2)) INTO n_size
FROM dual;
RETURN n_size;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 0;
END;
/
private const double EARTH_RADIUS = 6378.137;
private static double rad(double d)
{
return d * Math.PI / 180.0;
}
public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +
Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
s = s * EARTH_RADIUS;
s = Math.Round(s * 10000) / 10000;
return s;
}据说是google maps的代码
//----------------------改成 php 代码的 样子-------------
function rad($d)
{
return $d * pi() / 180.0;
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 用来从stdin和stdout读数据的汇编代码,在FREEBSD下通过。 2009-05-13
- FreeBSD连载(74):安全问题 2009-05-13
- FreeBSD连载(65):SMB/CIFS协议 2009-05-13
- FreeBSD连载(23):配置系统时间 2009-05-13
- 32位、64位的区别 2009-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash