在这种情况下,我已经知道源和目的地的时间长短,以及它们之间的距离黑白。
假设源和目的地的最长长度为(x,y)和(a,b),距离b / w为500 km。
现在我的要求是,我希望在这些点之间获得1000点的长距离,每点间隔为1 Km b / w。
注意-因为b / w源与目的地的直线距离为500 km,b / w源与目的地的直线距离为1000,所以纬度不会在直线上(这是我的要求)。
在图像中,红色和绿色定位器是直线距离为500 km的源和目标点。灰点是1公里间隔内的1000个必需纬度点。
答案 0 :(得分:0)
这是您的起点:
/**
* Source: https://introcs.cs.princeton.edu/java/12types/GreatCircle.java.html
* @author David Buzatto
*/
public class SphericalDistance {
/**
* Calculates the spherical distance between two geographical coordinates.
*
* @param lat1 The latitude of the first geographical coordinate in degrees.
* @param lng1 The longitude of the first geographical coordinate in degrees.
* @param lat2 The latitude of the second geographical coordinate in degrees.
* @param lng2 The longitude of the second geographical coordinate in degrees.
* @param degreeRatio The ratio between one degree and the metric unit. For example, one degree variation in the Earth (considering it's a sphere) corresponds to 111120 meters.
* @return The distance between two geographical coordinates using the degreeRatio.
*/
public static double sphericalDistance( double lat1, double lng1, double lat2, double lng2, double degreeRatio ) {
double x1 = Math.toRadians( lat1 );
double y1 = Math.toRadians( lng1 );
double x2 = Math.toRadians( lat2 );
double y2 = Math.toRadians( lng2 );
double a = Math.pow( Math.sin( ( x2 - x1 ) / 2 ), 2 )
+ Math.cos( x1 ) * Math.cos( x2 ) * Math.pow( Math.sin( ( y2 - y1 ) / 2 ), 2 );
double angle = 2 * Math.asin( Math.min( 1, Math.sqrt( a ) ) );
return degreeRatio * Math.toDegrees( angle );
}
public static void main( String[] args ) {
double degreeRatio = 111120; // meters per degree
double lat1 = -20;
double lng1 = -50;
double lat2 = -20;
double lng2 = -54.7885801;
System.out.printf( "Distance between (%f, %f) and (%f, %f): %fkm\n",
lat1, lng1, lat2, lng2,
sphericalDistance( lat1, lng1, lat2, lng2, degreeRatio/1000 ) );
}
}
此代码是近似值,因为地球不是球体,而是椭圆体。
编辑
假设您有一个网状平面,该圆覆盖的圆具有有限的源和目标地理坐标。在此示例中,将标线等分为250行和250列,以免获得太大的图像。在您的情况下,您将需要它的两倍。考虑到每条平行线都离下一条平行线1公里。
将此网状图视为图形。每个线交叉都是一个图形顶点/节点。您想要的答案是这样的:我应该选择从源头出来到达目标的1000条边的路径是什么?
几乎可以使用广度优先搜索算法来回答此问题,并进行一些修改以选择具有一定大小的路径,因为图形结构是网状的,因此您将无法获得此精确值。此算法将导致此图中的路径/跳转最短,但是您需要对其进行更改以实现具有一定大小的路径。为了获得更好的近似,您将需要构建一个没有这种良好行为的更好的结构。在我的示例中,这被简化了,因为边缘只有4个自由度,即0、90、180和270度。在您的实际问题中,可以将一对顶点相交的路径旋转360度。如果您枚举此图中存在的1000公里(具有360度自由度)的每条路径,则将有360 ^ 1000种可能性!当然,如果您的轮换可以花费几分钟和几秒钟,那么您就可以拥有非常巨大的东西!确切的答案几乎是不可能的,因此您将需要某种近似/优化技术,例如我向您介绍的基本原理。
您还需要考虑您正在处理的是地理坐标,而不是笛卡尔坐标。现在,为什么需要这个?我真的很好奇。
祝你好运,我认为你真的需要!!!
编辑2
正如我已经怀疑的那样,您有一个NP完全问题,因为您需要一个尺寸正确的路径。在这里看看:How to find path of exact length in graph
我将编辑您的问题以使用图形算法对其进行标记。也许有些专家可以帮助您并纠正我可能会说的某种误解。