data = JSON.parse(data); //преобразовываю полученную строку в объект alert(data.bounds); выдаёт: new YMaps.GeoBounds(new YMaps.GeoPoint(32.133168,52.153467), new YMaps.GeoPoint(34.96279,53.248089))
но map.setBounds(data.bounds); работать не хочет. в FireBug говорит что:
{"bounds":"new YMaps.GeoBounds(new YMaps.GeoPoint(27.560783333333,46.3502), new YMaps.GeoPoint(62.7256158809178,65.118417))"}
первая проверка
вторая
т.е. преобразование не прошло. поэтому я сначала и засомневался в этом способе.
stringify даёт (это наверное и есть содержимое объекта YMaps.GeoBounds)
{"_left":39.2231967595581,"_right":39.744244,"_top":51.8782,"_bottom":50.685257,"_isResultUnbounded":0,"_getResultPoint":function (S, T) { return new (L.GeoPoint)(S, T, this._isResultUnbounded); },"_getDirection":function (T) { T = T || this.getRightTop(); var V = 1e-10, S = T.isUnbounded() ? T.getX() - this._left : D.cycleRestrict(T.getX() - this._left, - V, 360 - V), U = T.getY() - this._bottom; return new R(S, U); },"getCenter":function () { var T = M.getCoordPoint(this._left, this._bottom, 1), V = T.copy().moveBy(this._getDirection()), U = M.fromCoordPoint(T).moveBy(M.fromCoordPoint(V)).scale(0.5), S = M.toCoordPoint(U, 1); return this._getResultPoint(S.getX(), S.getY()); },"constructor":function (T, S) { this._left = T.getX(); this._right = S.getX(); this._top = S.getY(); this._bottom = T.getY(); this._isResultUnbounded = T.isUnbounded() && S.isUnbounded(); },"getTop":function () { return this._top; },"getRight":function () { return this._right; },"getBottom":function () { return this._bottom; },"getLeft":function () { return this._left; },"equals":function (S) { return S._left == this._left && S._top == this._top && S._right == this._right && S._bottom == this._bottom; },"getLeftTop":function () { return this._getResultPoint(this._left, this._top); },"getRightTop":function () { return this._getResultPoint(this._right, this._top); },"getRightBottom":function () { return this._getResultPoint(this._right, this._bottom); },"getLeftBottom":function () { return this._getResultPoint(this._left, this._bottom); },"getSpan":function () { return this._getDirection().apply(Math.abs); },"contains":function (S) { var U = this._getDirection(), T = this._getDirection(S); return T.getX() >= Math.min(0, U.getX()) && T.getX() T.getY() >= Math.min(0, U.getY()) && T.getY() },"copy":function () { return new (this.constructor)(this.getLeftBottom(), this.getRightTop()); },"getMapZoom":function (Y) { var T = 0, W = Y.coordSystem, S = W.getCoordPoint(this._left, this._bottom, 1), V = S.copy().moveBy(this._getDirection()), X = W.fromCoordPoint(S).diff(W.fromCoordPoint(V)).apply(Math.abs), U = Y._state.size.x, Z = X.x; if (Z / U < X.y / Y._state.size.y) { Z = X.y; U = Y._state.size.y; } while (Z > U) { Z = Math.floor(Z / 2); T++; } return Math.max(W.getMaxZoom() - T, 0); }}
вот и думаю: нет ли покороче записи? типа boundFromString, по аналогии с поинт.
в общем с боундом я сделал через обычную строку. но вообще, в далёком будущем, хотелось бы иметь способ передавать javascript объекты. если с GeoBounds такая портянка получается, страшно подумать, что будет если я GeoCollection с 1000 точек захочу передать. т.е. я конечно могу обойтись без этих извращений, но интересно стало -- можно ли?
function GeoBoundsToJSON(bounds) {
return [bounds.getLeftTop().toString(), bounds.getRightTop().toString()];
}
function GeoBoundsFromJSON(json) {
return new YMaps.GeoBounds(YMaps.GeoPoint.fromString(json[0]), YMaps.GeoPoint.fromString(json[1]));
}
// сохранение границ карты
var string = JSON.stringify(GeoBoundsToJSON(map.getBounds()));
// загрузка границ карты
map.setBounds(GeoBoundsFromJSON(JSON.parse(response)));