Нахождение центра карты - PullRequest
0 голосов
/ 17 апреля 2019

Перед этой частью я создал основной массив, содержащий широту, долготу и тип, из открытого API JSON (https://data.buffalony.gov/resource/v5df-q4ru.json).

Что я имею в виду под главным массивом, так это ..

[["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; 
}

Получить среднее значение долготы и широты.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вы также можете использовать Array.reduce для итерации по массиву только один раз, что должно быть немного быстрее (не имеет значения, если у вас никогда не было больших входных данных). Я пишу свой код на основе вывода, полученного по ссылке API , которую вы упомянули:

// 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]
1 голос
/ 17 апреля 2019

Используйте 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);
}
...