回顾:项目中遇到的坐标转换与计算

这篇博客介绍了在SVG坐标系统中进行图形处理时的一些关键数学算法,包括两点间距离、角度计算、点到直线距离、垂直交点、线段交点判断、旋转坐标以及线段长度调整等。这些算法对于精确地操作SVG图形元素至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公式适用于svg,坐标原点在左上角

1. 两点之间距离计算

  • 勾股定理
function radius(a, b, c, d) { //(a,b)(c,d)
   	var row = Math.pow(a - c, 2)
    var col = Math.pow(b - d, 2)
    return Math.sqrt(row + col)
}

2. 两点之间角度计算

  • 三角函数 atan
function angle(a, b, c, d) {
	var diff_x = a - c;
    var diff_y = b - d;
    //返回角度,不是弧度
    return 360 * Math.atan(diff_y / diff_x) / (2 * Math.PI)
}

3. 点c到含有(a,b)两点的直线的距离

|A0x+B0y+C|/√(A²+B²)

function distance(a, b, c) {
     var k0 = (b.y - a.y) / (b.x - a.x) //1.求ab斜率
     var e = (b.y - k0 * b.x) //2.根据y=kx+e,已知k,求得e
     var fenmu = k0 * c.x - c.y + e  //3.公式的分母
     var fenzi = Math.pow(k0, 2) + 1 //4.公式的分子  y=kx+e  即A为K ,B为-1
     if (a.x == b.x) {//水平线
         return Math.abs(c.x - a.x)
     } else {
         return Math.abs(fenmu / Math.sqrt(fenzi))
     }
 }

4. 点c与含有(a,b)两点的直线的垂直交点

function point(a, b, c) {
    var k0 = (b.y - a.y) / (b.x - a.x)//1.求ab斜率
    var e = (b.y - k0 * b.x)//2.根据ab斜率,y=kx+e,求出e
    var k1 = -1 / k0 //3.垂直斜率相乘为-1,求出c点斜率
    var e1 = c.y - k1 * c.x //4.求出c点e
    var x = (e1 - e) / (k0 - k1) //5.交点y相同 k0x+e = k1x +e ,求出交点x 
    var y = k0 * x + e // 6.求出交点y
    if (a.x == b.x) { // 是否水平线
        return { x: a.x, y: c.y }
    } else if (a.y == b.y) { // 是否垂线
        return { x: c.x, y: a.y }
    } else {
        return { x: x, y: y }
    }
}

5. a,b两点所在线段与c,d两点所在线段的交点(前提条件:必相交[即只能有一条线斜率不存在],且c,d两点所在线段为垂线或水平线)

项目计算cd与ab交点,主要用于处理尾点在ab附近时吸附到ab上

function  line(a, b, c, d) {
    if (c.x == d.x) { //第二条线斜率不存在[垂直](即第一条斜率存在)
        var k0 = (b.y - a.y) / (b.x - a.x)
        var e = (b.y - k0 * b.x)
        return { x: c.x * 1, y: k0 * c.x + e }
    } else { //第二条线斜率存在[水平]
        if (a.x == b.x) { //第一条线斜率不存在
            return { x: a.x, y: c.y }
        } else { //第一条线斜率存在
            var k1 = (b.y - a.y) / (b.x - a.x)
            var e1 = (b.y - k1 * b.x)
            return { x: (c.y - e1) / k1, y: c.y }
        }
    }
}

6. a,b两点所在线段与c,d两点所在线段是否相交(即非平行)

  • 项目中绘制垂线|水平线时,判断是否相交,是否需要 计算交点
function isIntersect(a, b, c, d) {
    if ((a.x == b.x) && (c.x == d.x)) { //斜率不存在时
        return false;
    }
    var firstK = (a.y - b.y) / (a.x - b.x)
    var lastK = (c.y - d.y) / (c.x - d.x)
    if (firstK == lastK) { //斜率存在时
        return false;
    } else {
        return true;
    }
}

7.尾点围绕起点,旋转后angleGet度后,求尾点坐标。

  • 特殊化求解
    在这里插入图片描述
    假设angleGet不为90度。A为起点,B为尾点,绕A旋转到C
    1.已知 AB,求AB距离,AB等于AC
    2.已知角度,可得正切,既而得正割.
    3.根据正割和AC,可以得出AD
    4.根据正切和AC可得出DC
    6.C的横坐标为 A的横坐标+AD,纵坐标为A的纵坐标+DC(在svg里坐标原点在左上角)
    7.当起点在尾点的右侧时,则减
