На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Установка масштаба

Поиск  Пользователи  Правила  Войти
Форум » Серверные приложения » GIS WebToolKit
Страницы: 1 2 След.
RSS
Установка масштаба
 
Добрый день. Решил сделать кнопку "Домой", которая устанавливает по координатам и зуму карту.

Сделал метод в app/gis-webtoolkit/GIS WebToolKit SE/debug/source/handlers.js

home: function(event) {    if (!this.map) {
       return false;
   }
   const mapPoint = new GeoPoint( 37.64109072380669, 55.76864557331052 ,  0, this.map.ProjectionId ).toMapPoint();

  this.map.setViewport(mapPoint);

   var zoom = 7;
   var render = this.map.scaleManager,
       ratio = this.map.getZoomingRatio(zoom);
if (this.map.scaleManager.timer) {
       clearTimeout(this.map.scaleManager.timer);
       this.map.scaleManager.timer = false;
   }
   // обновить карту
   this.map.scaleManager.timer = window.setTimeout(function() {
           render.map.handlers.lastWheelScalingEventTime = 0;
           render.refreshMap();
           return;
       },
       800);

   // выполнить масштабирование
   this.map.scaleManager.zoomAnimate(ratio, null, event.timeStamp);
   return false;
},

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

Добрый день, указанный Вами подход был выполнен для масштабирования по событию прокрутки колеса, когда ratio меняется достаточно часто в процессе анимации.

Для единоразового перехода к конкретному масштабу можно ограничиться вызовом функции applyZoom:

Код
home: function(event) {
    if (!this.map) {
        return false;
    }
    const mapPoint = new GeoPoint(37.64109072380669, 55.76864557331052, 0, this.map.ProjectionId).toMapPoint();
    const zoom = 7;
    
    this.map.setViewport(mapPoint);
    
    const delta = zoom - this.map.options.tilematrix;
    
    if (delta !== 0 && this.map.scaleManager.getCurrentTransformations().getScale() === 1) {
        this.applyZoom(delta, null, { ...event, timeStamp: 250 });
    }
},

В объекте event все также ожидается параметр длительности анимации масштабирования ({timeStamp:number}).

 
Цитата
Виктор Тазин написал:
Добрый день, указанный Вами подход был выполнен для масштабирования по событию прокрутки колеса, когда ratio меняется достаточно часто в процессе анимации.

Для единоразового перехода к конкретному масштабу можно ограничиться вызовом функции applyZoom:
 
Код
 home: function(event) {
    if (!this.map) {
        return false;
    }
    const mapPoint = new GeoPoint(37.64109072380669, 55.76864557331052, 0, this.map.ProjectionId).toMapPoint();
    const zoom = 7;
    
    this.map.setViewport(mapPoint);
    
    const delta = zoom - this.map.options.tilematrix;
    
    if (delta !== 0 && this.map.scaleManager.getCurrentTransformations().getScale() === 1) {
        this.applyZoom(delta, null, { ...event, timeStamp: 250 });
    }
}, 
     В объекте event все также ожидается параметр длительности анимации масштабирования ({timeStamp:number}).  
Когда выполняю описанное выше, после открытия карты и если не выполнять зум ни разу, то сдвинув куда-нибудь карту и нажав кнопку, ничего не происходит. А должно было бы  в указанный выше mapPoint передвинуться  
 
Цитата
Михаил Перевёрткин написал:
Когда выполняю описанное выше, после открытия карты и если не выполнять зум ни разу, то сдвинув куда-нибудь карту и нажав кнопку, ничего не происходит. А должно было бы  в указанный выше mapPoint передвинуться  

Не получается отловить ошибку, всегда переход осуществляется.

Функция может не сработать, когда карта вне границ (если установлены), проекция не поддерживает преобразование через эллипсоид, либо функция вызывается с другим контекстом.

Можно добавить вывод для исключения всех вариантов:

Код
home: function(event) {
    if (!(this instanceof GWTK.Handlers)) {
        console.error('Неправильный контекст');
    }
    
    if (!this.map) {
        return false;
    }
    const mapPoint = new GeoPoint(37.64109072380669, 55.76864557331052, 0, this.map.ProjectionId).toMapPoint();
    
    if (!mapPoint) {
        console.error('Ошибка преобразования координат');
    }else if (this.map.maxBounds && !this.map.maxBounds.contains(mapPoint)) {
        console.error('точка вне границ, переход не выполнен');
    }
    
    const zoom = 7;
    
    this.map.setViewport(mapPoint);
    
    const delta = zoom - this.map.options.tilematrix;
    
    if (delta !== 0 && this.map.scaleManager.getCurrentTransformations().getScale() === 1) {
        this.applyZoom(delta, null, { ...event, timeStamp: 250 });
    }
},
 
