明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1623|回复: 9

高斯投影正反算

  [复制链接]
发表于 2020-8-20 11:00:22 | 显示全部楼层 |阅读模式
本帖最后由 hothua2020 于 2020-9-6 15:28 编辑

  1. ;;;功能:投影换带
  2. ;;作者:HUA
  3. ;;;创建日期:2020-8-18
  4. ;;;最后编辑日期:2020-8-20
  5. ;;;
  6. ;;;秒转度分秒 s->dd.mmss
  7. (defun Second2Dms(second / sign degree miniute second  dms)
  8.   (setq   sign (< second 0)
  9.       second (/ (abs second) 3600.0)
  10.       degree (fix second)
  11.       second (* (- second degree) 60.0)
  12.       miniute (fix second)
  13.       second (* (- second miniute) 60.0)
  14.       dms (+ degree (/ miniute 100.0) (/ second 10000.0))
  15.   )
  16.   (if sign (setq dms (- 0 dms)))
  17.   dms
  18. )
  19. ;;;
  20. ;;;角度转弧度 dd.mmss->rad
  21. (defun Dms2Rad(dms / sign degree miniute second rad)
  22.   (setq  sign  (<  dms 0)
  23.          dms  (abs dms)
  24.        degree (fix dms)
  25.        dms (* (- dms degree) 100)
  26.        miniute (fix dms)
  27.        second (* (- dms miniute) 100)   
  28.        rad (/ (* (+ degree (/ miniute 60.0) (/ second 3600.0)) PI) 180.0)
  29.   )
  30.   (if sign (setq rad  (- 0 rad)))
  31.   rad
  32. )
  33. ;;;
  34. ;;;弧度转角度 rad->dd.mmss
  35. (defun Rad2Dms(rad / sign degree miniute second dms)
  36.   (setq   sign (< rad 0)
  37.           rad (abs rad)
  38.       rad (/ (* rad 180.0) PI)
  39.       degree (fix rad)
  40.       rad (* (- rad degree) 60.0)
  41.       miniute (fix rad)
  42.       second (* (- rad miniute) 60.0)
  43.       dms (+ degree (/ miniute 100.0) (/ second 10000.0))
  44.   )
  45.   (if sign (setq dms (- 0 dms)))
  46.   dms
  47. )
  48. ;;;
  49. ;;;十进制角度转弧度 dd->rad
  50. (defun Degree2Rad(degree / sign rad)
  51.   (setq  sign  (<  degree 0)
  52.          degree   (abs degree )      
  53.        rad (/ (* degree  PI) 180.0)
  54.   )
  55.   (if sign (setq rad  (- 0 rad)))
  56.   rad
  57. )
  58. ;;;
  59. ;;;弧度转十进制角度 rad->dd
  60. (defun Rad2Degree(rad / sign degree)
  61.   (setq  sign  (<  rad 0)
  62.          rad (abs rad)
  63.          degree (/ (* rad 180.0) PI)
  64.   )
  65.   (if sign (setq degree  (- 0 degree)))
  66.   degree
  67. )
  68. ;;;
  69. ;;;54坐标系参数
  70. (defun PrjPoint_Krasovsky( / a f e2 e12 A1 A2 A3 A4 A5 A6 A7 tf )
  71.   (setq  a 6378245.0
  72.       f 298.3
  73.       tf (/ (- f 1) f)
  74.       e2  (- 1 (* tf tf))
  75.       tf (/ f (- f 1))
  76.       e12 (- (* tf tf) 1)
  77.       A1 6367558.4968749800000000
  78.       A2  -16036.4802694116000000
  79.       A3  16.8280668841393000
  80.       A4  -0.0219753089548841
  81.       A5 0.0000311310026601
  82.       A6 -0.0000000459827472
  83.       A7 0.0000000000679857      
  84.   )
  85.   (list a f e2 e12 A1 A2 A3 A4 A5 A6 A7)  
  86. )
  87. ;;;
  88. ;;;80坐标系参数
  89. (defun PrjPoint_IUGG1975(/ a f e2 e12 A1 A2 A3 A4 A5 A6 A7 tf)
  90.   (setq  a    6378140.0
  91.       f    298.257
  92.       tf (/ (- f 1) f)
  93.       e2  (- 1 (* tf tf))
  94.       tf (/ f (- f 1))
  95.       e12 (- (* tf tf) 1)
  96.       A1    6367452.1327884300000000
  97.       A2    -16038.5282286966000000
  98.       A3    16.8326464353061000
  99.       A4    -0.0219844636486152
  100.       A5    0.0000311484690908
  101.       A6    -0.0000000460151868
  102.       A7    0.0000000000680433      
  103.   )
  104.   (list a f e2 e12 A1 A2 A3 A4 A5 A6 A7)  
  105. )
  106. ;;;
  107. ;;;2000坐标系参数
  108. (defun PrjPoint_2000(/ a f e2 e12 A1 A2 A3 A4 A5 A6 A7 tf)
  109.   (setq  a    6378137.0
  110.       f    298.257222101
  111.       tf (/ (- f 1) f)
  112.       e2  (- 1 (* tf tf))
  113.       tf (/ f (- f 1))
  114.       e12 (- (* tf tf) 1)
  115.       A1    6367449.1457710400000000
  116.       A2    -16038.5087415914000000
  117.       A3    16.8326134276660000
  118.       A4    -0.0219844041401628
  119.       A5    0.0000311483615430
  120.       A6    -0.0000000460149936
  121.       A7    0.0000000000680429      
  122.   )
  123.    (list a f e2 e12 A1 A2 A3 A4 A5 A6 A7)  
  124. )
  125. ;;;
  126. ;;;BL转cadx,cady
  127. ;;;输入参数
  128. ;;;B,L为点位纬度和经度,单位为弧度
  129. ;;;L0为中央经线,单位为弧度
  130. ;;;prjType取值为0:北京54坐标系,1:西安80坐标系,2:CGCS2000坐标系
  131. ;;;输出CAD坐标x,y
  132. (defun PrjPoint:BL2xy(B L L0 prjType / a f e2 e12 A1 A2 A3 A4 A5 A6 A7 X N tanB tanB2 m m2 ng2 sinB cosB cadx cady)   
  133.     (cond
  134.     ((= 0 prjType) (mapcar 'set (list 'a 'f 'e2 'e12 'A1 'A2 'A3 'A4 'A5 'A6 'A7) (PrjPoint_Krasovsky)))
  135.     ((= 1 prjType) (mapcar 'set (list 'a 'f 'e2 'e12 'A1 'A2 'A3 'A4 'A5 'A6 'A7) (PrjPoint_IUGG1975)))
  136.     ((= 2 prjType) (mapcar 'set (list 'a 'f 'e2 'e12 'A1 'A2 'A3 'A4 'A5 'A6 'A7) (PrjPoint_2000)))
  137.     (T (alert "未知prjType参数值")(exit))
  138.   )
  139.   (setq  X       (+ (* A1 B) (* A2 (sin (* 2 B))) (*  A3 (sin (* 4 B))) (* A4 (sin (* 6 B))) (* A5  (sin (* 8 B))) (* A6 (sin (* 10 B))) (* A7 (sin (* 12 B))))
  140.       sinB   (sin B)  cosB   (cos B) tanB   (/ (sin B) (cos B))   tanB2   (* tanB tanB)
  141.       N      (/ a (sqrt (- 1 (* e2 sinB sinB))))
  142.       m      (* cosB (- L L0))  m2 (* m m)
  143.       ng2      (/ (* cosB cosB e2) (- 1 e2))
  144.       cady    (+ X (* N tanB (* (+ 0.5 (* (+ (/ (+ (- 5 tanB2) (* 9 ng2) (* 4 ng2 ng2)) 24.0) (/ (* (+ (- 61 (* 58 tanB2)) (* tanB2 tanB2)) m2) 72.0)) m2)) m2)))
  145.       cadx    (+ 500000 (* N m  (+ 1 (* m2 (+ (/ (+ (- 1 tanB2) ng2) 6.0) (/ (* m2 (-  (+ 5 (* tanB2 tanB2) (* 14 ng2)) (* 18 tanB2) (* 58 ng2 tanB2))) 120.0))))))   
  146.   )
  147.   (list cadx cady)  
  148. )
  149. ;;;
  150. ;;;cadx,cady转BL
  151. ;;;输入参数
  152. ;;;;pt为点位cad点坐标,
  153. ;;;L0为中央经线,单位为弧度
  154. ;;;prjType取值为0:北京54坐标系,1:西安80坐标系,2:CGCS2000坐标系
  155. ;;;输出经纬度B,L表,单位为dd.mmss
  156. (defun PrjPoint:xy2BL(pt L0 prjType / a f e2 e12 A1 A2 A3 A4 A5 A6 A7 sinB cosB tanB tanB2 N ng2 V yN preB0 B0 eta x y )
  157.   (cond
  158.     ((= 0 prjType) (mapcar 'set (list 'a 'f 'e2 'e12 'A1 'A2 'A3 'A4 'A5 'A6 'A7) (PrjPoint_Krasovsky)))
  159.     ((= 1 prjType) (mapcar 'set (list 'a 'f 'e2 'e12 'A1 'A2 'A3 'A4 'A5 'A6 'A7) (PrjPoint_IUGG1975)))
  160.     ((= 2 prjType) (mapcar 'set (list 'a 'f 'e2 'e12 'A1 'A2 'A3 'A4 'A5 'A6 'A7) (PrjPoint_2000)))
  161.     (T (alert "未知prjType参数值")(exit))
  162.   )
  163.   (setq   x    (cadr pt)
  164.       y    (- (car pt) 500000)
  165.       B0   (/ x A1)
  166.       eta  1
  167.   )  
  168.   (while (> eta  0.000000000048)
  169.     (setq  preB0  B0
  170.         B0   (/ (- x (+ (* A2 (sin (* 2 B0))) (* A3 (sin (* 4 B0))) (* A4 (sin (* 6 B0))) (* A5 (sin (* 8 B0))) (* A6 (sin (* 10 B0))) (* A7 (sin (* 12 B0))))) A1)
  171.         eta (abs (- B0 preB0))
  172.     )  
  173.   )  
  174.   (setq   sinB  (sin B0)
  175.       cosB   (cos B0)
  176.       tanB    (/ (sin B0) (cos B0))
  177.       tanB2   (* tanB tanB)
  178.       N      (/ a (sqrt (- 1 (* e2 sinB sinB))))
  179.       ng2      (/ (* cosB cosB e2) (- 1 e2))
  180.       V    (sqrt (+ 1 ng2))
  181.       yN    (/ y N)   
  182.       B    (- B0 (* (+ (- (* yN yN) (/ (* (- (+ 5 (* 3 tanB2) ng2) (* 9 ng2 tanB2)) yN yN yN yN) 12.0)) (/ (* (+ 61 (* 90 tanB2) (* 45 tanB2 tanB2)) yN yN yN yN yN yN) 360.0)) V V tanB 0.5))      
  183.       L    (+ L0 (/ (+ (- yN (/ (* (+ 1 (* 2 tanB2) ng2) yN yN yN) 6.0 )) (/ (* (+ 5 (* 28 tanB2) (* 24 tanB2 tanB2) (* 6 ng2) (* 8 ng2 tanB2)) yN yN yN yN yN) 120.0)) cosB))   
  184.   )
  185.   (list (Rad2Dms B) (Rad2Dms L))
  186. )

