1

我正在使用 Google Apps 脚本通过调用 jsonStringify 将 Google 电子表格中的数据格式化为geoJSON。我的代码是从这个原始示例修改的。电子表格中的每一行代表一个国家,一个单元格包含相关的 geoJSON 多边形数据:

[[[74.92,37.24],[74.57,37.03],...[73.31,37.46],[74.92,37.24]]]

但是由于该单元格不包含数字,因此 jsonStringify 将其解析为字符串,并返回:

"coordinates":["[[[74.92,37.24],[74.57,37.03],...[73.31,37.46],[74.92,37.24]]]"]

...我不能使用,因为引号使它无效的geoJSON。当我输入一个数字时, jsonStringify 返回它而不带引号,我假设因为它识别出它是一个数字。有什么方法可以强制它将多边形数据解释为数字或以其他方式转义引号?这是我的代码的相关部分:

function getObjects(data, keys) {
  var objects = [];
  var headers = getHeaders(sheet, activeRange, 1);

  var zip = function(keys, data) {
    var obj = {};
    for (var i = 0; i < keys.length; i++) {
        obj[keys[i]] = data[i];
    }
    return obj;
  };

  for (var i = 0; i < data.length; i++) {
    var obj = zip(headers, data[i]);

//this is the polygon data
    var poly = obj[settings.poly];

    var coordinates = [poly];

    // If we have an id and polygon data
    if (obj[settings.id] && poly) {
      // Define a new GeoJSON feature object
      var feature = {
        type: 'Feature',
        // Get ID from UI
        id: obj[settings.id],
        geometry: {
          type: 'MultiPolygon',
          // Get coordinates from UIr
          coordinates: coordinates
        },
        // Place holder for properties object
        properties: obj
      };
      objects.push(feature);
    }
  }
  return objects;
}
4

1 回答 1

0

而不是传递一个字符串jsonStringify作为“坐标”,而是传递一个实际的数组。即jsonParse先在原文上使用(根据需要)获取相关对象。

一个示例转换(带有可能合适或不合适的保护)可能如下所示:

function restoreCoordinatesFromText(source) {
    var geo = Utilities.jsonParse(source);
    return (geo && (geo instanceof Array)
            ? geo                 // looks like we got our [array of stuff]
            : theSourceData);     // dunno, let's act like we never saw it
}

然后稍后可以在 JSON 中正确编码实际坐标数组,而字符串会表现出最初的不良行为。

var coords = "[1,2,3,4]"; /* just a string */

var json = Utilities.jsonStringify({
                     /* array, good! */
    goodCoordinates: restoreCoordinatesFromText(coords),
                     /* string, bad! */
    badCoordinates:  coords
});

这是相应的小提琴(它利用 ES5 JSON 支持)。

于 2013-11-02T22:00:21.467 回答