Цитата
Виктор Тазин написал:
Цитата
Михаил Перевёрткин написал:
Когда выполняю описанное выше, после открытия карты и если не выполнять зум ни разу, то сдвинув куда-нибудь карту и нажав кнопку, ничего не происходит. А должно было бы  в указанный выше mapPoint передвинуться  

Не получается отловить ошибку, всегда переход осуществляется.

Функция может не сработать, когда карта вне границ (если установлены), проекция не поддерживает преобразование через эллипсоид, либо функция вызывается с другим контекстом.

Можно добавить вывод для исключения всех вариантов:

Код
 home: function(event) {
    if (!(this instanceof GWTK.Handlers)) {
        console.error('Неправильный контекст');
    }
    
    if (!this.map) {
        return false;
    }
    const mapPoint = new GeoPoint(37.64109072380669, 55.76864557331052, 0, this.map.ProjectionId).toMapPoint();
    
    if (!mapPoint) {
        console.error('Ошибка преобразования координат');
    }else if (this.map.maxBounds && !this.map.maxBounds.contains(mapPoint)) {
        console.error('точка вне границ, переход не выполнен');
    }
    
    const zoom = 7;
    
    this.map.setViewport(mapPoint);
    
    const delta = zoom - this.map.options.tilematrix;
    
    if (delta !== 0 && this.map.scaleManager.getCurrentTransformations().getScale() === 1) {
        this.applyZoom(delta, null, { ...event, timeStamp: 250 });
    }
}, 

Пример для воспроизведения:
1. Запустить webtoolkit
2. Сдвинуть в право карту.
3. Выполнит функцию.

Ничего не произойдет. Это насколько понимаю из-за того что delta = 0. Если убрать это условие, то в applyZoom выполнение остановится на

           if (zoom == this.map.options.tilematrix) {
               return;
           }

Можно ли сделать так, что бы при delta = 0, выполнялось только смена центральной позиции? Если да, то какой функцией?
 
Цитата
Михаил Перевёрткин написал:

Пример для воспроизведения:
1. Запустить webtoolkit
2. Сдвинуть в право карту.
3. Выполнит функцию.

Ничего не произойдет. Это насколько понимаю из-за того что delta = 0. Если убрать это условие, то в applyZoom выполнение остановится на

           if (zoom == this.map.options.tilematrix) {
               return;
           }

Можно ли сделать так, что бы при delta = 0, выполнялось только смена центральной позиции? Если да, то какой функцией?
Такая последовательность действий как раз без ошибок возвращает центр в указанную точку, поэтому и отловить не получается.

За смену положения карты отвечает вызов  this.map.setViewport(mapPoint).

Все же еще раз посоветую запустить функцию с логированием (с кодом из ответа выше).
 
Цитата
Виктор Тазин написал:
Цитата
Михаил Перевёрткин написал:

Пример для воспроизведения:
1. Запустить webtoolkit
2. Сдвинуть в право карту.
3. Выполнит функцию.

Ничего не произойдет. Это насколько понимаю из-за того что delta = 0. Если убрать это условие, то в applyZoom выполнение остановится на

           if (zoom == this.map.options.tilematrix) {
               return;
           }

Можно ли сделать так, что бы при delta = 0, выполнялось только смена центральной позиции? Если да, то какой функцией?
Такая последовательность действий как раз без ошибок возвращает центр в указанную точку, поэтому и отловить не получается.

За смену положения карты отвечает вызов  this.map.setViewport(mapPoint).

Все же еще раз посоветую запустить функцию с логированием (с кодом из ответа  выше ).
Да, я запустил с логированием. Ошибок нет.
Когда зашёл в глубь setViewport и overlayRefresh и расставил логи, то тоже ошибок не видно.
Может ли быть, что мы в целях устранения уязвимостей подняли версию jquery lj jquery-1.12.4 и  jquery-ui-1.11.2 и это где то нарушает работу
Как-будто не происходит обновления карты. Тоесть после того как не обновилось, любое действие с картой меняет на положение  которое сделали при помощи setViewport
 
