Как конвертировать словарь с объектами в geo Json? - PullRequest
1 голос
/ 24 января 2020

У нас есть словарь с городами, использующий уникальный идентификатор в качестве ключа:

cities: {
    'adfjlx9w': {
      name: 'New York',
      latitude: 4,
      longitude: -7
    },
    'favkljsl9': {
      name: 'Copenhagen',
      latitude: 2,
      longitude: -18
    }
  }

Нам нужно преобразовать наш словарь в Geo json, чтобы разместить города на карте, но не можем используйте типичный маршрут ниже, так как он не является массивом объектов:

GeoJSON.parse(cities, {
      Point: ['latitude', 'longitude']
    });

Какой самый быстрый и лучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 24 января 2020

Как-то так должно работать.

const citiesArray = Object.values(cities);

GeoJSON.parse(citiesArray, {
      Point: ['latitude', 'longitude']
    });
0 голосов
/ 24 января 2020

Согласно спецификации Geo JSON, чтобы включить свойства id и name с координатами широты / долготы, вам необходимо проанализировать объект как тип FeatureCollection со свойством features.

Каждый объект массива features должен иметь тип Feature со значениями properties и geometry. Значение properties должно содержать метаданные, а значение geometry должно иметь тип Point со свойством coordinates, содержащим широту / долготу.

const cities = {
  'adfjlx9w': {
    name: 'New York',
    latitude: 4,
    longitude: -7
  },
  'favkljsl9': {
    name: 'Copenhagen',
    latitude: 2,
    longitude: -18
  }
}

let citiesGeoJSON = Object.entries(cities)
  .reduce((
    _cities,
    [cityID, cityData],
  ) => {
    let city = {
      "type": "Feature",
      "properties": {
        "id": cityID,
        "name": cityData.name,
      },
      "geometry": {
        "type": 'Point',
        "coordinates": [
          cityData.latitude,
          cityData.longitude,
        ],
      },
    }
    _cities.features.push(city)
    return _cities
  }, {
    "type": "FeatureCollection",
    "features": [],
  })

Существует Geo JSON Linter онлайн.

0 голосов
/ 24 января 2020

Если я правильно понимаю, вам нужно извлечь данные latitude и longitude для каждого значения объекта cities в массив значений формы широты / долготы:

{ latitude, longitude }

Один из подходов состоит в том, чтобы использовать Object#values, который возвращает массив значений для cities, и, необязательно, использовать Array#map для преобразования каждого объекта в новый объект (с только значения широты, долготы):

const cities = {
    'adfjlx9w': {
      name: 'New York',
      latitude: 4,
      longitude: -7
    },
    'favkljsl9': {
      name: 'Copenhagen',
      latitude: 2,
      longitude: -18
    }
  }  

const latlngArray = Object
// Extract value array from cities
.values(cities) 
// Map each value to lat/lng only object
.map(item => ({ latitude : item.latitude, longitude : item.longitude })) 

console.log(latlngArray);

/* Pass latlngArray to GeoJSON.parse
GeoJSON.parse(latlngArray, {
  Point: ['latitude', 'longitude']
});
*/

Надеюсь, это поможет!

...