Клуб API Карт

setBounds из JSON

yegor-l
2 декабря 2009, 18:06

Вот такой вопрос возник: что должно быть написано в JSON ответе, чтобы не заморачиваясь с разбором строки можно было сделать так:

map.setBounds(EchoFromServer);

11 комментариев
Подписаться на комментарии к посту
new YMaps.GeoBounds(new YMaps.GeoPoint(0,0), new YMaps.GeoPoint(10,10))
спасибо. но я спрашивал немного не это )))

вроде должно быть так, но не работает: map.setBounds(JSON.parse('{"_left":30,"_right":32,"_top":61,"_bottom":60,"_isResultUnbounded":0}'));
Вам правильно посоветовали.
Если JSON приходит вида:
{bounds : new YMaps.GeoBounds(new YMaps.GeoPoint(0,0), new YMaps.GeoPoint(10,10))}

то можно записать весь json, например, в переменную data и передать bounds  карте:
map.setBounds(data.bounds);

Что означает вот эта строка?
'{"_left":30,"_right":32,"_top":61,"_bottom":60,"_isResultUnbounded":0}')
Что делает метод parse объекта JSON?
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 говорит что:
S.getCenter is not a function anonymous("new YMaps.GeoBounds(new YMaps.GeoPoint(27.861916666667,56.053416666667), new YMaps.GeoPoint(45.537815,62.483083333333))")YMaps.js (строка 11) anonymous(Object)index2.php (строка 53) I()jquery-1....2.min.js (строка 19) anonymous(3)jquery-1....2.min.js (строка 19) YMaps.onLoad(YMaps.Module.CORE,function(...,T)};A=O(L.WayPoint,L.GeocoderResult)});YMaps.js (строка 11)

а та строка взялясь из внутренностей GeoBounds
Подозреваю, что преобразование строки в объект произошло некорректно.

Проверьте является ли полученный объект объектом класса YMaps.GeoBounds:
console.log(data.bounds instanceof YMaps.GeoBounds); // Должно выдать true

Ну и задно проверьте точно ли это не строка:
conole.log(typeof data.bounds); // Должно выдать false
ответ сервера
{"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 точек захочу передать.
т.е. я конечно могу обойтись без этих извращений, но интересно стало -- можно ли?
первая -- false
вторая -- string

(пропали куда-то)
Уберите кавычки:
{"bounds":new YMaps.GeoBounds(new YMaps.GeoPoint(27.560783333333,46.3502), new YMaps.GeoPoint(62.7256158809178,65.118417))}
Тогда bounds будет содержать объект класса YMaps.GeoBounds и никаких дополнительных преобразований делать не нужно будет.
Спасибо!
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)));
Спасибо.