【问题标题】:Finding the center of a map寻找地图的中心
【发布时间】:2019-04-17 00:57:35
【问题描述】:

在这部分之前,我制作了一个包含纬度、经度和类型的主数组,形成一个公共 JSON API(https://data.buffalony.gov/resource/v5df-q4ru.json)。

我所说的master数组的意思如下..

[["latitude","longitude","type"]...] // "..." represent more of 
//those single list containing latitude, longitude and type.  

要找到中心点,我需要在主数组中找到最大和最小的纬度和经度。中心点将是该最大值和最小值的平均值。

我做了以下操作,但我相信有更好的方法。

function findMapCenter(master){
  for (var key in Object.keys(master)){
    var lat = master([key]["latitude"]);  // [key] since it's a 
//array inside a array then finding the key string [latitude]
    var lon = master([key]["longitude"]); 
    var lat_max = Math.max(lat); 
    var lat_min = Math.min(lat);
    var lon_max = Math.max(lon);
    var lon_min = Math.min(lon);
    var total_max = (lat_max + lon_min);
    var total_min = (lon_max + lon_min);
    var average = (total_max / total_min);
  }
  return average; 
}

获取经度和纬度的平均值。

【问题讨论】:

  • 您当前的函数是否给出了您正在寻找的结果?请注意,多行上的 cmets 在每行之前都需要 /* / *///return average 似乎很奇怪,因为 average 只是计算的最后一个值
  • 将单个值传递给max 不会产生有用的结果。如果你传入一个数组,你会得到NaN,除非你使用apply
  • 我编辑了 cmets。我对申请不熟悉。

标签: javascript arrays json loops


【解决方案1】:

使用map 将纬度和经度值放入单独的数组中,然后将它们应用于最小值和最大值,最后取平均值:

function findMapCenter(master) {
    var minLat = Math.min(...Object.values(master).map(({ latitude }) => latitude));
    var maxLat = Math.max(...Object.values(master).map(({ latitude }) => latitude));
    var minLon = Math.min(...Object.values(master).map(({ longitude }) => longitude));
    var maxLon = Math.max(...Object.values(master).map(({ latitude }) => latitude));
    return (maxLat + minLat) / (maxLon + minLon);
}

【讨论】:

  • 谢谢,我会试试这个。
  • => 是做什么的?
  • 这是function(item) { return item.latitude }的简写。
【解决方案2】:

您也可以使用Array.reduce 仅对数组进行一次迭代,这应该会更快一些(如果您从来没有大量输入,则不相关)。我正在根据您提到的API link 收到的输出编写代码:

// Sample json
const json = [ { "latitude": "-11", "longitude": "-3" }, { "latitude": "-10", "longitude": "-30" }, { "latitude": "1", "longitude": "3" }, { "latitude": "2", "longitude": "-2" }];

function findCenter(json) {
    let [minLat, minLon, maxLat, maxLon] = json.reduce((a, b) => 
      [ +b.latitude  < a[0]  ?  +b.latitude  : a[0],
        +b.longitude < a[1]  ?  +b.longitude : a[1],
        +b.latitude  > a[2]  ?  +b.latitude  : a[2],
        +b.longitude > a[3]  ?  +b.longitude : a[3] ]
      , [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER]);
    return (maxLat + minLat) / (maxLon + minLon);
}

console.log(findCenter(json));

需要注意的是,如果您的数组为空,此函数将返回:

[Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2011-06-02
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多