PHP如何从数组中获取与给定经纬度距离最近的位置
实现方案(PHP版本)
以下是可直接落地的两种实现方式:
前提参数
你的基础经纬度参数如下:
$lat = "30.741190"; $lng = "76.806343"; // 统一转浮点型避免字符串运算问题 $currentLat = (float)$lat; $currentLng = (float)$lng; // 自定义筛选的距离阈值,单位:公里,可按需调整 $maxDistance = 10;
你的原有数组结构:
$locationList = [ [ "CityName" => "Jaunpur", "distance" => 1.2316498252150263, "latitude" => 30.741190, "longitude" => 76.764381 ], [ "CityName" => "Def", "distance" => 3.710097860029201, "latitude" => 30.740700, "longitude" => 76.806343 ] ];
注意:如果数组里的
distance字段不是基于你当前传入的$lat/$lng计算的,请跳过方案1直接使用方案2重新计算距离,避免筛选结果错误。
方案1:数组已有对应经纬度计算的distance字段
直接遍历过滤即可,逻辑最简单:
// 筛选符合距离要求的位置 $nearbyLocations = array_filter($locationList, function($item) use ($maxDistance) { return $item['distance'] <= $maxDistance; }); // 可选:按距离由近到远排序 usort($nearbyLocations, function($a, $b) { return $a['distance'] <=> $b['distance']; });
方案2:数组没有预计算distance字段,需自行计算
用地理学通用的Haversine公式计算两个经纬度点的球面距离,再筛选:
第一步:封装距离计算函数
/** * 计算两个经纬度点之间的距离 * @param float $lat1 起点纬度 * @param float $lng1 起点经度 * @param float $lat2 终点纬度 * @param float $lng2 终点经度 * @return float 距离(单位:公里) */ function calculateDistance($lat1, $lng1, $lat2, $lng2) { $earthRadius = 6371; // 地球平均半径,单位公里 // 角度转弧度 $latDelta = deg2rad($lat2 - $lat1); $lngDelta = deg2rad($lng2 - $lng1); // Haversine公式计算 $a = sin($latDelta / 2) * sin($latDelta / 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($lngDelta / 2) * sin($lngDelta / 2); $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); return $earthRadius * $c; }
第二步:遍历数组筛选附近位置
$nearbyLocations = []; foreach ($locationList as $item) { $distance = calculateDistance($currentLat, $currentLng, (float)$item['latitude'], (float)$item['longitude']); if ($distance <= $maxDistance) { // 可选:把计算得到的距离存入数组项方便后续使用 $item['calculated_distance'] = $distance; $nearbyLocations[] = $item; } } // 可选:按距离由近到远排序 usort($nearbyLocations, function($a, $b) { return $a['calculated_distance'] <=> $b['calculated_distance']; });
内容的提问来源于stack exchange,提问作者user15018150
相关产品推荐
相关产品推荐

