我如何过滤和计算JSON对象的纬度和经度距离原点10公里



我正在尝试过滤并计算给定原点10公里以内的API端点的对象。我一直坚持如何过滤API结果并计算匹配的项目数量。

我能够过滤数据并计算有1-1比较的"香港"城市有多少个项目,但是距离计算是过滤数据的另一个复杂层。

coords = [
   [
      City: "Hong Kong",
      Lat: “22.667790”, 
      Long: “-111.909905” 
   ],
   [
      City: "Atlanta",
      Lat: “22.958769”, 
      Long: “-111.948939”
   ],
   [
      City: "Paris",
      Lat: “23.989803”, 
      Long: “-112.989850”
   ],
   [
      City: "Sydney",
      Lat: “22.001118”,
      Long:”-111.939433”
   ],
   [
      City: "Hong Kong",
      Lat: “22.667790”, 
      Long: “-111.909905” 
   ],
];

origin = [  
     lat:"22.111009",
     long: "-113.667870"
];
function getDistance(lat1, lon1, lat2, lon2) {
     var R = 6371; // Radius of the earth in km
     var dLat = deg2rad(lat2 - lat1); // deg2rad below
     var dLon = deg2rad(lon2 - lon1);
     var a =
        Math.sin(dLat / 2) * Math.sin(dLat / 2) +
        Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
        Math.sin(dLon / 2) * Math.sin(dLon / 2);
     var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
     var d = R * c; // Distance in km
     return d;
}

function deg2rad(deg) {
     return deg * (Math.PI / 180);
}

coords.forEach(function(coord){
    distance = getDistance(coord.lat, coord.long, origin.lat, origin.long);
    if (distance < 10){
        return distance;
    }
});

到目前为止,我无法返回任何有意义的东西,只有原点与每个对象之间的距离列表。它应该显示出来源10公里的城市。

您需要使用filter方法:

const filtered = coords.filter(coord => {
    distance = getDistance(coord.lat, coord.long, origin.lat, origin.long);
    return distance < 10
});

现在,您已经过滤了存储在名为filtered

的阵列中的结果

要过滤您的列表,您可以使用array.filter。当然,您的起源应少于10公里,而您的城市都不匹配,请参阅:

var coords = [{
    City: "Hong Kong",
    lat: "22.667790",
    long: "-111.909905"
  },
  {
    City: "Atlanta",
    lat: "22.958769",
    long: "-111.948939"
  },
  {
    City: "Paris",
    lat: "23.989803",
    long: "-112.989850"
  },
  {
    City: "Sydney",
    lat: "22.001118",
    long: "-111.939433"
  },
  {
    City: "Hong Kong",
    lat: "22.667790",
    long: "-111.909905"
  }
];
origin = {
  lat: "22.611009",
  long: "-111.967870"
};
function getDistance(lat1, lon1, lat2, lon2) {
  var R = 6371; // Radius of the earth in km
  var dLat = deg2rad(lat2 - lat1); // deg2rad below
  var dLon = deg2rad(lon2 - lon1);
  var a =
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
    Math.sin(dLon / 2) * Math.sin(dLon / 2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c; // Distance in km
  return d;
}
function deg2rad(deg) {
  return deg * (Math.PI / 180);
}
var matching = coords.filter(function(coord) {
  return getDistance(coord.lat, coord.long, origin.lat, origin.long) < 10;
});
console.info(matching);

相关内容

最新更新