如何获得2点之间的坐标

时间:2017-03-16 13:45:17

标签: coordinates

我无法找到我正在寻找的内容或阅读谷歌文档我错过了它,我只需要一个函数或任何提交2点,开始和结束,并在其间获得X航点。 是否有一些api喜欢" www.somesite.com/api.php?start = 43.12,12.23& end = 44.12,12.23& number_of_waypoints = 5"返回一些json? 谢谢!

1 个答案:

答案 0 :(得分:0)

首先,这将需要使用geodesics,这是通过地球两个点的最短线,假设地球是椭圆体。 WGS84是您将看到的最广泛用于“纬度+经度”坐标的标准坐标系,这假设地球是椭圆体。

要解决此问题,首先需要找到方位角(北方的方位角)和两个坐标之间的距离。计算这个的方法是解决逆测地问题。

一旦我们有了这个距离(比如以米为单位),我们可以将其除以n,其中n - 1是我们想要的线路之间的航点数。这使我们在每个航路点之间的距离为d米。

现在,我们需要沿着这条线以d米的间隔绘制点。为此,我们可以解决直接测地问题。这给了我们一个新的坐标集,在给定的方位角移动给定点之后。我们可以反复执行此操作,以使新点每次从前一点移动d米。有一点需要注意的是,从线内不同点到线末端的合成方位角会有所不同,因此必须在每个阶段后获得目标方位角并用于计算下一个点。

解决直接和反向测地问题需要数学公式,其中有多个可用。但是,对于您的PHP应用程序,您最好不要自己尝试实现这些,而是​​使用可以为您执行此操作的库。一个流行的PHP库就是phpgeo

以下是使用phpgeo实现此功能的示例:

<?php

use Location\Coordinate;
use Location\Distance\Vincenty;
use Location\Bearing\BearingEllipsoidal;

$numPoints = 5;

$coordsA = new Coordinate(50.0, 0.0);
$coordsB = new Coordinate(51.0, 1.0);

$bearingCalculator = new BearingEllipsoidal();
$distanceCalculator = new Vincenty();

// Inverse geodesic problem
// Calculate total length of line between coords
$totalDistance = $distanceCalculator->getDistance($coordsA, $coordsB);
$intervalDistance = $totalDistance / ($numPoints + 1);

// Inverse geodesic problem
// Calculate angle to destination
$currentBearing = $bearingCalculator->calculateBearing($coordsA, $coordsB);
$currentCoords = $coordsA;

$points = [];

for ($i = 0; $i < $numPoints; $i++) {
    // Direct geodesic problem
    // Calculate new point along line
    $currentCoords =
        $bearingCalculator->calculateDestination($currentCoords,
                                                 $currentBearing,
                                                 $intervalDistance);

    // Add these new coordinates to the list
    array_push($points, $currentCoords);

    // Inverse geodesic problem
    // Recalculate angle to destination
    $currentBearing =
        $bearingCalculator->calculateBearing($currentCoords,
                                             $coordsB);
}

// Print out the list of points
foreach ($points as $point) {
    echo "{$point->getLat()}, {$point->getLng()}\n";
}