国内的地图经纬度经过特殊处理的,必须使用国外地图(建议谷歌)取点取距离,使用以下代码可求出,误差在100米之内,使用谷歌地图默认输入是纬度在前经度在后

使用的是两圆相交法

$lnglat1 = ‘123,123’(经度在前纬度在后)/$AC=1250m (单位是m)

function getIntersectionPoints($lnglat1, $lnglat2, $AC, $BC)
{
    // 获取笛卡尔坐标
    list($lng1, $lat1) = explode(',', $lnglat1);
    list($lng2, $lat2) = explode(',', $lnglat2);

    $pointA = $this->latLngToXYZ($lng1, $lat1);
    $pointB = $this->latLngToXYZ($lng2, $lat2);

    // 计算两个已知点之间的距离
    $distanceAB = sqrt(pow($pointA[0] - $pointB[0], 2) + pow($pointA[1] - $pointB[1], 2) + pow($pointA[2] - $pointB[2], 2));

    // 如果两个圆无交点,返回空数组
    if ($distanceAB > ($AC + $BC) || $distanceAB < abs($AC - $BC)) {
        return [];
    }

    // 中心到交点的距离
    $a = ($AC * $AC - $BC * $BC + $distanceAB * $distanceAB) / (2 * $distanceAB);
    $h = sqrt($AC * $AC - $a * $a);

    // 中心点坐标
    $midX = $pointA[0] + $a * ($pointB[0] - $pointA[0]) / $distanceAB;
    $midY = $pointA[1] + $a * ($pointB[1] - $pointA[1]) / $distanceAB;
    $midZ = $pointA[2] + $a * ($pointB[2] - $pointA[2]) / $distanceAB;

    // 求交点坐标
    $intersection1 = [
        $midX + $h * ($pointB[1] - $pointA[1]) / $distanceAB,
        $midY - $h * ($pointB[0] - $pointA[0]) / $distanceAB,
        $midZ
    ];

    $intersection2 = [
        $midX - $h * ($pointB[1] - $pointA[1]) / $distanceAB,
        $midY + $h * ($pointB[0] - $pointA[0]) / $distanceAB,
        $midZ
    ];

    // 转换回经纬度
    $coord1 = $this->xyzToLatLng($intersection1[0], $intersection1[1], $intersection1[2]);
    $coord2 = $this->xyzToLatLng($intersection2[0], $intersection2[1], $intersection2[2]);

    return [$coord1, $coord2];
}

function latLngToXYZ($lng, $lat, $radius = 6378137) {
    $lat = deg2rad((float)$lat);
    $lng = deg2rad((float)$lng);
    $x = $radius * cos($lat) * cos($lng);
    $y = $radius * cos($lat) * sin($lng);
    $z = $radius * sin($lat);
    return [$x, $y, $z];
}

// 将笛卡尔坐标系下的 x, y, z 转换回经纬度
function xyzToLatLng($x, $y, $z, $radius = 6378137) {
    $lng = rad2deg(atan2($y, $x));
    $hyp = sqrt($x * $x + $y * $y);
    $lat = rad2deg(atan2($z, $hyp));
    return [$lng, $lat];
}