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