LISP写的高斯投影正反算及七参数投影变换相关程序

这个是用LISP写的高斯投影正反算及七参数投影变换的相关程序。
主要功能:
1、内置54、80、84、2000椭球基本参数
2、上述椭球的标准高斯正反算;
3、上述椭球上具有高程抵偿面的任意带高斯投影正反算;
4、7参数投影变换;
5、上述椭球的大地坐标和空间直角坐标的转换;

辅助功能:
1、D.MMSS格式的度分秒和弧度的互相转换;
2、54、80、84、2000椭球的基本参数及计算常用参数的获取;

利用这些可以做的其他事情:
1、GPS测得的WGS84坐标和地方坐标的转换;
2、换带计算;
3、经过组合,可以实现不同坐标系、不同坐标形式的自动转换。

程序下载z.kklt_cotr.rar:


程序需要在AUTOCAD下运行,运行说明如下:
;**************************************************
;;DUTOHU
;将D.MMSS格式的角度转换为弧度
;用法:
;(dutohu du)

;**************************************************
;;HUTODU
;将弧度计的角度转换为D.MMSS格式的角度
;用法:
;(hutodu hu)

;**************************************************
;;GPP
;获取椭球基本参数,与位置无关
;用法:
;gpp (gn gp)
;gn为椭球名称,可接受54、80、84、2000
;gp为待获取的参数,可接受a、b、e、e1
;如:
;(gpp 54 a)
;意为取54椭球长半轴a的值

;**************************************************
;;GPF
;获取椭球的辅助参数,与位置有关
;gn椭球名
;gp待获取的参数
;gb点的大地纬度B
;gl点的大地经度L
;gu点的单位格式,1为度.分秒;2为十进制度;3为弧度

;gp选择
;w
;v
;dn
;n卯酉圈曲率半径
;r平均曲率半径

;**************************************************
;;BLHTOXYZ
;将大地坐标转为空间直角坐标
;旋转角单位为弧度
;输入大地坐标B、L、H
;用法为:
;(blhtoxyz gn blhb blhl blhh)
;gn可选54、80、84、2000
;输出空间直角坐标,分别为xyzx,xyzy,xyzz,全局变量

;**************************************************
;;XYZTOBLH
;将空间直角坐标转为大地坐标
;输入空间直角坐标
;用法为:
;(xyztoblh gn xyzx xyzy xyzz)
;输出大地坐标B、L、H,分别为BLHB、BLHL、BLHH,全局变量,以弧度计

;**************************************************
;;BURSA
;空间直角坐标七参数转换
;用法为:
;(bursa tx ty tz wx wy wz m gn1x gn1y gn1z)
;tx、ty、tz为三个平移参数,单位为米
;wx、wy、wz为三个旋转参数,单位为弧度
;m为尺度比差异,如0.000004,单位为1,不是ppm
;输出gn2x、gn2y、gn2z为转换后的空间直角坐标,外部变量

;**************************************************
;;BLTOXY
;高斯正算
;子午线弧长lb、xyx、xyy为外部变量,其余为内部变量
;单位均为弧度
;用法为:
;(bltoxy gn gl0 blb bll)
;gn可选54、80、84、2000
;gl0为中央经度
;输入blb、bll为大地经纬度
;输出xyx、xyy为高斯正算后的坐标,全局变量

;**************************************************
;;XYTOBL
;高斯反算
;底点纬度bf、blb、bll为外部变量,其余为内部变量
;单位均为弧度
;用法为:
;(xytobl gn gl0 xyx xyy)
;gn可选54、80、84、2000
;gl0为中央经度
;输入xyx、xyy为平面坐标
;输出blb、bll为高斯反算后的大地经纬度,全局变量,以弧度计

;**************************************************
;;DFBLTOXY
;具有高程抵偿面的任意带高斯投影的高斯正算
;用法为:
;(dfbltoxy gn b0 l0 dx dy m blb bll)
;gn可选54、80、84、2000
;b0为中央纬度
;l0为中央经度
;dx为X加常数
;dy为Y加常数
;m为尺度比
;输入blb、bll为待解算的大地经纬度
;输出xyx、xyy为高斯正算后的坐标,全局变量

;**************************************************
;;DFXYTOBL
;具有高程抵偿面的任意带高斯投影的高斯反算
;用法为:
;(dfxytobl gn b0 l0 dx dy m xyx xyy)
;gn可选54、80、84、2000
;b0为中央纬度
;l0为中央经度
;dx为X加常数
;dy为Y加常数
;m为尺度比
;输入xyx、xyy为平面坐标
;输出xyx、xyy为高斯反算后的大地经纬度,全局变量,以弧度计

2012.04.25修改
1、外围程序小小更新了下:
有个试用了的朋友提醒以前的弧和度互转程序有些小BUG。
经查,因为CAD取位问题,在某些看似整数的时候会出错。
dutohu和hutodu函数已经修正了,我把这两个函数单独打包了,函数名分别改为dutohu1和hutodu1。

程序下载duhu.rar:下载文件 duhu.rar


2、关于程序的补充说明:
    函数选用:用国家3度带或6度带投影的,这个是带常数的高斯投影,Y加了500000的,有两种方式计算:一是用xytobl函数,但是Y需要减去500000;二是用dfxytobl函数,b0取0,l0输中央子午线,dx取0,dy取500000,m取1。
    
    关于代码:程序发上来也几年了,一直有朋友想要代码,我觉得没这必要,能用就行了,代码可以自己搞懂了自己写,虽然这程序原理上不算复杂,毕竟是自己幸苦码出来的,请理解。想探讨技术问题的可以留言或邮件。
    几位留言说计算有问题的朋友,问题并不是在程序上,在于对坐标系统,特别是独立坐标系,以及高斯正反算的理解上有误。恕我直言,这些坐标系的理解没到,就是拿到程序了也没用处。





