经纬度的X Y距离

X Y distance from longitude and latitude

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

我的目标必须是 +/-X 和 +/-Y 值 - 我已经通过 Location.distanceBetween() 获得了两点之间的最短距离....我想我可以使用这个使用 Location.bearingTo() 找到我通过基本三角学寻找的值。

我的想法是我可以使用方位角作为角度 A,90 度作为角度 C 和 C 边的长度(distanceBetween)来计算 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 - 100 米的距离上进行测试的,它总是在 64.xxxxxxx 并且只有最后几个小数真的变了。

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

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

有可能利用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)
);

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

如果你的点足够近,你可以很容易地计算出纬度/经度的 x-y 距离,一旦你知道 1 纬度是 111 公里,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%,具体取决于您的确切位置。

因为地球不平,你的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) 来获得所需的距离。

在您定义投影之前,此问题没有有效答案。

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

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

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