Строка JSON меняет свои ключи для Google MAPS API v3

Я уже несколько раз видел этот вопрос здесь, но ответы не совсем применимы к моему делу.

Я использую объект 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);  
    }

Я не могу использовать методы getLat() для строки json, потому что, очевидно, она содержит только строки. Вместо этого мне нужно создать новую структуру данных для моей переменной «данные», которая содержит обработанные данные вместо feature.getPath().

Вот с чем мне нужна помощь. Какова структура этой новой структуры данных?

Я заметил, что есть метод google.maps.geometry.encoding.encodePath(). Но мне нужно иметь возможность декодировать его на стороне сервера.


person Nick    schedule 25.03.2013    source источник
comment
вы имеете в виду, что вы захватываете данные из свернутого кода? Вы должны избегать этого   -  person Walter Tross    schedule 25.03.2013
comment
Я включаю maps.googleapis.com/maps/api/js, и это единственный внешняя библиотека, которая выглядит свернутой. Ни один из моих кодов не минимизирован, и, насколько мне известно, у нас нет никакого контроля над структурой API, которую предоставляет Google.   -  person Nick    schedule 25.03.2013
comment
возможный дубликат Не удается сохранить многоугольник на картах Google   -  person Dr.Molle    schedule 25.03.2013
comment
о, это выглядит очень многообещающе   -  person Nick    schedule 26.03.2013
comment
но я бы не смог декодировать строку на стороне сервера?   -  person Nick    schedule 27.03.2013


Ответы (2)


Проблема в вашем примере кода SavePolygonData заключается в том, что вы пытаетесь использовать данные вершин непосредственно в своем объекте JSON. Вместо этого вам нужно использовать задокументированные методы, чтобы получить значения широты и долготы из массива вершин и сериализовать их.

Чтобы исправить это, вы можете изменить этот код:

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

to:

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 );
  }
person Michael Geary    schedule 28.03.2013
comment
Ой!! Я попробую это и дам вам знать очень скоро! - person Nick; 03.04.2013

Похоже, что getPath() возвращает MVCArray из LatLng, из которых вы должны извлечь широту и долготу, вызывая методы lat() и lng(), а не напрямую обращаясь к свойствам. Если бы это было возможно в JavaScript, эти свойства были бы объявлены private. Но то же самое относится и к MVCArray, для которого у вас есть выбор зацикливания с forEach() или, если вы еще не знакомы с лямбда-функциями, с getAt(), используя результат getLength() в качестве защиты:

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

or

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
}

Эти примеры подходят, если полигон состоит только из одного пути. Если нет, вам также придется перебирать пути.

person Walter Tross    schedule 25.03.2013
comment
Это то, что они предлагают в других похожих ответах, но я не уверен, что смогу его использовать, не полностью изменив свой метод. Я уточню в своем вопросе - person Nick; 25.03.2013
comment
@Nick: хорошо, теперь я вижу, что ваш вопрос немного отличается - к сожалению, у меня нет времени подробно рассказывать о вашем коде :-( - Вы должны перейти по ссылке Dr.Molle, хотя - person Walter Tross; 25.03.2013