搜索
bottom↓
回复: 88

已知两经纬度测距离解决了,发帖庆祝下。呵呵。。(附测试图和程序)

[复制链接]

出0入0汤圆

发表于 2010-6-26 11:04:23 | 显示全部楼层 |阅读模式
直接上图.


程序在DEV-C++ 5上的运行结果 (原文件名:运行结果.png)


在Google earth上的运行结果 (原文件名:google earth测试结果.png)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2010-6-26 11:04:54 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>


double D_jw(double wd1,double jd1,double wd2,double jd2)
{
    double x,y,out;
    double PI=3.14159265;
    double R=6.371229*1e6;

    x=(jd2-jd1)*PI*R*cos( ((wd1+wd2)/2) *PI/180)/180;
    y=(wd2-wd1)*PI*R/180;
    out=hypot(x,y);
    return out;
}
//度分秒格式转度格式函数
float dfm_chang_du(unsigned char GPS_Degree,unsigned char GPS_Point,float GPS_Second)
{
        float data=GPS_Second/60;
        data=data+GPS_Point;
        data=data/60;
        data=data+GPS_Degree;
        return data;
}
main()
{
     
    float x1=dfm_chang_du(38,54,27.35);
    float y1=dfm_chang_du(77,00,50.68);
    float x2=dfm_chang_du(38,54,27.37);
        float y2=dfm_chang_du(77,00,46.12);
        double adc=D_jw(x1,y1,x2,y2);
    printf("%f\n",adc);

   
printf("\r\n");
system("pause");

}

出0入0汤圆

 楼主| 发表于 2010-6-26 11:06:24 | 显示全部楼层
计算距离的函数是网上找到,测试结果还是很满意的。
找个很多计算的代码,就这个测试通过。呵呵。

出0入0汤圆

 楼主| 发表于 2010-6-26 11:08:09 | 显示全部楼层
不同半球的情况下,只需把某个半球定为负就行,我这就没处理了。

出0入0汤圆

发表于 2010-6-26 11:50:37 | 显示全部楼层
距离远一点测试一下

出0入0汤圆

 楼主| 发表于 2010-6-26 13:28:50 | 显示全部楼层
测试过,还行大概跟Google earth有千分之一误差。
高纬度(80度)以上误差就大的多了。

出0入18汤圆

发表于 2010-6-26 16:23:01 | 显示全部楼层
祝贺!!!

出0入0汤圆

发表于 2010-6-26 16:31:06 | 显示全部楼层
收藏备用,哈哈

出0入0汤圆

发表于 2010-6-26 16:43:27 | 显示全部楼层
你的程序是否具有通用性,不妨用赤道上相距30度,60度,90度120度180度的几个点来验算一下,就知道公式有没有错.再试试同经度,不同纬度的几点.

出0入0汤圆

发表于 2010-6-26 18:45:17 | 显示全部楼层
好东西.

出0入0汤圆

发表于 2010-6-26 20:58:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-26 22:45:39 | 显示全部楼层
LZ是将地球处理成了一个标准的球体,应该用高斯投影来处理比较精确

出0入0汤圆

发表于 2010-6-27 00:00:22 | 显示全部楼层
好东西.

出0入0汤圆

发表于 2010-8-13 18:54:44 | 显示全部楼层
标记之

出0入0汤圆

发表于 2010-8-13 20:43:34 | 显示全部楼层
只要在中国好用就够了。或者在江苏好用就行,呵呵。

出0入0汤圆

发表于 2010-8-13 21:10:06 | 显示全部楼层
GPS经纬度测距离,不错!

出0入0汤圆

发表于 2010-8-13 21:56:12 | 显示全部楼层
记下备用

出0入0汤圆

发表于 2010-8-13 23:11:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-14 10:05:30 | 显示全部楼层
mark.以后会用到吧~~
头像被屏蔽

出0入0汤圆

发表于 2010-8-14 10:47:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入42汤圆

发表于 2010-8-14 11:23:32 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-8-14 20:42:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-14 20:44:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-14 21:09:00 | 显示全部楼层
收藏

出0入0汤圆

