Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从两个纬度和方向进入纬度和方向之间_Php - Fatal编程技术网

Php 从两个纬度和方向进入纬度和方向之间

Php 从两个纬度和方向进入纬度和方向之间,php,Php,我正在处理一个应用程序,其中我需要两个lat-long之间的lat-long 因此,我所拥有的是 1) 起始点纬度 2) 终点横向长度 3) 方向,如南(180度)或北(0度) 4) 两点之间的距离 现在我要做的是将整个路径分成若干块,就像我将整个路径除以10公里一样 假设总距离是100公里,那么我会得到10块 如果200KM,则将有20个块 现在我想从两个lat-long中找出这些点的lat-long 所以所有20个点都应该在一条线上,并且距离相等 如何实现这一点?您可以尝试将两个纬度点之间的

我正在处理一个应用程序,其中我需要两个lat-long之间的lat-long

因此,我所拥有的是

1) 起始点纬度

2) 终点横向长度

3) 方向,如南(180度)或北(0度)

4) 两点之间的距离

现在我要做的是将整个路径分成若干块,就像我将整个路径除以10公里一样

假设总距离是100公里,那么我会得到10块

如果200KM,则将有20个

现在我想从两个lat-long中找出这些点的lat-long

所以所有20个点都应该在一条线上,并且距离相等


如何实现这一点?

您可以尝试将两个纬度点之间的差值除以块数。这将产生“增量”。然后,根据方向,可以在循环中添加或删除这些点,以创建中间的点

考虑以下我做的测试:

//Position 1
$lat1 = 53.2226754;
$lon1 = 0.124584;

//Position 2
$lat2 = 52.212445;
$lon2 = -0.12458;

//Differences in Lat / Lon
$latDif = round($lat1 - $lat2, 7);
$lonDif = round($lon1 - $lon2, 7);

//Calculate Step / Increment
//I used 10 as an example for the number of steps
$chunks = 10;
$latStep = round($latDif / $chunks, 7);
$lonStep = round($lonDif / $chunks, 7);

//New Lat Lon starts at start point
$newLat = $lat1;
$newLon = $lon1;


echo $lat1 . ", " . $lon1 . "<br>"; //Start Point

for($i = 1; $i < $chunks; $i++){

    //Direction could be substituted here

    if($lat1 < $lat2){
        $newLat = $newLat + $latStep; //Going North
    } else {
        $newLat = $newLat - $latStep; //Going South
    }

    if($lon1 < $lon2){
        $newLon = $newLon + $lonStep; //Going East
    } else {
        $newLon = $newLon - $lonStep; //Going West
    }

    echo $newLat . ", " . $newLon . "<br>"; //New Point
}

echo $lat2 . ", " . $lon2 . "<br>"; //End Point
//位置1
$lat1=53.2226754;
$lon1=0.124584;
//位置2
$lat2=52.212445;
$lon2=-0.12458;
//Lat/Lon的差异
$latDif=圆形($lat1-$lat2,7);
$lonDif=圆形($lon1-$lon2,7);
//计算步长/增量
//我用10作为步骤数的例子
$chunks=10;
$latStep=round($latDif/$chunks,7);
$lonStep=round($lonDif/$chunks,7);
//新Lat Lon从起点开始
$newLat=$lat1;
$newLon=$lon1;
echo$lat1。", " . $lon1。“
”//起点 对于($i=1;$i<$chunks;$i++){ //这里可以用方向来代替 如果($lat1<$lat2){ $newLat=$newLat+$latStep;//向北走 }否则{ $newLat=$newLat-$latStep;//向南走 } 如果($lon1<$lon2){ $newLon=$newLon+$lonStep;//向东走 }否则{ $newLon=$newLon-$lonStep;//向西走 } echo$newLat.,“$newLon.”
“;//新点 } echo$lat2。", " . $lon2。“
”//终点
这将导致以下Lat-Lon输出:

53.2226754,0.124584
53.1216524, 0.0996676;
53.0206294, 0.0747512;
52.9196064, 0.0498348;
52.8185834, 0.0249184;
52.7175604, 0.0000002;
52.6165374, -0.0249144;
52.5155144, -0.0498308;
52.4144914, -0.0747472;
52.3134684, -0.0996636;
52.212445, -0.12458;

