Как конвертировать JSON в GeoJSON - PullRequest
2 голосов
/ 28 апреля 2019

Я очень новичок в изучении javascript, и мои элементарные знания попали в стену. Я настроил карту Leaflet, на которой я хотел бы построить маркеры на основе divIcon из шнуров на нем из JSON. Благодаря моим бесчисленным исследованиям, пытаясь заставить его работать. Я узнал, почему мой файл JSON не работал, хотя в консоли я подтвердил, что он читается. Я узнал, что Leaflet предпочитает, чтобы он был в GeoJSON. Поэтому я потратил еще несколько часов на изучение того, как это преобразовать. Большинство моих выводов были устаревшими и больше не работали или не относились ко мне. Это то, что я попробовал в своих тщательных исследованиях.

Для начала я установил переменную для пути к моему тестовому файлу JSON, как это определено следующим образом.

var jsonData = "./data/tracking.json";

В моей попытке конвертировать JSON в GeoJSON я попробовал это.

var outGeoJson = {}
outGeoJson['properties'] = jsonData
outGeoJson['type']= "Feature"
outGeoJson['geometry']= {"type": "Point", "coordinates":
    [jsonData['lat'], jsonData['lon']]}

console.log(outGeoJson)

Проверил консоль и обнаружил, что координаты в массиве из файла JSON не определены.

enter image description here

Мой поиск причины, по которой это происходило неопределенно, не удался. Моя теория здесь, может быть, потому что JSON имеет ключ позиций перед массивом и тот факт, что это массив. Я продолжаю искать правильное решение, которое могло бы решить эту проблему. Я попробовал это решение дальше.

var geojson = {
  type: "FeatureCollection",
  features: [],
};

for (i = 0; i < jsonData.positions.length; i++) {
  if (window.CP.shouldStopExecution(1)) {
    break;
  }
  geojson.features.push({
    "type": "Feature",
    "geometry": {
      "type": "Point",
      "coordinates": [jsonData.positions[i].longitude, jsonData.positions[i].latitude]
    },
    "properties": {
      "report_at": jsonData.positions[i].report_at,
      "lat": jsonData.positions[i].lat,
      "lon": jsonData.positions[i].lon,
      "dir": jsonData.positions[i].dir,
      "first": jsonData.positions[i].first,
      "last": jsonData.positions[i].last
    }
  });
}

window.CP.exitedLoop(1);

console.log(geojson)

Это решение дало мне ошибку в консоли Uncaught TypeError: Cannot read property 'length' of undefined.

enter image description here

Попытка устранить неполадки в этом решении в течение еще нескольких часов, и это также не удалось. Вот пример тестового файла JSON, с которым я работаю.

{
  "positions": [
    {
      "report_at": "2015-01-21 21:00:08",
      "lat": "38.9080658",
      "lon": "-77.0030365",
      "elev": "0",
      "dir": "0",
      "gps": "0",
      "callsign": "WX2DX",
      "email": "",
      "phone": "",
      "ham": "WX2DX",
      "ham_show": "0",
      "freq": "",
      "note": "",
      "im": "",
      "twitter": null,
      "web": "",
      "unix": "1421874008",
      "first": "William",
      "last": "Smith",
      "marker": "36181"
    }
  ]
}

Все, что мне действительно нужно, это report_at, lat, lon, dir, first, last anyways. Остальное я могу обойтись без. Являются ли вышеупомянутые примеры, которые я пробовал, хорошим или правильным способом конвертировать его? Если нет, то есть ли у кого-то лучшее предложение, чем то, что я пытался, что я могу пропустить или пропустить, что является довольно хорошей возможностью из-за того, что он очень зеленый для этого языка? Заранее спасибо!

РЕДАКТИРОВАТЬ: Так как это было доведено до моего внимания, я не загружаю файл JSON, это то, что я сделал, чтобы загрузить его, так как предложения не работают, поскольку они применяются к node.js и не часть родного JavaScript.

    $.getJSON("./data/tracking.json", function(jsonData) {
  var outGeoJson = {}
  outGeoJson['properties'] = jsonData
  outGeoJson['type']= "Feature"
  outGeoJson['geometry']= {"type": "Point", "coordinates":
      [jsonData['lat'], jsonData['lon']]}

  console.log(outGeoJson)
});

При этом файл загружается в том виде, в котором он отображается в консоли, и конвертируется в GeoJSON. Я оставлю это как есть, пока нет лучшего решения.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

Если в вашем проекте добавлен jQuery, значит, вы почти у цели:

$.getJSON("./data/tracking.json", function(jsonData) {
    /* 
    Here the anonymous function is called when the file has been downloaded.
    Only then you can be sure that the JSON data is present and you can work with it's data.
    You have to keep in mind if you are getting the file synchronously or asynchronously (default).
   */
});
1 голос
/ 28 апреля 2019

var jsonData = "./data/tracking.json";

попробуйте заменить это следующей строкой.

var jsonData = require("./data/tracking.json"); или

import jsonData from "./data/tracking.json"; #es6 style

как заметил @PatrickEvans, вам нужно загружать данные, а не указывать путь в виде строки.

...