function changeDirection(angleGet) {
    var start = { x: $('line').eq($('line').length - 1).attr('x1'), y: $('line').eq($('line').length - 1).attr('y1') }
    var stop = { x: $('line').eq($('line').length - 1).attr('x2'), y: $('line').eq($('line').length - 1).attr('y2') }
    var row1 = Math.pow(stop.x - start.x, 2)
    var col1 = Math.pow(stop.y - start.y, 2)
    var c = Math.sqrt(row1 + col1) //两点长
    if (Number(angleGet) != 90) { //tan90不存在
        var d1 = Math.tan(angleGet * (2 * Math.PI / 360))// angleGet对应的弧度 求得正切值
        var d = Math.pow(d1, 2) + 1
        var e = Math.sqrt(d)// 正切的平方+1 = 正割的平方 ,求得正割 = 邻边/斜边
        var f = c / e  
        var g = Number(start.x) + Number(f)
        var l = Number(start.x) - Number(f)
        var h = Number(start.y) + Number(d1 * f)
        var i = Number(start.y) - Number(d1 * f)
        if (Number(start.x) <= Number(stop.x)) {//尾点在起点左边
            return { x: g, y: h }
        } else if (Number(start.x) > Number(stop.x)) {//尾点在起点右边
            return { x: l, y: i }
        }
    } else {
        if (Number(start.x) <= Number(stop.x)) {
            return { x: start.x, y: Number(start.y) + Number(c) }
        } else if (Number(start.x) > Number(stop.x)) {
            return { x: start.x, y: Number(start.y) - Number(c) }
        }
    }
}

8.已知起点和尾点,改变线段长度后,求尾点坐标

在这里插入图片描述
假如AB不为垂线的话,A为起点,B为尾点,延迟AB长度后,B变为C点,求C坐标
1.求AB斜率,斜率即正切,既而得到正割
2.已知AC距离,根据正割,得到C点相对A的横坐标
3.根据正切,和C点相对A的横坐标,得到C点相对A的纵坐标
4.起点在尾点左边,则加,右边则减
最后,考虑AB为垂线的情况

function changeLong(longGet) {
   	 var start = { x: $('line').eq($('line').length - 1).attr('x1'), y: $('line').eq($('line').length - 1).attr('y1') }
     var stop = { x: $('line').eq($('line').length - 1).attr('x2'), y: $('line').eq($('line').length - 1).attr('y2') }
     var k = (stop.y - start.y) / (stop.x - start.x)  //1.求斜率
     var e = Math.pow(k, 2) + 1  //2.斜率即是正切,根据公式得到正割
     var c = Math.sqrt(e)
     var f = longGet / c  3.根据正割得到邻边长度
     var g = Number(start.x) + Number(f)
     var l = Number(start.x) - Number(f)
     var h = Number(start.y) + Number(k * f)
     var i = Number(start.y) - Number(k * f)
     if (Number(stop.x) != Number(start.x)) {
         if (Number(start.x) < Number(stop.x)) {
             return { x: g, y: h }
         } else if (Number(start.x) > Number(stop.x)) {
             return { x: l, y: i }
         }
     } else {
         return { x: start.x, y: Number(start.y) + Number(longGet) }
     }
 }
