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