php根据坐标计算距离

//获取2点之间的距离
function GetDistance($lat1, $lng1, $lat2, $lng2){ 
    $radLat1 = $lat1 * (PI / 180);
    $radLat2 = $lat2 * (PI / 180);
   
    $a = $radLat1 - $radLat2; 
    $b = ($lng1 * (PI / 180)) - ($lng2 * (PI / 180)); 
   
    $s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2),2))); 
    $s = $s * EARTH_RADIUS; 
    $s = round($s * 10000) / 10000; 
    return $s; 

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算一个点到多边形的距离可以使用以下步骤: 1. 定义多边形顶点,使用数组表示多边形的每个顶点,例如: ```php $vertices = array( array('x' => 0, 'y' => 0), array('x' => 0, 'y' => 5), array('x' => 5, 'y' => 5), array('x' => 5, 'y' => 0), ); ``` 2. 定义目标点坐标,例如: ```php $target = array('x' => 2, 'y' => 2); ``` 3. 计算目标点到多边形每条边的距离,找到最短的距离,例如: ```php $minDistance = null; foreach ($vertices as $i => $v1) { $v2 = $vertices[($i + 1) % count($vertices)]; $distance = pointToLineDistance($target['x'], $target['y'], $v1['x'], $v1['y'], $v2['x'], $v2['y']); if ($minDistance === null || $distance < $minDistance) { $minDistance = $distance; } } ``` 4. 使用以下函数计算点到直线的距离: ```php function pointToLineDistance($x, $y, $x1, $y1, $x2, $y2) { $A = $x - $x1; $B = $y - $y1; $C = $x2 - $x1; $D = $y2 - $y1; $dot = $A * $C + $B * $D; $len_sq = $C * $C + $D * $D; $param = -1; if ($len_sq != 0) { $param = $dot / $len_sq; } $xx = 0; $yy = 0; if ($param < 0) { $xx = $x1; $yy = $y1; } elseif ($param > 1) { $xx = $x2; $yy = $y2; } else { $xx = $x1 + $param * $C; $yy = $y1 + $param * $D; } $dx = $x - $xx; $dy = $y - $yy; return sqrt($dx * $dx + $dy * $dy); } ``` 完整代码如下: ```php function pointToLineDistance($x, $y, $x1, $y1, $x2, $y2) { $A = $x - $x1; $B = $y - $y1; $C = $x2 - $x1; $D = $y2 - $y1; $dot = $A * $C + $B * $D; $len_sq = $C * $C + $D * $D; $param = -1; if ($len_sq != 0) { $param = $dot / $len_sq; } $xx = 0; $yy = 0; if ($param < 0) { $xx = $x1; $yy = $y1; } elseif ($param > 1) { $xx = $x2; $yy = $y2; } else { $xx = $x1 + $param * $C; $yy = $y1 + $param * $D; } $dx = $x - $xx; $dy = $y - $yy; return sqrt($dx * $dx + $dy * $dy); } function pointToPolygonDistance($target, $vertices) { $minDistance = null; foreach ($vertices as $i => $v1) { $v2 = $vertices[($i + 1) % count($vertices)]; $distance = pointToLineDistance($target['x'], $target['y'], $v1['x'], $v1['y'], $v2['x'], $v2['y']); if ($minDistance === null || $distance < $minDistance) { $minDistance = $distance; } } return $minDistance; } $vertices = array( array('x' => 0, 'y' => 0), array('x' => 0, 'y' => 5), array('x' => 5, 'y' => 5), array('x' => 5, 'y' => 0), ); $target = array('x' => 2, 'y' => 2); $distance = pointToPolygonDistance($target, $vertices); echo "Distance is: " . $distance; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值