在两点之间生成固定的经纬度数

时间:2018-10-10 16:03:05

标签: javascript java graph graph-algorithm

在这种情况下,我已经知道源和目的地的时间长短,以及它们之间的距离黑白。

假设源和目的地的最长长度为(x,y)和(a,b),距离b / w为500 km。

现在我的要求是,我希望在这些点之间获得1000点的长距离,每点间隔为1 Km b / w。

注意-因为b / w源与目的地的直线距离为500 km,b / w源与目的地的直线距离为1000,所以纬度不会在直线上(这是我的要求)。

在图像中,红色和绿色定位器是直线距离为500 km的源和目标点。灰点是1公里间隔内的1000个必需纬度点。

Click here to see a sample image

1 个答案:

答案 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公里。

enter image description here

将此网状图视为图形。每个线交叉都是一个图形顶点/节点。您想要的答案是这样的:我应该选择从源头出来到达目标的1000条边的路径是什么?

enter image description here

几乎可以使用广度优先搜索算法来回答此问题,并进行一些修改以选择具有一定大小的路径,因为图形结构是网状的,因此您将无法获得此精确值。此算法将导致此图中的路径/跳转最短,但是您需要对其进行更改以实现具有一定大小的路径。为了获得更好的近似,您将需要构建一个没有这种良好行为的更好的结构。在我的示例中,这被简化了,因为边缘只有4个自由度,即0、90、180和270度。在您的实际问题中,可以将一对顶点相交的路径旋转360度。如果您枚举此图中存在的1000公里(具有360度自由度)的每条路径,则将有360 ^ 1000种可能性!当然,如果您的轮换可以花费几分钟和几秒钟,那么您就可以拥有非常巨大的东西!确切的答案几乎是不可能的,因此您将需要某种近似/优化技术,例如我向您介绍的基本原理。

您还需要考虑您正在处理的是地理坐标,而不是笛卡尔坐标。现在,为什么需要这个?我真的很好奇。

祝你好运,我认为你真的需要!!!

编辑2

正如我已经怀疑的那样,您有一个NP完全问题,因为您需要一个尺寸正确的路径。在这里看看:How to find path of exact length in graph

我将编辑您的问题以使用图形算法对其进行标记。也许有些专家可以帮助您并纠正我可能会说的某种误解。