24小时热门版块排行榜    

查看: 1374  |  回复: 19
【奖励】 本帖被评价5次,作者3s_studio增加金币 4.5
当前主题已经存档。

3s_studio

金虫 (小有名气)


[资源] 【分享】由经纬度坐标求距离的VB程序(附源代码)

经纬度坐标的地图中求距离的VB6.0程序,距离单位为M,利用大地正反算白塞尔公式编制而成。

下载:

程序及源代码下载

[ Last edited by 3s_studio on 2008-12-13 at 09:38 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cherishing

金虫 (著名写手)


★★★★★ 五星级,优秀推荐

谢谢共享,收藏!
2楼2008-06-24 09:53:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cherishing

金虫 (著名写手)


但是楼主是否测试程序?你的内容是否不全?里面怎么是空的??请解释一下好不?
3楼2008-06-24 09:59:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

3s_studio

金虫 (小有名气)


cherishing,不好意思,我看了,这个文件确实不正确。我已经修改完毕,测试可以用,请到http://www.sciencenet.cn/blog/user_content.aspx?id=30185免费下载,谢谢。

[ Last edited by 3s_studio on 2008-6-24 at 12:31 ]
4楼2008-06-24 10:50:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cherishing

金虫 (著名写手)


好的,已经下载,测试可用!谢谢楼主分享!
5楼2008-06-24 13:47:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

3s_studio

金虫 (小有名气)


呵呵,不用客气。谢谢大家关注!
6楼2008-06-24 20:57:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yangchunyan


★★★★★ 五星级,优秀推荐

谢谢
7楼2008-06-25 09:00:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

serena84


谢谢楼主哈
8楼2008-06-25 17:05:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

3s_studio

金虫 (小有名气)


光说不练,呵呵。
9楼2008-06-25 18:10:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

moonlight3988

木虫 (正式写手)


★★★ 三星级,支持鼓励

我有C#版的源码,谁需要?
10楼2008-06-25 22:59:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

3s_studio

金虫 (小有名气)


哦,发我一份吧,我也看看你的算法。
邮箱 zjwang2008@gmail.com
谢谢。
11楼2008-06-26 10:34:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

moonlight3988

木虫 (正式写手)


更详细源码请看http://bbs.i-location.org/thread-294-1-1.html

        ///
        /// 贝赛尔大地问题正解
        ///

        /// 已知点纬度
        /// 已知点经度
        /// 大地线长
        /// 大地方位角
        /// 待求点纬度
        /// 待求点经度
        /// 大地反方位角
        /// 参考椭球长半轴
        /// 参考椭球扁率倒数
        public static void Bessel_PntSA_Pnt(double B1, double L1, double S, double A1, out double B2, out double L2, out double A2, double a, double f)
        {
            double ee = (2 * f - 1) / f / f;       //第一偏心率的平方
            double ee2 = ee / (1 - ee);            //第二偏心率的平方

            double u1 = Math.Atan(Math.Sqrt(1 - ee) * Math.Tan(B1 * Math.PI / 180));
            double m = Math.Cos(u1) * Math.Sin(A1);
            m = Math.Atan(m / Math.Sqrt(1 - m * m));

            double M_ = Math.Atan(Math.Tan(u1) / Math.Cos(A1));
            if (M_ < 0) M_ += Math.PI;

            double KK = ee2 * Math.Pow(Math.Cos(m), 2);
            double alpha = Math.Sqrt(1 + ee2) * (1 - KK / 4 + 7 * KK * KK / 64 - 15 * Math.Pow(KK, 3) / 256) / a;
            double beta = KK / 4 - KK * KK / 8 + 37 * Math.Pow(KK, 3) / 512;
            double gama = KK * KK * (1 - KK) / 128;

            double sigma, temp;
            sigma = alpha * S;
            temp = 0;
            while (Math.Abs(temp - sigma) > 0.0000000001)
            {
                temp = sigma;
                sigma = alpha * S + beta * Math.Sin(sigma) * Math.Cos(2 * M_ + sigma) + gama * Math.Sin(2 * sigma) * Math.Cos(4 * M_ + 2 * sigma);
            }

            A2 = Math.Atan(Math.Tan(m) / Math.Cos(M_ + sigma));
            if (Math.Cos(M_) > 0) A2 += Math.PI;
            if (m < 0 && Math.Cos(M_) < 0) A2 += 2 * Math.PI;

            double u2 = Math.Atan(-Math.Cos(A2) * Math.Tan(M_ + sigma));

            double lamda1;
            lamda1 = Math.Atan(Math.Sin(u2) * Math.Tan(A2));
            if (Math.Cos(M_) < 0) lamda1 += Math.PI;
            if (m < 0 && Math.Cos(M_) > 0) lamda1 += 2 * Math.PI;

            double lamda2;
            lamda2 = Math.Atan(Math.Sin(u1) * Math.Tan(A1));
            if (m > 0)
            {
                if (Math.Cos(M_ + sigma) < 0)
                    lamda2 += Math.PI;
                else if (Math.Sin(M_ + sigma) < 0)
                    lamda2 += 2 * Math.PI;
            }
            else
            {
                if (Math.Cos(2 * Math.PI - M_ - sigma) < 0)
                    lamda2 += Math.PI;
                else if (Math.Sin(M_ + sigma) < 0)
                    lamda2 += 2 * Math.PI;
            }

            B2 = Math.Atan(Math.Sqrt(1 + ee2) * Math.Tan(u2)) * 180 / Math.PI;

            KK = ee * Math.Pow(Math.Cos(m), 2);
            alpha = ee / 2 + ee * ee / 8 + Math.Pow(ee, 3) / 16 - ee * (1 + ee) * KK / 16 + 3 * ee * KK * KK / 128;
            gama = ee * KK * KK / 256;

            L2 = lamda1 + lamda2 - Math.Sin(m) * (alpha * sigma + beta * Math.Sin(sigma) * Math.Cos(2 * M_ + sigma) + gama * Math.Sin(2 * sigma) * Math.Cos(4 * M_ + 2 * sigma));
            L2 = L1 + L2 * 180 / Math.PI;
        }

        ///
        /// 由两点大地坐标求解大地方位角
        ///

        /// 起点纬度
        /// 起点经度
        /// 末点纬度
        /// 末点经度
        /// 参考椭球长半轴
        /// 参考椭球扁率倒数
        /// 两点间的大地方位角
        public static double Bessel_BL_A(double B1, double L1, double B2, double L2, double a, double f)
        {
            if (L1 == L2) return 0;

            double ee = (2 * f - 1) / f / f;       //第一偏心率的平方

            double u1 = Math.Atan(Math.Sqrt(1 - ee) * Math.Tan(B1 * Math.PI / 180));
            double u2 = Math.Atan(Math.Sqrt(1 - ee) * Math.Tan(B2 * Math.PI / 180));
            double dL = (L2 - L1) * Math.PI / 180;

            double sigma = Math.Sin(u1) * Math.Sin(u2) + Math.Cos(u1) * Math.Cos(u2) * Math.Cos(dL);
            sigma = Math.Atan(Math.Sqrt(1 - sigma * sigma) / sigma);
            if (sigma <= 0) sigma += Math.PI;

            double m = Math.Cos(u1) * Math.Cos(u2) * Math.Sin(dL) / Math.Sin(sigma);
            m = Math.Atan(m / Math.Sqrt(1 - m * m));

            double KK = ee * Math.Pow(Math.Cos(m), 2);
            double alpha = ee / 2 + ee * ee / 8 + Math.Pow(ee, 3) / 16 - ee * (1 + ee) * KK / 16 + 3 * ee * KK * KK / 128;
            double lamda = dL + alpha * sigma * Math.Sin(m);

            sigma += Math.Sin(m) * (alpha * sigma * Math.Sin(m));

            m = Math.Cos(u1) * Math.Cos(u2) * Math.Sin(lamda) / Math.Sin(sigma);
            m = Math.Atan(m / Math.Sqrt(1 - m * m));

            double A = Math.Atan(Math.Sin(lamda) / (Math.Cos(u1) * Math.Tan(u2) - Math.Sin(u1) * Math.Cos(lamda)));
            if (A <= 0) A += Math.PI;
            if (m <= 0) A += Math.PI;

            double M_ = Math.Atan(Math.Sin(u1) * Math.Tan(A) / Math.Sin(m));
            if (M_ <= 0) M_ += Math.PI;

            KK = ee * Math.Pow(Math.Cos(m), 2);
            alpha = ee / 2 + ee * ee / 8 + Math.Pow(ee, 3) / 16 - ee * (1 + ee) * KK / 16 + 3 * ee * KK * KK / 128;
            double beta = ee * (1 + ee) * KK / 16 - ee * KK * KK / 32;
            lamda = dL + Math.Sin(m) * (alpha * sigma + beta * Math.Sin(sigma) * Math.Cos(2 * M_ + sigma));

            A = Math.Atan(Math.Sin(lamda) / (Math.Cos(u1) * Math.Tan(u2) - Math.Sin(u1) * Math.Cos(lamda)));
            if (A <= 0) A += Math.PI;
            if (m <= 0) A += Math.PI;

            return A * 180 / Math.PI;
        }

        ///
        /// 由大地坐标计算大地线长
        ///

        /// 起点纬度
        /// 起点经度
        /// 末点纬度
        /// 末点经度
        /// 参考椭球长半轴
        /// 参考椭球扁率倒数
        /// 两点间的大地线长
        public static double Bessel_BL_S(double B1, double L1, double B2, double L2, double a, double f)
        {
            if (L1 == L2) return Math.Abs(MeridianLength(B1, a, f) - MeridianLength(B2, a, f));

            double ee = (2 * f - 1) / f / f;       //第一偏心率的平方
            double ee2 = ee / (1 - ee);            //第二偏心率的平方

            double u1 = Math.Atan(Math.Sqrt(1 - ee) * Math.Tan(B1 * Math.PI / 180));
            double u2 = Math.Atan(Math.Sqrt(1 - ee) * Math.Tan(B2 * Math.PI / 180));
            double dL = (L2 - L1) * Math.PI / 180;

            double sigma = Math.Sin(u1) * Math.Sin(u2) + Math.Cos(u1) * Math.Cos(u2) * Math.Cos(dL);
            sigma = Math.Atan(Math.Sqrt(1 - sigma * sigma) / sigma);
            if (sigma <= 0) sigma += Math.PI;

            double m = Math.Cos(u1) * Math.Cos(u2) * Math.Sin(dL) / Math.Sin(sigma);
            m = Math.Atan(m / Math.Sqrt(1 - m * m));

            double KK = ee * Math.Pow(Math.Cos(m), 2);
            double alpha = ee / 2 + ee * ee / 8 + Math.Pow(ee, 3) / 16 - ee * (1 + ee) * KK / 16 + 3 * ee * KK * KK / 128;
            double lamda = dL + alpha * sigma * Math.Sin(m);

            sigma += Math.Sin(m) * (alpha * sigma * Math.Sin(m));

            m = Math.Cos(u1) * Math.Cos(u2) * Math.Sin(lamda) / Math.Sin(sigma);
            m = Math.Atan(m / Math.Sqrt(1 - m * m));

            double A = Math.Atan(Math.Sin(lamda) / (Math.Cos(u1) * Math.Tan(u2) - Math.Sin(u1) * Math.Cos(lamda)));
            if (A <= 0) A += Math.PI;
            if (m <= 0) A += Math.PI;

            double M_ = Math.Atan(Math.Sin(u1) * Math.Tan(A) / Math.Sin(m));
            if (M_ <= 0) M_ += Math.PI;

            KK = ee * Math.Pow(Math.Cos(m), 2);
            alpha = ee / 2 + ee * ee / 8 + Math.Pow(ee, 3) / 16 - ee * (1 + ee) * KK / 16 + 3 * ee * KK * KK / 128;
            double beta = ee * (1 + ee) * KK / 16 - ee * KK * KK / 32;

            lamda = dL + Math.Sin(m) * (alpha * sigma + beta * Math.Sin(sigma) * Math.Cos(2 * M_ + sigma));
            sigma = Math.Sin(u1) * Math.Sin(u2) + Math.Cos(u1) * Math.Cos(u2) * Math.Cos(lamda);
            sigma = Math.Atan(Math.Sqrt(1 - sigma * sigma) / sigma);
            if (sigma < 0) sigma += Math.PI;

            KK = ee2 * Math.Pow(Math.Cos(m), 2);
            alpha = Math.Sqrt(1 + ee2) / a * (1 - KK / 4 + 7 * KK * KK / 64 - 15 * Math.Pow(KK, 3) / 256);
            beta = KK / 4 - KK * KK / 8 + 37 * Math.Pow(KK, 3) / 512;
            double gama = KK * KK * (1 - KK) / 128;

            double S = (sigma - beta * Math.Sin(sigma) * Math.Cos(2 * M_ + sigma) - gama * Math.Sin(2 * gama) * Math.Cos(4 * M_ + 2 * sigma)) / alpha;

            return S;
        }

[ Last edited by moonlight3988 on 2008-7-29 at 21:06 ]
12楼2008-06-26 12:49:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

3s_studio

金虫 (小有名气)


非常感谢 moonlight3988  的共享,学习学习。
也是白塞尔公式啊

还要谢谢告诉我一个好论坛。

[ Last edited by 3s_studio on 2008-6-26 at 13:35 ]
13楼2008-06-26 13:31:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

moonlight3988

木虫 (正式写手)


不客气
共同学习
我这个算法来自郑州测绘学院的教材
14楼2008-06-29 16:22:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

云那边的山

木虫 (正式写手)


★★★★★ 五星级,优秀推荐

楼主好厉害呀
15楼2008-07-02 16:16:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ynbszhy

铜虫 (小有名气)


谢谢!有这工具可以方便地检查图幅质量了
16楼2008-07-07 17:47:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

3s_studio

金虫 (小有名气)


呵呵,谢谢大家的错爱,继续为3S朋友服务。
17楼2008-07-26 18:05:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zzh_my

铁虫 (小有名气)


动手很重要哦。只有你亲自做了之后,才能明白的透彻!!
19楼2008-09-13 21:06:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
简单回复
tanyujuan18楼
2008-08-04 07:37   回复  
谢谢分享!!
相关版块跳转 我要订阅楼主 3s_studio 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复(可上传附件)
信息提示
请填处理意见