Java 从经度和纬度的X Y距离

Java 从经度和纬度的X Y距离,java,android,geospatial,latitude-longitude,geo,Java,Android,Geospatial,Latitude Longitude,Geo,我有两组经度和纬度,我拼命想弄清楚A点在水平和垂直方向上偏离B点有多少米 我的目标是+/-X和+/-Y值-我已经通过Location获得了两点之间的最短距离。distanceBetween()…我想我可以将其与Location.bearingTo()结合使用,通过基本三角学找到我想要的值 我的想法是,我可以使用方位角作为角度A,90度作为角度C和侧面C的长度(DistanceBeween)来计算侧面A(x轴)和B(y轴)的长度,但结果不令人满意,至少可以说lol //CA

我有两组经度和纬度,我拼命想弄清楚A点在水平和垂直方向上偏离B点有多少米

我的目标是+/-X和+/-Y值-我已经通过Location获得了两点之间的最短距离。distanceBetween()…我想我可以将其与Location.bearingTo()结合使用,通过基本三角学找到我想要的值

我的想法是,我可以使用方位角作为角度A,90度作为角度C和侧面C的长度(DistanceBeween)来计算侧面A(x轴)和B(y轴)的长度,但结果不令人满意,至少可以说lol

            //CALCULATE ANGLES  
                        double ANGLE_A;
                        ANGLE_A = current_Bearing;                      //Location.bearingTo()
                        ANGLE_A = ANGLE_A*Math.PI/180;                      //CONVERT DEGREES TO RADIANS
                        
                        double ANGLE_C;
                        ANGLE_C = 90;                           // Always Right Angle
                        ANGLE_C = ANGLE_C*Math.PI/180;                      //CONVERT DEGREES TO RADIANS
                        
                         double ANGLE_B;
                        ANGLE_B = 180 - ANGLE_A - ANGLE_C;                  // 3 sides of triangle must add up to 180, if 2 sides known 3rd can be calced
                        ANGLE_B = ANGLE_B*Math.PI/180;                      //CONVERT DEGREES TO RADIANS
            
            //CALCULATE DISTANCES
                        double SIDE_C = calculatedDistance;                 //Location.distanceTo()
                        double SIDE_A = Math.sin(ANGLE_A) * SIDE_C /Math.sin(ANGLE_C);  
                        double SIDE_B = Math.sin(ANGLE_B)*SIDE_C/Math.sin(ANGLE_C);
我注意到的是,无论我们如何移动,我的方位在两点之间变化很小,尽管我在10-100m距离处测试这个,它总是在64.xxxxxxx,只有最后几位小数真正变化

我能找到的所有在线参考文献都是关于计算最短路径的,尽管这篇文章引用了x和y的位置,但最终还是将它们再次组合成了最短距离


如果有任何指向正确方向的指示,我们将不胜感激

如果满足以下条件,则可以使用

  • 这些点的位置远离极地地区和陆地
  • 距离足够短(和地球的半径相比)
  • 方法很简单。只要固定经度或纬度,只改变另一个。然后计算距离

    Location location1 = new Location("");
    Location location2 = new Location("");
    
    location1.setLatitude(37.4184359437);
    location1.setLongitude(-122.088038921);
    location2.setLatitude(37.3800232707);
    location2.setLongitude(-122.073230422);
    
    float[] distance = new float[3];
    Location.distanceBetween(
        location1.getLatitude(), location1.getLongitude(),
        location2.getLatitude(), location2.getLongitude(),
        distance
    );
    
    double lat_mid = (location1.getLatitude() + location2.getLatitude()) * 0.5;
    double long_mid = (location1.getLongitude() + location2.getLongitude()) * 0.5;
    
    float[] distanceLat = new float[3];
    Location.distanceBetween(
        location1.getLatitude(), long_mid,
        location2.getLatitude(), long_mid,
        distanceLat
    );
    float[] distanceLong = new float[3];
    Location.distanceBetween(
        lat_mid, location1.getLongitude(),
        lat_mid, location2.getLongitude(),
        distanceLong
    );
    
    double distance_approx = Math.sqrt(
        Math.pow(distanceLong[0], 2.0) + Math.pow(distanceLat[0], 2.0)
    );
    

    比较距离[0]和距离_近似值,检查精度是否符合要求。

    如果您的点足够近,您可以轻松计算出从纬度/经度的距离,只要您知道1度纬度为111km,1度经度为
    111km*cos(纬度)


    在短距离内,我们很容易忽略地球并非一个球体,误差约为0.1-0.2%,具体取决于您的确切位置。

    由于地球不是平的,您的90度角想法将无法正常工作

    更好的办法是这个。 假设你的两个已知点A和B有纬度和经度latA,longA和latB,longB

    现在你可以引入另外两个点C和D,latC=latA,longC=longB,latD=latB,longD=longA,因此点A,B,C,D在地球表面形成一个矩形


    现在,您可以简单地使用distanceBetween(A,C)和distanceBerween(A,D)来获得所需的距离。

    在定义投影之前,这个问题没有有效的答案

    “直线”的方位沿路线变化,除非您正朝正南或正北行驶。只能计算每个节点处的角度,或沿管线的特定点处的方位角。节点处的角度加起来不会达到180°,因为您指的是一个椭球三角形,而计算椭球三角形是一个多步骤的过程,老实说,最好由库(如OSGEO)完成

    如果要将几何体拟合到平面笛卡尔坐标系,通常会对东、西方向上大部分较长的区域使用Lambert投影,对南北方向较长的投影使用横向墨卡托投影。整个地球被映射到UTM(通用横墨卡托)中,这将在任何地方为您提供笛卡尔坐标,但在任何情况下,在处理大地测量学时,您都无法获得完美的欧氏几何。例如,如果你向南走10英里,左转90度,然后向东走10英里,再左转90度,你可以到达距离起点10英里的任何地方,如果起点恰好是北极的话,你可以回到起点。因此,在UTM坐标平面上,您可能有一个数学上漂亮的方位,但在地面上,您不能转动UTM几何体指示的相同角度,并在地面上遵循相同的路径。你要么沿着地面上的直线走,要么沿着笛卡尔平面上的曲线走,反之亦然


    可以在相同的北距和相同的东距上分别计算两点之间的距离,并导出北距和东距。然而,在现实中,这个三角形的角度只有在纸上才有意义,而不是在地球上。如果飞机以这样一个三角形计算的方位起飞,它将到达错误的大陆。

    嗨,科林。不清楚你是否在寻求数学或编程方面的帮助。如果你想得到数学方面的帮助,你可能会想发帖子。如果这是您需要帮助的编程,那么请尝试为Android Studio创建一个编程Javascript,为什么我的方向几乎没有改变?我读过这些文件,但我不明白它实际上为我提供了什么角度。我相信bearingTo()函数会为我提供一个角度,我可以用它来关联两个lat/longs。我真的很喜欢这个函数的简单性!非常聪明,非常恼火,我自己没有想到这一点!我非常欣赏我将在球体表面遇到的问题,但是我只需要很短的距离,嘿,我真的很欣赏这个答案,它的细节是巨大的,它真的帮助我理解我正在处理的复杂性。我曾考虑过看UTM,但我认为你为我节省了很多浪费的时间!我欠你一个朋友!大地测量学是一个有趣的话题。不要让我开始研究大地水准面。在混合中加入立面,现在什么是向上,什么是标高的定义就消失了。平均海平面参差不齐,根据周围陆地的密度,“下降”点位于各种不同的方向。
    y_dist = abs(a.lat - b.lat) * 111000;
    x_dist = abs(a.lon - b.lon) * 111000 * cos(a.lat);