Цитата
Михаил Перевёрткин написал:
Да, я запустил с логированием. Ошибок нет.
Когда зашёл в глубь setViewport и overlayRefresh и расставил логи, то тоже ошибок не видно.
Может ли быть, что мы в целях устранения уязвимостей подняли версию jquery lj jquery-1.12.4 и  jquery-ui-1.11.2 и это где то нарушает работу
Как-будто не происходит обновления карты. Тоесть после того как не обновилось, любое действие с картой меняет на положение  которое сделали при помощи setViewport
Обновление jquery не должно никак повлиять, раз ошибок нет.

Принудительная перерисовка должна происходить при вызове showMap() внутри setViewport.

Пришлите, пожалуйста, текущий код функции home и часть кода с вызовом этой функции.


Можно упростить вызов, но начинка та же самая в итоге:
Код
home: function(event) {
    if (!this.map) {
        return false;
    }
    const mapPoint = new GeoPoint(37.64109072380669, 55.76864557331052, 0, this.map.ProjectionId).toMapPoint();
    const zoom = 7;
    
    this.map.setView(mapPoint, zoom);
    this.map.overlayRefresh();

}, 
 
Цитата
Виктор Тазин написал:
Цитата
Михаил Перевёрткин написал:
Да, я запустил с логированием. Ошибок нет.
Когда зашёл в глубь setViewport и overlayRefresh и расставил логи, то тоже ошибок не видно.
Может ли быть, что мы в целях устранения уязвимостей подняли версию jquery lj jquery-1.12.4 и  jquery-ui-1.11.2 и это где то нарушает работу
Как-будто не происходит обновления карты. Тоесть после того как не обновилось, любое действие с картой меняет на положение  которое сделали при помощи setViewport
Обновление jquery не должно никак повлиять, раз ошибок нет.

Принудительная перерисовка должна происходить при вызове showMap() внутри setViewport.

Пришлите, пожалуйста, текущий код функции home и часть кода с вызовом этой функции.


Можно упростить вызов, но начинка та же самая в итоге:
Код
 home: function(event) {
    if (!this.map) {
        return false;
    }
    const mapPoint = new GeoPoint(37.64109072380669, 55.76864557331052, 0, this.map.ProjectionId).toMapPoint();
    const zoom = 7;
    
    this.map.setView(mapPoint, zoom);
    this.map.overlayRefresh();

},  


       home: function(event) {            if (!(this instanceof GWTK.Handlers)) {
               console.error('Неправильный контекст');
           }
           
           if (!this.map) {
               return false;
           }
           const mapPoint = new GeoPoint(37.64109072380669, 55.76864557331052, 0, this.map.ProjectionId).toMapPoint();
           
           if (!mapPoint) {
               console.error('Ошибка преобразования координат');
           }else if (this.map.maxBounds && !this.map.maxBounds.contains(mapPoint)) {
               console.error('точка вне границ, переход не выполнен');
           }
           
           const zoom =7;
           
           this.map.setViewport(mapPoint);
           
           const delta = zoom - this.map.options.tilematrix;
           if (this.map.scaleManager.getCurrentTransformations().getScale() === 1) {
               this.applyZoom(delta, null, { ...event, timeStamp: 250 });
           }
       },



Вызывается в  компоненте


export default class GwtkHomeIn extends Task {

   /**
    * @constructor GwtkHomeIn
    * @param mapWindow {MapWindow} Экземпляр окна приложения
    * @param id {string} Идентификатор задачи
    */
   constructor( mapWindow: MapWindow, id: string ) {
       super( mapWindow, id );
       this.mapWindow.getTaskManager().detachTask('gwtkselectcirclearea.main');
       this.mapWindow.getTaskManager().detachTask('gwtkselectpolygonarea.main');
   }

   setup() {
       this.mapWindow.getMap().trigger( { type: 'home', target: 'map' } );
       this.mapWindow.getTaskManager().detachTask( this.id );
   }
}


Потом в GIS WebToolKit SE\debug\source\map.js в initEvents добавлено


map.on({ type: 'home', target: 'map' }, this.handlers.home);
 
Цитата
Михаил Перевёрткин написал:

Потом в GIS WebToolKit SE\debug\source\map.js в initEvents добавлено


map.on({ type: 'home', target: 'map' }, this.handlers.home);
Попробуйте принудительно контекст задать
Код
map.on({ type: 'home', target: 'map' }, map.handlers.home.bind(map.handlers);

либо
Код
map.on({ type: 'home', target: 'map' }, (event) => map.handlers.home(event));
Страницы: 1 2 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2025

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности