【问题标题】:JSON string changes its keys for Google MAPS API v3JSON 字符串更改了 Google MAPS API v3 的密钥
【发布时间】:2013-03-25 14:07:06
【问题描述】:

我已经在这里看到过几次这个问题,但回答并不完全适用于我的情况。

我正在使用 google.maps.Polygon 对象来保存在地图上绘制的边界。

稍后我使用“getPath”方法并将其添加到 Json 字符串中。

JSON 字符串总是不同的。有时我可以通过以下方式抓取多边形角:

thisShape.data.b[i].kb thisShape.data.b[i].lb

其他时间

thisShape.data.b[i].Qa thisShape.data.b[i].Ra

等等

似乎随着时间的推移,Json 字符串的键发生了变化。但是,我不负责 Google Api 返回的 Polygon 对象。

有没有办法在不知道密钥的情况下获取经度和纬度? 任何想法如何循环通过我的多边形而不用担心它会在几周内中断?

非常感谢


假设您有一个名为“SavePolygonData”的方法,除其他外,它会创建一个像这样的 Json 字符串:

var allData = {};
    $("div.shapes").each(function(){
      var id = $(this).attr("id");
      var type  = id.split('_')[0];
      var feature = MapToolbar.features[type+'Tab'][id];
      var vertices = feature.getPath();
      allData[id] = { color: feature.fillColor, data: vertices};
    });
    var allDataJson = JSON.stringify(allData);

然后是另一个在其他地方读取 json 字符串的方法,如下所示:

for (var polyId in allData) {
    if (allData.hasOwnProperty(polyId)) {
      var thisShape = allData[polyId];
      var color = thisShape.color;
      var vertices=new Array();

      for ( var i=0; i<thisShape.data.b.length; ++i )
      {
        var coordX = thisShape.data.b[i].kb; //Problem here
        var coordY = thisShape.data.b[i].lb; //Problem here
        var point = new google.maps.LatLng(coordX, coordY);
        vertices[i] = point;
      }
      var poly = new google.maps.Polygon({
        strokeWeight: 2,
        fillColor: color,
        paths: vertices
      });
      poly.setMap(map);  
    }

我不能对 json 字符串使用 getLat() 方法,因为显然它只包含字符串。相反,我必须为包含已处理数据而不是 feature.getPath() 的“数据”变量创建一个新的数据结构。

这就是我需要帮助的地方。那个新数据结构的结构是什么?

我注意到有 google.maps.geometry.encoding.encodePath() 方法。 但我需要能够在服务器端对其进行解码。

【问题讨论】:

  • 你的意思是你正在从最小化的代码中获取数据?你应该避免这种情况
  • 我包括maps.googleapis.com/maps/api/js,这是唯一一个似乎被最小化的外部库。我的代码都没有被最小化,据我所知,我们无法控制谷歌提供的 api 结构
  • 哦,看起来很有希望
  • 但我无法在服务器端解码字符串?

标签: json google-maps-api-3 polygon latitude-longitude


【解决方案1】:

SavePolygonData 示例代码中的问题是您试图直接在 JSON 对象中使用顶点数据。相反,您需要使用记录在案的方法从顶点数组中获取纬度和经度值并对其进行序列化。

要修复它,您可以更改此代码:

var vertices = feature.getPath();
allData[id] = { color: feature.fillColor, data: vertices};

到:

var vertices = getLatLngVertices( feature.getPath() );
allData[id] = { color: feature.fillColor, data: vertices };

和其他地方定义这个函数:

function getLatLngVertices( path ) {
    var pathArray = path.getArray();
    var vertices = [];
    for( var i = 0, n = pathArray.length;  i < n;  i++ ) {
        var latLng = pathArray[i];
        vertices.push({ lat: latLng.lat(), lng: latLng.lng() });
    }
    return vertices;
}

现在,您可以在解析此 JSON 的代码中使用:

var data = thisShape.data;
for( var i = 0, n = data.length; i < n; ++i ) {
    var point = data[i];
    vertices[i] = new google.maps.LatLng( point.lat, point.lng );
  }

【讨论】:

  • 哦!!我会试试的,很快就会告诉你!!
【解决方案2】:

看起来getPath() 返回了LatLngMVCArray,您应该通过调用lat()lng() 方法从中提取纬度和经度,而不是直接访问属性。如果在 JavaScript 中是可能的,这些属性将被声明为private。但同样适用于MVCArray,您可以选择使用forEach() 循环,或者,如果还不能使用lambda 函数,使用getAt(),使用getLength() 的结果作为保护:

polygon.getPath().forEach(function(latLng, idx) {
   var lat = latLng.lat();
   var lng = latLng.lng();
   // do something
});

var path = polygon.getPath();
var len = path.getLength();
for (var idx = 0; idx < len; idx++) {
   var latLng = path.getAt(idx);
   var lat = latLng.lat();
   var lng = latLng.lng();
   // do something
}

如果多边形仅包含一条路径,这些示例是可以的。如果没有,你也必须循环路径。

【讨论】:

  • 这是他们在其他类似答案中的建议,但我不确定我是否可以使用它,而不是完全改变我的方法。我会在我的问题中详细说明
  • @Nick:好的,现在我看到你的问题有点不同 - 不幸的是我没有时间详细说明你的代码:-( - 你应该关注 Dr.Molle 的链接,虽然
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2012-08-31
相关资源
最近更新 更多