[本日志由 z.kklt 于 2012-04-25 03:24 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 17 | 引用: 0 | 查看次数: -
回复回复awd373[2013-04-27 12:36 AM | del]
学习了。谢谢~
回复回复z.kklt[2013-04-26 10:19 AM | del]
引用来自 awd373 引用来自 awd373
么么嗒~~ 计算出结果啦~ 可是精度不够啊,我想要129.00844286     度想要 129度29分01.46393秒  咋办啊。54 和84 转换的结果都是129.008  


文章和我的回复已经说得很清楚了,如果你真的认真看完,绝对不会有问题的。真不是上纲上线,研究坐标转换的精神可嘉,但是没静下心来,学习方法有问题。

自己看,不解释:
命令: (xytobl 54 (dutohu 129) 4751957.53 39508.37)
2.25992

命令: (rtos (hutodu blb) 2 10)
"42.5404840961"

命令: (rtos (hutodu bll) 2 10)
"129.2901463933"
回复回复awd373[2013-04-26 09:10 AM | del]
么么嗒~~ 计算出结果啦~ 可是精度不够啊,我想要129.00844286     度想要 129度29分01.46393秒  咋办啊。54 和84 转换的结果都是129.008  
回复回复z.kklt[2013-04-22 10:20 AM | del]
引用来自 awd373 引用来自 awd373
北京54坐标  4751957.53 539508.37  转换成 54 大地坐标blh  怎么用 给一个实例  我使用后结果路唇不对马嘴(xyztoblh 54  4751957.53 539508.37  0)(xytobl 54  4751957.53 539508.37 )   想要的正确结果为 b: 42 54 04.84096  L; 129 29 01.46393


1、高斯反算需要知道中央子午线或者有3度带或者6度带的带号反算中央子午线;
2、没仔细看文章,函数用错,XYZTOBLH是空间直角坐标和大地坐标的转换。高斯反算函数为XYTOBL或者DFXYTOBL。
3、函数以前写的,这样也用习惯了,懒得改了,用的时候自己定义一组变量再赋值就是了。
回复回复awd373[2013-04-21 12:06 AM | del]
另外输出 一个返回值是不是更好些,因为想用您写的程序很担心变量值被覆盖或不对应 运算错误,而不敢重复使用。

如 (xyztoblh gn xyzx xyzy xyzz) 直接返回值 为(b l h),别人用的时候(setq  aa  (xyztoblh gn xyzx xyzy xyzz))

这样就取出 结果 而不担心什么了,希望得到解答。gcl1989@163.com
回复回复awd373[2013-04-21 11:58 AM | del]
北京54坐标  4751957.53 539508.37  转换成 54 大地坐标blh  怎么用 给一个实例  我使用后结果路唇不对马嘴(xyztoblh 54  4751957.53 539508.37  0)(xytobl 54  4751957.53 539508.37 )   想要的正确结果为 b: 42 54 04.84096  L; 129 29 01.46393
回复回复z.kklt[2012-11-04 11:00 PM | del]
引用来自 能否能否牛奶房内蒙 引用来自 能否能否牛奶房内蒙
楼主也是测量的?有空交流以下 大角度7参数转换的问题?  QQ:2223895562

大角度7参数转换如果参数已知,转换没什么特别的;若是大角度7参数求参,相关期刊有很多类似的文章有介绍,这个偏理论点了,我研究得少,而且平时接触的不外乎北京54、西安80、WGS84和本地的地方坐标系这些,旋转角度都很小,没太大动力研究。
回复回复能否能否牛奶房内蒙[2012-11-03 03:45 PM | del]
楼主也是测量的?有空交流以下 大角度7参数转换的问题?  QQ:2223895562
回复回复z.kklt[2012-04-25 03:27 PM | del]
引用来自 lougof 引用来自 lougof
非常感谢博主,非常羡慕,汽车,数码产品,无人机,旅游,写代码,还做测绘?。哇哇,都是俺的主业啊,可惜俺只是菜鸟。运行这个程序如(xytobl 54 1.88496 2734163.8819 398807.8335)返回(hutodu blb)24.3936    (hutodu bll)111.562,是不对的。应为24.42.30,107.0000。请指教,不尽感激。          能否赐予lisp源码。邮箱598468976@qq.com不尽感激


用国家3度带或6度带投影的,这个是带常数的高斯投影,Y加了500000的,有两种方式计算:一是用xytobl函数,但是Y需要减去500000;二是用dfxytobl函数,b0取0,l0输中央子午线,dx取0,dy取500000,m取1。
具体你这个,应该这样用(xytobl 54 1.88496 273163.8819 (- 398807.8335 500000)),注意后面用更新了的弧到度的转换程序(hutodu1 blb) 24.423,(hutodu1 bll) 107.0
回复回复lougof[2012-04-18 10:05 PM | del]
非常感谢博主,非常羡慕,汽车,数码产品,无人机,旅游,写代码,还做测绘?。哇哇,都是俺的主业啊,可惜俺只是菜鸟。运行这个程序如(xytobl 54 1.88496 2734163.8819 398807.8335)返回(hutodu blb)24.3936    (hutodu bll)111.562,是不对的。应为24.42.30,107.0000。请指教,不尽感激。          能否赐予lisp源码。邮箱598468976@qq.com不尽感激
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.