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