如何基于经纬度向东南西北添加指定距离获取新坐标?
解决经纬度加减指定公里数生成正方形坐标的问题
你的代码出错核心原因是没有处理角度与弧度的转换,PHP的三角函数(sin、cos、atan2等)默认接受弧度值,而你直接传入了度数格式的经纬度和方位角,导致计算结果完全错误。
关键修正点
- 所有度数格式的经纬度、方位角,必须先转为弧度再参与计算
- 计算得到的弧度结果,要转回度数才是正确的经纬度值
- 四个方位对应的方位角(bearing):
- 北(North):0°
- 东(East):90°
- 南(South):180°
- 西(West):270°
修正后的完整PHP代码
<?php // 辅助函数:度数转弧度 function degreesToRadians($degrees) { return $degrees * pi() / 180; } // 辅助函数:弧度转度数 function radiansToDegrees($radians) { return $radians * 180 / pi(); } // 基础参数 $distance = 100; // 延伸距离(公里) $earthRadius = 6371; // 地球平均半径(公里) $lat1 = -26.462049; // Jaraguá do Sul市纬度 $lon1 = -49.059448; // Jaraguá do Sul市经度 // 四个方位的方位角(度数) $bearings = [ '北' => 0, '东' => 90, '南' => 180, '西' => 270 ]; // 遍历计算每个方位的坐标 foreach ($bearings as $direction => $bearingDeg) { // 转换所有参数为弧度 $lat1Rad = degreesToRadians($lat1); $lon1Rad = degreesToRadians($lon1); $bearingRad = degreesToRadians($bearingDeg); $distanceRatio = $distance / $earthRadius; // 计算新纬度(弧度) $lat2Rad = asin( sin($lat1Rad) * cos($distanceRatio) + cos($lat1Rad) * sin($distanceRatio) * cos($bearingRad) ); // 计算新经度(弧度) $lon2Rad = $lon1Rad + atan2( sin($bearingRad) * sin($distanceRatio) * cos($lat1Rad), cos($distanceRatio) - sin($lat1Rad) * sin($lat2Rad) ); // 转回度数格式 $lat2 = radiansToDegrees($lat2Rad); $lon2 = radiansToDegrees($lon2Rad); // 输出结果 echo "{$direction}方坐标:纬度 {$lat2},经度 {$lon2}<br>"; } ?>
代码说明
- 用辅助函数明确弧度/度数转换逻辑,避免参数格式混淆
- 批量遍历四个方位,一次性计算并输出所有目标坐标点
- 严格遵循球面三角学的距离-方位计算公式,确保结果精度
运行这段代码后,你会得到Jaraguá do Sul市向东南西北各延伸100公里的四个坐标点,用这四个点即可画出目标正方形。
内容的提问来源于stack exchange,提问作者SUPER HERO PH
相关产品推荐
相关产品推荐

