【问题标题】:X Y distance from longitude and latitudeX Y与经纬度的距离
【发布时间】:2020-11-01 08:01:16
【问题描述】:

我有两组经度和纬度,我拼命想弄清楚A点从B点水平和垂直偏移了多少米。

我的目标必须是 +/-X 和 +/-Y 值——我已经通过 Location.distanceBetween() 获得了两点之间的最短距离....我想我可以将它与 Location 一起使用。 BearingTo() 通过基本三角函数找到我正在寻找的值。

我的想法是我可以使用方位作为角度 A、90 度作为角度 C 和 C 侧的长度(距离之间)来计算 A 侧(x 轴)和 B(y 轴)的长度,但结果并不令人印象深刻至少可以说大声笑

            //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 到 100 米的距离处进行了测试,它始终为 64.xxxxxxx,只有最后几位小数真正发生了变化。

我能找到的所有在线参考资料总是着眼于计算最短路径,虽然这个很棒的 site 参考了 x 和 y 位置,但它总是最终将它们再次组合成最短距离

非常感谢任何指向正确方向的指针!

【问题讨论】:

  • 嗨科林。目前尚不清楚您是否在寻求数学或编程方面的帮助。如果您需要数学方面的帮助,您可能想在math.stackexchange.com 中发帖。如果它是您需要帮助的编程,请尝试创建minimal reproducible example
  • Programming - 适用于 Android Studio 的 Javascript,为什么我的方位几乎没有变化?我已经阅读了文档,但我不明白它实际上为我提供了什么角度。我相信 BearingTo() 函数会为我提供一个可以用来关联两个纬度/经度的角度

标签: java android geospatial latitude-longitude geo


【解决方案1】:

由于地球不是平的,你90度角的想法是行不通的。

这可能更好。 假设您的 2 个已知点 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) 来获得所需的距离。

【讨论】:

  • 我真的很喜欢这种简单!非常聪明,非常恼火,我自己没想到这一点!我非常感谢我在球体表面上遇到的问题,但是我只需要非常短的距离
【解决方案2】:

如果满足以下条件,可以使用Location.distanceBetween()

  1. 这些点位于远离极地和
  2. 距离足够短(与地球半径相比)。

方法很简单。只需固定经度或纬度,只改变另一个。然后计算距离。

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)
);

比较 distance[0] 和 distance_approx,检查精度是否满足您的要求。

【讨论】:

    【解决方案3】:

    如果你的点足够近,你可以很容易地计算出x-y与纬度/经度的距离,一旦你知道1纬度是111km,1经度是111km * cos(latitude)

    y_dist = abs(a.lat - b.lat) * 111000;
    x_dist = abs(a.lon - b.lon) * 111000 * cos(a.lat);
    

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

    【讨论】:

      【解决方案4】:

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

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

      如果您想将几何体拟合到笛卡尔平面,通常对东西方向大部分较长的区域使用兰伯特投影,而在较长的南北投影上使用横墨卡托投影。整个地球都在 UTM(通用横轴墨卡托)中绘制,它将在任何地方为您提供笛卡尔坐标,但在处理大地测量时,您绝不会获得完美的欧几里得几何。例如,如果您向南行驶 10 英里,左转 90°,然后向东行驶 10 英里,再次左转 90°,您可以在距起点 10 英里的任何地方,如果该点正好回到起点恰好是北极。因此,您在 UTM 坐标平面上可能有一个数学上漂亮的方位,但在地面上,您不能转动与 UTM 几何图形指示的相同的角度并在地面上遵循相同的路径。您将沿着地面上的直线和笛卡尔平面上的曲线走,反之亦然。

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

      【讨论】:

      • 嘿,我真的很感激这个答案,它的细节非常丰富,它真的帮助我理解了我正在处理的复杂性。我曾考虑过看看 UTM,但我认为你为我节省了很多浪费的时间!我欠你一个朋友!
      • 大地测量学是一个有趣的话题。不要让我开始研究大地水准面。将海拔高度混合在一起,现在定义是什么,或者什么水平是窗外的。平均海平面是凹凸不平的,并且“向下”指向各种不同的方向,具体取决于周围陆块的密度。
      猜你喜欢
      • 2016-08-29
      • 2012-07-07
      • 2014-02-22
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 2011-08-16
      相关资源
      最近更新 更多