javascript 如何在javascripts中按经纬度距离对数组项进行排序?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26836146/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 06:34:18  来源:igfitidea点击:

How to sort array items by longitude latitude distance in javascripts?

javascriptarrayssortinglatitude-longitudegeo

提问by Tharik Kanaka

I am having following JSON array of 6 locations. Is there any way sort these based on longitude and latitude where nearby locations come next in the array?

我有以下 6 个位置的 JSON 数组。有没有办法根据经度和纬度对它们进行排序,其中附近位置在阵列中的下一个位置?

[
{"id" : 279, "longitude":79.853239,"latitude":6.912283},
{"id" : 284, "longitude":79.865699,"latitude":6.885697},
{"id" : 13,  "longitude":79.851187,"latitude":6.912220},
{"id" : 282, "longitude":79.858904,"latitude":6.871041},
{"id" : 281, "longitude":79.853346,"latitude":6.899757},
{"id" : 16,  "longitude":79.854786,"latitude":6.894039}
]

Sorting can be started from first item and result should be something like this

排序可以从第一项开始,结果应该是这样的

[
{"id" : 279, "longitute":79.853239,"latitude":6.912283},
{"id" : 13,  "longitute":79.851187,"latitude":6.912220},
{"id" : 281, "longitute":79.853346,"latitude":6.899757},
{"id" : 16,  "longitute":79.854786,"latitude":6.894039},
{"id" : 284, "longitute":79.865699,"latitude":6.885697},
{"id" : 282, "longitute":79.858904,"latitude":6.871041}
]

回答by Tharik Kanaka

Problem resolved by adding another attribute called distance. Used following function to calculate distance between two points

通过添加另一个称为距离的属性解决了问题。使用以下函数计算两点之间的距离

function calculateDistance(lat1, lon1, lat2, lon2, unit) {
  var radlat1 = Math.PI * lat1/180
  var radlat2 = Math.PI * lat2/180
  var radlon1 = Math.PI * lon1/180
  var radlon2 = Math.PI * lon2/180
  var theta = lon1-lon2
  var radtheta = Math.PI * theta/180
  var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
  dist = Math.acos(dist)
  dist = dist * 180/Math.PI
  dist = dist * 60 * 1.1515
  if (unit=="K") { dist = dist * 1.609344 }
  if (unit=="N") { dist = dist * 0.8684 }
  return dist
}

Then calculated distance for each item in the array by using above function. Then sorted array by distance.

然后使用上述函数计算数组中每个项目的距离。然后按距离对数组进行排序。

for ( i = 0; i < uniqueNodes.length; i++) {
  uniqueNodes[i]["distance"] = calculateDistance(uniqueNodes[0]["latitude"],uniqueNodes[0]["longitute"],uniqueNodes[i]["latitude"],uniqueNodes[i]["longitute"],"K");
}

uniqueNodes.sort(function(a, b) { 
  return a.distance - b.distance;
});

回答by Caleb Swank

Anyone else looking to do this, if you have the longitude and latitude avaliable, you can just sort linearly on it to get a simple line diagram like below. this will give you a rise/run linear result.

任何其他想要这样做的人,如果您有可用的经度和纬度,您可以对其进行线性排序以获得如下所示的简单折线图。这会给你一个上升/运行线性结果。

var $array = [
[79.853239, 6.912283, 279],
[79.851187, 6.912220, 13],
[79.853346, 6.899757, 281],
[79.854786, 6.894039, 16],
[79.865699, 6.885697, 284],
[79.858904, 6.87104, 282]
]

function sortLngLat(a, b){
var x = a[0] / a[1];
var y = b[0] / b[1];
}
var sortedArray = $array.sort(sortLngLat);
console.log(sortedArray);

output should be like graph below and you can tweak your values with negatives and positives to get different angles and directions.

输出应如下图所示,您可以使用负数和正数调整您的值以获得不同的角度和方向。

 ---------------
|       |  /    |
| -1/1  | / 1/1 |
|       |/      |
|--------------
|      /|       |
|-1/-1/ | 1/-1  |
|    /  |       |
 ---------------

回答by Joseph

You could loop through the array, and nest another loop that finds the nearest one.

您可以遍历数组,然后嵌套另一个循环以找到最近的循环。

var finalArray = [];

while(entries){
  //for each item
  while(what's left){
    //find the nearest against the current item
    //push to final
  }
}

This assumes that the very first in the array is the point of reference, that what comes next would be the nearest to that point, and so on.

这假设数组中的第一个是参考点,接下来的将是离该点最近的,依此类推。