评分

参与人数 4明经币 +4 金钱 +30 收起 理由
树櫴希德 + 1 + 30 很给力!
yuanziyou + 1 帅呆了
yshf + 1 赞一个!
tigcat + 1 很给力!

查看全部评分

发表于 2020-8-21 10:02:07 | 显示全部楼层
这个做什么用的啊。
发表于 2020-8-21 17:15:28 | 显示全部楼层
请问:能否给出A1~A7的计算公式?
发表于 2020-8-23 09:24:34 | 显示全部楼层
牛!!!学习,收藏了!
 楼主| 发表于 2020-8-24 08:19:27 | 显示全部楼层
yshf 发表于 2020-8-21 17:15
请问:能否给出A1~A7的计算公式?

; //A1-A7计算公式
        ; //e4 = pow(e2, 2); // e2 * e2; e6 = pow(e2, 3); //e4 * e2; e8 = pow(e2, 4); //e6 * e2;e10 = pow(e2, 5); //e8 * e2;e_12 = pow(e2, 6); //e10 * e2;
    ; //A1 = a*(1-e2)*(1 + 3 * e2 / 4 + 45 * e4 / 64 + 175 * e6 / 256 + 11025 * e8 / 16384 + 43659 * e10 / 65536 + 693693 * e_12 / 1048576);
    ; //A2 = a*(1-e2)*(3 * e2 / 8 + 15 * e4 / 32 + 525 * e6 / 1024 + 2205 * e8 / 4096 + 72765 * e10 / 131072 + 297297 * e_12 / 524288);
    ; //A3 = a*(1-e2)*(15 * e4 / 256 + 105 * e6 / 1024 + 2205 * e8 / 16384 + 10395 * e10 / 65536 + 1486485 * e_12 / 8388608);
    ; //A4 = a*(1-e2)*(35 * e6 / 3072 + 105 * e8 / 4096 + 10395 * e10 / 262144 + 55055 * e_12 / 1048576);
    ; //A5 = a*(1-e2)*(315 * e8 / 131072 + 3465 * e10 / 524288 + 99099 * e_12 / 8388608);
    ; //A6 = a*(1-e2)*(693 * e10 / 1310720 + 9009 * e_12 / 5242880);
    ; //A7 = a*(1-e2)*(1001 * e_12 / 8388608);
发表于 2020-8-24 14:32:38 | 显示全部楼层
谢谢hothua2020提供的计算式
发表于 2020-8-29 11:44:54 | 显示全部楼层
哈哈哈,这个世界太小了,我认识楼主
发表于 2021-6-21 09:39:28 | 显示全部楼层
用笑脸软件COORD核算过 果然不差
发表于 2022-5-26 16:45:56 | 显示全部楼层
没搞懂怎么用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-28 23:09 , Processed in 0.193811 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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