国内的地图经纬度经过特殊处理的,必须使用国外地图(建议谷歌)取点取距离,使用以下代码可求出,误差在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]; }