<think>嗯,用户想找关于地理信息系统中经纬度坐标转换的数学公式。首先,我需要回顾一下相关的知识,并确保自己理解正确。根据提供的引用内容,有三个参考资料提到了坐标转换的不同方面,比如大地坐标经纬度的转换、UTM分带方法以及雷达极坐标系经纬度的转换。 首先,用户的问题明确提到了经纬度转换的数学公式,可能涉及不同坐标系之间的转换,比如大地坐标(三维椭球模型)到经纬度(二维地理坐标),或者UTM投影转换,或者雷达极坐标(AER)到经纬度(GEO)的转换。需要根据引用内容中的信息来提取相应的公式。 引用1提到大地坐标包含经度、纬度和高度,转换为经纬度可能涉及到椭球模型的计算,比如使用地心坐标系或投影方法。引用2介绍了UTM分带,3°和6°分带,这可能涉及到高斯-克吕格投影或UTM投影的公式。引用3是关于雷达极坐标(方位角、俯仰角、距离)经纬度的转换,这可能涉及球面三角学或坐标旋转。 接下来,我需要整理这些转换的基本公式。例如,大地坐标系到经纬度的转换通常使用椭球参数,如WGS84椭球的长半轴a和短半轴b,然后通过一定的公式计算。UTM投影则涉及将经纬度转换为平面坐标,需要分带计算中央经线,并应用投影公式。而雷达坐标转换可能需要将极坐标转换为直角坐标,再结合雷达站的位置转换为经纬度。 需要注意的是,用户可能需要具体的数学步骤,而不仅仅是概念。因此,我应该详细列出每个转换的关键公式,例如三维直角坐标系大地坐标的转换,UTM投影的公式,以及雷达极坐标转换的步骤。 另外,用户提到的地理信息系统(GIS)中常用的转换可能包括WGS84到UTM,或者不同椭球体之间的转换,如从克拉索夫斯基椭球到WGS84,这涉及到七参数或三参数转换模型。不过引用中没有提到七参数,所以可能需要根据现有引用内容来回答,或者简要提及。 需要检查引用中的项目地址是否有具体公式,但用户没有提供详细内容,只能根据描述推断。例如,引用3提到雷达极坐标系(方位角、俯仰角、距离)转换为经纬度,可能需要使用球坐标到直角坐标的转换,然后结合雷达站的地理位置进行坐标旋转和平移。 总结一下,回答的结构应该包括: 1. 三维大地坐标系经纬度高度转换的公式,可能涉及地心坐标系XYZ到经纬度高度的转换。 2. UTM投影的公式,分带计算和平面坐标转换。 3. 雷达极坐标到经纬度的转换步骤,涉及直角坐标系的转换和地理坐标的转换。 4. 可能提到不同椭球体之间的参数转换,如参考引用1中的内容。 需要确保每个公式用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,并正确引用来源。例如,引用1的大地坐标转换,引用2的UTM分带,引用3的雷达坐标转换。 可能遇到的问题是如何将极坐标转换为经纬度,是否需要考虑地球曲率、高程等因素。在雷达的情况下,可能需要假设地球为球体或椭球,进行精确计算。 最后,生成相关问题,可能涉及这些公式的应用、分带计算的方法、不同坐标系的优缺点等。</think>### 地理信息系统中经纬度坐标转换公式 #### 1. 三维大地坐标系经纬度高度转换 大地坐标系(如WGS84)使用椭球模型,将三维直角坐标系$(X,Y,Z)$转换为经度$\lambda$、纬度$\varphi$和高程$h$的公式如下[^1]: $$ \begin{aligned} \lambda &= \arctan\left(\frac{Y}{X}\right) \\ \varphi &= \arctan\left(\frac{Z + e^2 \cdot \nu \cdot \sin\varphi}{\sqrt{X^2 + Y^2}}\right) \quad (\text{需迭代求解}) \\ h &= \frac{\sqrt{X^2 + Y^2}}{\cos\varphi} - \nu \end{aligned} $$ 其中: - $e^2$为椭球第一偏心率平方 - $\nu = \frac{a}{\sqrt{1 - e^2 \sin^2\varphi}}$为卯酉圈曲率半径 - $a$为椭球长半轴 #### 2. UTM投影公式(6°分带) UTM将经纬度$(\lambda, \varphi)$转换为平面坐标$(E,N)$[^2]: $$ \begin{aligned} E &= k_0 \cdot \nu \cdot \left[ A + \frac{(1 - t + C)A^3}{6} + \frac{(5 - 18t + t^2)A^5}{120} \right] + 500000 \\ N &= k_0 \cdot \left[ M + \nu \tan\varphi \cdot \left( \frac{A^2}{2} + \frac{(5 - t + 9C + 4C^2)A^4}{24} \right) \right] \end{aligned} $$ 式中: - $k_0=0.9996$为比例因子 - $t = \tan^2\varphi$ - $C = e'^2 \cos^2\varphi$($e'$为第二偏心率) - $M$为子午线弧长 - 中央经线$\lambda_0 = 6n - 183$($n$为带号) #### 3. 雷达极坐标转经纬度公式 对于雷达的方位角$\alpha$、俯仰角$\epsilon$和距离$r$[^3]: $$ \begin{aligned} x &= r \cos\epsilon \sin\alpha \\ y &= r \cos\epsilon \cos\alpha \\ z &= r \sin\epsilon \end{aligned} $$ 再通过坐标系旋转和平移,结合雷达站经纬度$(\lambda_0, \varphi_0)$,转换为目标点经纬度: $$ \lambda = \lambda_0 + \arctan\left(\frac{y}{R + h}\right) \\ \varphi = \varphi_0 + \arctan\left(\frac{z}{\sqrt{x^2 + (R + h - y)^2}}\right) $$ 其中$R$为地球半径,$h$为高程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值