开发者问题收集

如何将 JSON 转换为 GeoJSON

2019-04-28
12944

我刚刚开始学习 javascript,我的基础知识遇到了瓶颈。我已经设置了一个 Leaflet 地图,希望从 JSON 中绘制基于 divIcon 的标记。通过无数次尝试使其工作,我了解了为什么我的 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 文件中数组中的坐标未定义。

在此处输入图像描述

我搜索了出现未定义的原因,但没有成功。我的想法可能是因为 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。其余的我都可以不用。我尝试过的上述示例是否是转换它的好方法或正确方法?如果不是,那么是否有人有比我尝试过的更好的建议,我可能会遗漏或忽略,这很有可能是因为我对这门语言非常陌生?提前致谢!

编辑: 由于它引起了我的注意,我没有加载 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个回答

如果您的项目确实添加了 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).
   */
});
andris.vilde
2019-04-28

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

尝试用下一行替换此行。

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

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

正如@PatrickEvans 提到的,您必须实际加载数据,而不是将路径作为字符串提供。

Manish Gowardipe
2019-04-28