php - 计算经度中心超过 180 条子午线
问题描述
我正在计算纬度/经度对的简单平均值以获得中心点(如投影在平面上),并且我正在努力开发一种算法来正确解释第 180 条子午线。我正在用 PHP 开发这个。
我正在计算一个简单的平均值,将所有经度相加并除以计数。但是,在有例如 -175 和 175 点的情况下,它返回平均值 0,而我需要一个 180 的值。
我曾经尝试过的方法是将所有负值加 360,取平均值,然后减去 360。这解决了第 180 条子午线的问题,但它在本初子午线(0 子午线)上产生了相同的问题。
$neg_lng_flag = false;
//calculate centerpoint
$i = 0;
while($i < $vertice_count) {
$lat_sum += $vertice_obj[$i]->lat;
//if lng is negative, add 360
if($vertice_obj[$i]->lng < 0) {
$lng_sum += $vertice_obj[$i]->lng + 360;
$neg_lng_flag = true;
} else {
$lng_sum += $vertice_obj[$i]->lng;
}
$i++;
}
$avg_lat = round($lat_sum / $vertice_count,2);
$avg_lng = round($lng_sum / $vertice_count,2);
if($neg_lng_flag) {
$avg_lng = $avg_lng - 360;
if($avg_lng < -180) {
$avg_lng = $avg_lng + 180;
}
}
我不确定我能做些什么来提出一个一致的算法来为所有场景返回一个真正的中心经度点。我无法在这里或通过谷歌更普遍地找到一个强大的解决方案。我将不胜感激任何外部考虑/想法。谢谢你。
解决方案
我能够为我的目的提出一个强大的解决方案。在我的例子中,我只需要计算最小和最大经度坐标,如果差值超过 180,我知道将负值移动 +360,然后计算平均值。如果平均值大于 180,我需要减去 360,如果它小于 -180,我需要加上 360。
//COMPUTE LONGITUDAL MIDPOINT
function getLngMidpoint($vertice_obj) {
//get min and max vals
$i = 0;
while($i < count($vertice_obj)) {
$min = $vertice_obj[$i]->lng;
$max = $vertice_obj[$i]->lng;
if($vertice_obj[i]->lng > $max) {
$max = $vertice_obj[$i]->lng;
}
if($vertice_obj[$i]->lng < $min) {
$min = $vertice_obj[$i]->lng;
}
$i += 1;
}
$shift = 0;
//check if distance between min and max > 180. If so, need to shift
if(($max - $min) > 180) {
//shift all lng by 180
$shift = 360;
}
$i = 0;
$sum_lng = 0;
while($i < count($vertice_obj)) {
if($vertice_obj[$i] < 0) {
$sum_lng += $vertice_obj[$i]->lng + $shift;
} else {
$sum_lng += $vertice_obj[$i]->lng;
}
$i += 1;
}
$avg_lng = $sum_lng / count($vertice_obj);
if($avg_lng > 180) {
$avg_lng = $avg_lng - 360;
}
if($avg_lng < -180) {
$avg_lng = $avg_lng + 360;
}
return $avg_lng;
}
推荐阅读
- r - 使用 Rvest 提取特定父节点的所有子节点的文本作为数据框中的变量
- json - 使用 jq 处理可选数组
- java - 需要操作返回的 JSON 对象并将一部分提取到列表中
- python - 向下滚动帖子 Instagram 主页 selenium 和 python
- karate - 我可以将列表从一个端点传递到另一个端点并在同一个文件中循环吗
- node.js - 如何根据文档数量限制删除集合中的文档?
- ios - 如何根据名称动态查找和调用 Swift 函数?
- javascript - 日期更改nodejs时未创建日志文件
- c# - C# MVC AngularJS:调用了控制器方法,但未从 $http.post() 方法接收值
- javascript - 当字段 jml_automatic 低于 id_km 字段时,启用或禁用 jquery 中的提交按钮