1

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

我正在使用 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 字符串的键发生了变化。但是,就 Polygon 对象而言,我不负责 Google Api 返回的内容。

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

非常感谢


假设您有一个名为“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() 方法。但我需要能够在服务器端对其进行解码。

4

2 回答 2

2

The problem in your SavePolygonData example code is that you are trying to use the vertices data directly in your JSON object. Instead, you need to use the documented methods to get the latitude and longitude values from the vertex array and serialize those.

To fix it, you can change this code:

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

to:

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

and elsewhere define this function:

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;
}

Now in your code that parses this JSON you can use:

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 );
  }
于 2013-03-28T09:06:39.287 回答
0

它看起来像getPath()返回一个MVCArrayof ,您应该通过调用and方法LatLng从中提取纬度和经度,而不是通过直接访问属性。如果在 JavaScript 中是可能的,这些属性就会被声明。但同样适用于,您可以选择使用 进行循环,或者,如果还不能使用 lambda 函数,使用,使用as guard 的结果:lat()lng()privateMVCArrayforEach()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
}

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

于 2013-03-25T14:19:05.137 回答