发表于 2010-8-14 22:45:19 | 显示全部楼层
回复【5楼】ha002  
测试过,还行大概跟google&#160;earth有千分之一误差。
高纬度(80度)以上误差就大的多了。
-----------------------------------------------------------------------
这个公式,从原理上计算两地点距离较近时误差会小些,如果所跨的经纬度较大,误差就比较大了!


我的误差分析(假设地球是圆的):
计算时,将维度上的距离计为y,经度为x
1、计算y时,求夹角的圆弧,误差稳定
2、计算x时,以两点重点的切圆为标准,计算经度夹角的弧度,这个误差变化很大。所跨的经度越大,误差越大
3、计算距离,用了三角求斜边函数hypot,假定为直线,实际上是弧线,同样,所跨的距离越大,误差越大

出0入0汤圆

发表于 2010-8-15 00:24:16 | 显示全部楼层
不错!

出0入0汤圆

发表于 2010-8-15 16:46:14 | 显示全部楼层
不错,收藏

出0入0汤圆

发表于 2010-8-16 14:16:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-18 15:38:31 | 显示全部楼层
楼主,你加我Q1468751722告别空手白狼的日子

出0入0汤圆

发表于 2010-8-21 21:27:46 | 显示全部楼层
12楼所说正确,下面是经纬度转平面坐标的计算公式,我发布在另外一个帖子中,拷贝过来:


//
// WGS84椭球
//
//a = 6378137.0000000000;
//b = 6356752.3142;
//c = 6399593.6258;
//_a = 1.0 / 298.257223563;
//e2 = 0.0066943799013;
//e2 = (a * a - b * b) / (a * a);
//e_2 = 0.00673949674227;
//e_2 = (a * a - b * b) / (b * b);
#define v0 (6.36744914585577e+006)
#define v1 (6.39959362580000e+006)
#define v2 (-2.15650202422767e+004)
#define v3 (1.09003037983916e+002)
#define v4 (-6.12188017458933e-001)
#define v5 (-3.21444799442298e+004)
#define v6 (1.35366946123277e+002)
#define v7 (-7.09481085293974e-001)
#define v8 (4.06137292124076e-003)
#define v9 (-4.16666666666667e-002)
#define v10 (2.50000000000000e-001)
#define v11 (2.52731128372009e-003)
#define v12 (7.57013608867423e-006)
#define v13 (1.38888888888889e-003)
#define v14 (-8.33333333333333e-002)
#define v15 (1.66666666666667e-001)
#define v16 (-1.66666666666667e-001)
#define v17 (3.33333333333333e-001)
#define v18 (1.12324945943115e-003)
#define v19 (8.33333333333333e-003)
#define v20 (-1.66666666666667e-001)
#define v21 (1.96742576567650e-001)
#define v22 (4.04369805395214e-003)
#define PI (3.1415926535898)


//
// 克拉索夫斯基椭球
//
//a = 6378245.0000000000;
//b = 6356863.0187730473;
//c = 6399698.9017827110; // c = a * a / b;
//_a = 1.0 / 298.3; // "阿尔法", _a = (a - b) / a;
//e2 = 0.006693421622966; // "e的平方", e2 = (a * a - b * b) / (a * a);
//e_2 = 0.006738525414683; // "e撇的平方", e_2 = (a * a - b * b) / (b * b);
//#define v0 (6.36755849693382e+006)
//#define v1 (6.39969890178271e+006)
//#define v2 (-2.15622668479908e+004)
//#define v3 (1.08973412365022e+002)
//#define v4 (-6.11933423955361e-001)
//#define v5 (-3.21404048488872e+004)
//#define v6 (1.35330282065412e+002)
//#define v7 (-7.09186712693043e-001)
//#define v8 (4.05909878989504e-003)
//#define v9 (-4.16666666666667e-002)
//#define v10 (2.50000000000000e-001)
//#define v11 (2.52694703050613e-003)
//#define v12 (7.56795412738812e-006)
//#define v13 (1.38888888888889e-003)
//#define v14 (-8.33333333333333e-002)
//#define v15 (1.66666666666667e-001)
//#define v16 (-1.66666666666667e-001)
//#define v17 (3.33333333333333e-001)
//#define v18 (1.12308756911383e-003)
//#define v19 (8.33333333333333e-003)
//#define v20 (-1.66666666666667e-001)
//#define v21 (1.96743046049570e-001)
//#define v22 (4.04311524880980e-003)
//#define PI (3.1415926535898)




