You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 02:27:04