我把这些画在一张地图上,得到了如下结果:

根据,由于地图的墨卡托投影,我以前的方法在长距离上不起作用

经过一些互联网挖掘,一些挠头和严重的令人难以置信的事情,我想我已经创建了一个PHP方法来计算两个Lat-Lon点之间的路径

对于下面的示例,我将起点用作伦敦希思罗机场,终点用作肯尼迪国际机场


首先,我们需要计算点A和点B之间沿连接它们的大圆的距离,使用:

现在我们有了总距离,我们可以规划路径的点:

//Step distance in metres
$sDist = 800000; //800km

//Lat Lon Storage;
$lat = []; //Short hand for array(); PHP > 5.4
$lon = [];

//Number of steps - rounded down!
$steps = floor($t_distance / $sDist);

//Percentage of distance for 1 step
$_f = 100 / $steps;

//CALCULATE POINTS
for($i = 0; $i <= $steps; $i++){
    $f = ($_f * $i) / 100; // value between 0-1 corresponding with percentage of step with the step number
    $_d = $t_distance / $eRadius; //Angular Distance

    $a = sin((1- $f) * $_d) / sin($_d);
    $b = sin($f * $_d) / sin($_d);

    $x = ($a * cos($lat1) * cos($lon1)) + ($b * cos($lat2) * cos($lon2));
    $y = ($a * cos($lat1) * sin($lon1)) + ($b * cos($lat2) * sin($lon2));
    $z = ($a * sin($lat1)) + ($b * sin($lat2));

    //New Lat Lon point
    $nLat = round(atan2($z, sqrt(pow($x, 2) + pow($y, 2))),7);
    $nLon = round(atan2($y, $x),7);

    //Push to Lat Lon arrays, converting Radians back to Degrees
    array_push($lat, rad2deg($nLat));
    array_push($lon, rad2deg($nLon));
}
//步距(米)
$sDist=800000//800公里
//Lat-Lon存储;
$lat=[]//数组()的简写形式;PHP>5.4
$lon=[];
//步骤数-向下舍入!
$steps=地板($t_距离/$sDist);
//一步距离的百分比
$\u f=100/$步数;
//计分

对于($i=0;$i)这是一个很好的问题,但您尝试了什么?我们希望通过将整个路径划分为这些线段来获取点,并检索这些线段端点的lat长度。相关:此链接有线索:-注意此方法适用于小距离(低于数百公里/英里)远离极点;在更远的距离或极点附近,网络墨卡托投影的泄漏抽象将导致这条路径比必要的路径长得多:@ImClarky非常帮助我的朋友,我正在使用上述概念,但是的,我也必须将上述算法应用于更长的距离,请帮助我找到一些解决方案脚踝很痛
//Step distance in metres
$sDist = 800000; //800km

//Lat Lon Storage;
$lat = []; //Short hand for array(); PHP > 5.4
$lon = [];

//Number of steps - rounded down!
$steps = floor($t_distance / $sDist);

//Percentage of distance for 1 step
$_f = 100 / $steps;

//CALCULATE POINTS
for($i = 0; $i <= $steps; $i++){
    $f = ($_f * $i) / 100; // value between 0-1 corresponding with percentage of step with the step number
    $_d = $t_distance / $eRadius; //Angular Distance

    $a = sin((1- $f) * $_d) / sin($_d);
    $b = sin($f * $_d) / sin($_d);

    $x = ($a * cos($lat1) * cos($lon1)) + ($b * cos($lat2) * cos($lon2));
    $y = ($a * cos($lat1) * sin($lon1)) + ($b * cos($lat2) * sin($lon2));
    $z = ($a * sin($lat1)) + ($b * sin($lat2));

    //New Lat Lon point
    $nLat = round(atan2($z, sqrt(pow($x, 2) + pow($y, 2))),7);
    $nLon = round(atan2($y, $x),7);

    //Push to Lat Lon arrays, converting Radians back to Degrees
    array_push($lat, rad2deg($nLat));
    array_push($lon, rad2deg($nLon));
}