//
// 1975年国际椭球
//
//a = 6378140.0000000000;
//b = 6356755.2881575287;
//c = 6399596.6519880105;
//_a = 1.0 / 298.257;
//e2 = 0.006694384999588;
//e_2 = 0.006739501819473;
//#define v0 (6.36745213284732e+006)
//#define v1 (6.39959665198801e+006)
//#define v2 (-2.15650466399833e+004)
//#define v3 (1.09003253300390e+002)
//#define v4 (-6.12189686622048e-001)
//#define v5 (-3.21445191406919e+004)
//#define v6 (1.35367212855273e+002)
//#define v7 (-7.09483016172281e-001)
//#define v8 (4.06138704580734e-003)
//#define v9 (-4.16666666666667e-002)
//#define v10 (2.50000000000000e-001)
//#define v11 (2.52731318230238e-003)
//#define v12 (7.57014746244665e-006)
//#define v13 (1.38888888888889e-003)
//#define v14 (-8.33333333333333e-002)
//#define v15 (1.66666666666667e-001)
//#define v16 (-1.66666666666667e-001)
//#define v17 (3.33333333333333e-001)
//#define v18 (1.12325030324550e-003)
//#define v19 (8.33333333333333e-003)
//#define v20 (-1.66666666666667e-001)
//#define v21 (1.96742574120588e-001)
//#define v22 (4.04370109168380e-003)




//
// "大地坐标 --> 高斯平面坐标" 转换算法
//
// B = 输入纬度(单位度), L = 输入经度(单位度), x = 输出横坐标(单位米), y = 输出纵坐标(单位米)
//
void calculation(float B, float L, float *x, float *y)
{
float l, l2, N, w0, w1, w2, w3, w4, cosb, cosb2;

l = L - ((int)L / 6 * 6 + 3); // 求经差

B = B * PI / 180.0; // 转弧度
l = l * PI / 180.0; // 转弧度
l2 = l * l;

cosb = cos(B);
cosb2 = cosb * cosb;

N =  v1 +  (v2  + (v3  + v4  * cosb2) * cosb2) * cosb2;
w0 = v5 +  (v6  + (v7  + v8  * cosb2) * cosb2) * cosb2;
w1 = v9 +  (v10 + (v11 + v12 * cosb2) * cosb2) * cosb2;
w2 = v13 + (v14 + v15 * cosb2) * cosb2;
w3 = v16 + (v17 + v18 * cosb2) * cosb2;
w4 = v19 + (v20 + (v21 + v22 * cosb2) * cosb2) * cosb2;

*y = v0 * B + (w0 + (0.5 + (w1 + w2 * l2) * l2) * l2 * N) * cosb * sin(B);
*x = (1.0 + (w3 + w4 * l2) * l2) * l * N * cosb;

*x += 500000.0;
}

计算精度:float, 最大误差 < 1米。double, 最大误差 < 1毫米。

出0入0汤圆

发表于 2010-8-21 22:05:02 | 显示全部楼层
回复【12楼】myjnj
lz是将地球处理成了一个标准的球体,应该用高斯投影来处理比较精确
-----------------------------------------------------------------------

回复【30楼】hendry
-----------------------------------------------------------------------

专业~

记得ACM哪次比赛里有这么个题~

出0入0汤圆

发表于 2010-8-21 22:17:21 | 显示全部楼层
我是直接用google里的计算公式。arccos。arctan之类的
测试了一下,无论2000km还是2km误差都能保证。

出0入0汤圆

发表于 2010-8-22 09:06:06 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-8-28 15:19:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-6 22:03:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-6 22:19:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-7 09:20:06 | 显示全部楼层
会用得上~

出0入0汤圆

发表于 2010-10-15 16:56:45 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-10-15 17:00:58 | 显示全部楼层
mark 下

出0入0汤圆

发表于 2010-10-15 17:29:11 | 显示全部楼层
地球是一个三轴椭球体,LZ需要考虑球体的不规则性。
应该用地理坐标系加以修正,比如WGS-84

出0入0汤圆

发表于 2010-10-20 13:57:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-16 12:57:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-16 12:59:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-16 13:09:19 | 显示全部楼层
GPS测距,mark

