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オブジェクトに関する限り、GoogleApiが返すものについては責任を負いません。

キーを知らなくても、経度と緯度を取得する方法はありますか?数週間で壊れることを恐れずにポリゴンをループする方法はありますか?

どうもありがとう


「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()の代わりに処理されたデータを含む「data」変数の新しいデータ構造を作成する必要があります。

それは私が助けを必要としているものです。その新しいデータ構造の構造は何ですか?

google.maps.geometry.encoding.encodePath()メソッドがあることに気づきました。ただし、サーバー側でデコードできる必要があります。

4

2 に答える 2

2

サンプルコードの問題は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 );
  }
于 2013-03-28T09:06:39.287 に答える
0

プロパティに直接アクセスするのではなく、 andメソッドを呼び出すことによって緯度と経度を抽出することになっているのをgetPath()返すように見えます。JavaScriptで可能であれば、これらのプロパティは宣言されているはずです。しかし、同じことがに当てはまります。これについては、でループオーバーするか、ラムダ関数にまだ慣れていない場合は、で、の結果をガードとして使用するかを選択できます。MVCArrayLatLnglat()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
}

これらの例は、ポリゴンが1つのパスのみで構成されている場合は問題ありません。そうでない場合は、パスもループする必要があります。

于 2013-03-25T14:19:05.137 に答える