出0入0汤圆

发表于 2011-3-17 04:19:43 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-3-17 09:00:28 | 显示全部楼层
我这个计算公式得出的结果误差也很小。 参数中的经纬度都已经换算成度了。

// 返回两个点的距离,单位为Km 。
double GetDistance( POINT_t pt1 , POINT_t pt2 )
{
        double m1,n1,m2,n2 , aa ;
        double f1 ;
       
        m1 = pt1.jd * PI / 180.0 ;
        n1 = pt1.wd * PI / 180.0 ;
        m2 = pt2.jd * PI / 180.0 ;
        n2 = pt2.wd * PI / 180.0 ;
       
        aa = sin( n1 ) * sin( n2 ) + cos(n1 )*cos(n2) * cos( m1 - m2 ) ;
        if( aa > 1.0)
                aa = 1.0 ;
        f1 = EARTH_RADIUS * acos(aa) ;
        return f1 ;
}

出0入0汤圆

发表于 2011-4-28 10:42:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-28 11:41:30 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-28 12:18:55 | 显示全部楼层
考虑地球曲率、表面高程了么。

出0入0汤圆

发表于 2011-4-28 12:30:58 | 显示全部楼层
留着,不过让8位单片机算这个的确太累了啊!

出0入0汤圆

发表于 2011-4-28 12:35:56 | 显示全部楼层
学习了!

经纬度转平面坐标的计算.

出0入0汤圆

发表于 2011-4-28 12:37:31 | 显示全部楼层

出0入0汤圆

发表于 2011-4-28 16:29:37 | 显示全部楼层
浮点数。。。

出0入0汤圆

发表于 2011-4-30 16:04:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-30 20:04:19 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-30 20:32:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-30 21:19:00 | 显示全部楼层
mark~

出0入0汤圆

 楼主| 发表于 2011-8-6 19:00:54 | 显示全部楼层
哇塞,时间过得好快,帖子都发了1年多了。好久没上ouravr了。换工作后公司不能上网,房东的鸟网速慢的连QQ都不停的掉线。
楼上的同行们可安好?

出0入0汤圆

发表于 2011-8-6 20:00:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-7 22:11:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-15 09:04:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-15 09:13:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-15 10:10:43 | 显示全部楼层
mark~

出0入0汤圆

发表于 2011-11-28 10:04:14 | 显示全部楼层
试试用DSP计算的,不过估计也够呛。

出0入0汤圆

发表于 2011-11-28 11:26:29 | 显示全部楼层
回复【47楼】guo69  
-----------------------------------------------------------------------

学习~~

出0入0汤圆

发表于 2011-11-28 22:16:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-28 23:18:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-28 23:22:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-29 08:51:49 | 显示全部楼层
mark

出0入476汤圆

发表于 2011-11-29 09:29:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-29 09:32:19 | 显示全部楼层
好东西.

出0入0汤圆

发表于 2011-11-29 09:46:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-29 16:45:19 | 显示全部楼层
收藏了,以后留用

出0入0汤圆

发表于 2012-2-4 12:31:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-4 13:32:47 | 显示全部楼层
Mark!

出0入0汤圆

发表于 2012-2-6 11:13:33 | 显示全部楼层
支持一下,呵呵

出0入0汤圆

发表于 2012-2-6 13:57:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-7 10:25:58 | 显示全部楼层
学习中。。。

出0入0汤圆

发表于 2012-2-7 10:52:36 | 显示全部楼层
支持支持

出0入0汤圆

发表于 2012-2-7 13:35:47 | 显示全部楼层
这个帖子是要标记以下的

出0入0汤圆

发表于 2012-2-7 21:33:38 | 显示全部楼层
mark,估计有机会用到

出0入0汤圆

发表于 2015-1-19 14:23:21 | 显示全部楼层
看看,正在搞这个

出0入0汤圆

发表于 2015-1-19 18:30:48 | 显示全部楼层
应该先将经纬度转换为高斯平面坐标,再计算距离

出0入0汤圆

发表于 2015-1-19 19:40:52 | 显示全部楼层
收藏一下。

出0入0汤圆

发表于 2016-10-7 15:27:59 | 显示全部楼层
测距离的好方法
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 20:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表