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

Виктор Тазин (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Виктор Тазин
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 След.
Закрашивания пересечения областей
 
Добрый день.

Предполагаю это случай, когда пересекаются полигоны (подобъекты) внутри одного мультиполигона.

Для каждого объекта карты формируется один фрагмент в разметке SVG, появление прозрачности обусловлено процессом растеризации (с вычитанием из отрисовки пересекающихся областей) SVG в браузере.

Для случаев пересечения полигонов лучше создавать отдельно объект под каждый из них.
Выделение нескольких областей в GIS WebToolkit SE 6.18.0
 
[QUOTE]Михаил Перевёрткин написал:

Вот как пробую я. Компонент по введенной долготой, широтой и радиусом  рисует окружность:
[CODE] private circleObject = new MapObject( new VectorLayer(this.map, {
           alias: '',
           id: Utils.generateGUID(),
           url: '',
       }),
       MapObjectType.MultiPolygon,
       { local: LOCALE.Plane }
   );


   drawObject(value: any) {
 
       const  pointSelector: PointSelector = { contourNumber: this.circleCount++ };

       const center = this.map.geoToPixel(
           new GeoPoint(value.longitude, value.latitude, 0, this.map.ProjectionId),
           this.mapWindow.getMap().getZoom()
       );
       let radius_meter = value.radius * 1000 || 0;
       const latitude = Number(value.latitude) || 0.1;
       const longitude = Number(value.longitude)|| 0.1;
       const mapCalculator = new GWTK.MapCalculations(this.map);
       const pointXYComp = mapCalculator.mapDirectPositionComputation(latitude, longitude, 0, 0);
       const pointGeo = new GeoPoint(pointXYComp.l, pointXYComp.b);
       const pointXY = pointGeo.toMapPoint();
       this.customFields = { radius_meter, pointXY };

       for (let numberPoint = 0; numberPoint < 361; numberPoint = numberPoint + 10) {
           const positions = mapCalculator.mapDirectPositionComputation(latitude, longitude, numberPoint, radius_meter);
           if (positions) {
               console.log(pointSelector);
               this.circleObject.addGeoPoint(new GeoPoint(positions.l, positions.b), pointSelector);
           }
       }

       //this.circleObject.closeObject();


       this.map.setActiveObject(this.circleObject);

       // Показать значение радиуса
       this.showLabel(center.x, center.y, radius_meter);

       //this.map.fitBounds(this.circleObject.getBounds());
   } [/CODE]
При выполнении метода ошибка
[CODE] Cannot read properties of undefined (reading 'map')
TypeError: Cannot read properties of undefined (reading 'map')
   at MultiLineGeometry.getPointListForDrawing (eval at ./GIS WebToolKit SE/debug/source/mapobject/geometry/MultiLineGeometry.ts (http://localhost:8080/js/app.js:3705:1), <anonymous>:193:54)
   at MultiPolygonGeometry.getPointListForDrawing (eval at ./GIS WebToolKit SE/debug/source/mapobject/geometry/MultiPolygonGeometry.ts (http://localhost:8080/js/app.js:3727:1), <anonymous>:140:123)
   at MapObject.getPointListForDrawing (eval at ./GIS WebToolKit SE/debug/source/mapobject/MapObject.ts (http://localhost:8080/js/app.js:3650:1), <anonymous>:965:26)
   at Function.eval (eval at ./GIS WebToolKit SE/debug/source/renderer/SVGrenderable.ts (http://localhost:8080/js/app.js:3826:1), <anonymous>:192:32)
   at step (webpack-internal:///./node_modules/tslib/tslib.es6.mjs:181:21)
   at Object.eval [as next] (webpack-internal:///./node_modules/tslib/tslib.es6.mjs:162:51)
   at eval (webpack-internal:///./node_modules/tslib/tslib.es6.mjs:155:69)
   at new Promise (<anonymous>)
   at __awaiter (webpack-internal:///./node_modules/tslib/tslib.es6.mjs:151:10)
   at SVGrenderable.createGroupNode (eval at ./GIS WebToolKit SE/debug/source/renderer/SVGrenderable.ts (http://localhost:8080/js/app.js:3826:1), <anonymous>:187:61) [/CODE] [/QUOTE]

В текущем примере круг добавляется в виде нового контура для первого полигона геометрии (то есть второй и последующие контуры будут считаться вырезом для первого).

Для добавления самостоятельного контура в селекторе нужно использовать номер объекта:
[CODE] const pointSelector: PointSelector = { objectNumber: this.circleCount++ };[/CODE]
Ошибка же предположительно возникает из-за свойства this.circleCount - оно проинициализировано числом (0)?
Выделение нескольких областей в GIS WebToolkit SE 6.18.0
 
[QUOTE]Михаил Перевёрткин написал:
А можно подсказать как именно корректно работать с мультиполигоном.
В руководстве программиста ПАРБ.00167-01 33 01 не вижу такого раздела.

Раньше насколько я понимаю
1, Брался объект mapObject, если его нет создавался
2. Дальше рисуется объект( через addGeoPoint или интерфейс)
3. Потом this.map.setActiveObject(добавление этого объекта)

А как это делается при работе с мультиполигоном?[/QUOTE]
Мульти-полигон - тип геометрии объекта mapObject (наравне с полигоном, линией...).

Работа с ним такая же, как и с текущим объектом рисования.
Только при создании у него указывается тип геометрии MapObjectType.MultiPolygon.

Что в дальнейшем позволяет добавлять точки по селектору ( addGeoPoint(geoPoint: GeoPoint, selector?: PointSelector)) с указанием разных objectNumber (номер полигона в геометрии).

То есть можно либо сразу использовать его при рисовании (хранить дополнительно номер полигона для селектора добавления точки), либо создать новый MapObject и использовать в качестве хранилища линий отрисовки (копировать точки с текущего объекта рисования в новый полигон геометрии).


P.S. Второй способ с массивом объектов проще в реализации - просто храним копии объектов и перерисовываем все при необходимости.
Выделение нескольких областей в GIS WebToolkit SE 6.18.0
 
[QUOTE]Михаил Перевёрткин написал:
Добрый день.
Мы на основе src\components\GwtkSearchArea\actions\SelectMapCircleAction.ts и src\components\GwtkSearchArea\actions\SelectMapPolygonAction­ ­.ts сделали компоненты по выделение произвольной области и окружности.
Как можно сделать так, что бы  можно было выделять много областей, а не одну. То есть например после окончания выделения полигона(окружности), можно сразу рисовать следующий полигон(окружность), и старый не удалялся .[/QUOTE]
Добрый день,

После создания очередной области необходимо сохранить метрику для дальнейшей отрисовки. Сделать это можно несколькими способами.

Первый вариант с одним объектом карты - использовать геометрию типа "мульти-полигон" и добавлять области в него как отдельные метрики полигонов.
Объект добавить в отрисовку (в метод postRender задачи или обработчика). Тогда будет рисоваться 1 объект карты в виде мульти-полигона.

Второй способ - использовать объект нанесенной области с геометрией "полигон" (либо создавать его копию в виде нового объекта карты ) и добавлять в массив.
Массив объектов добавить в отрисовку. Тогда будут рисоваться все объекты отдельно в виде полигонов.
Увеличение и уменьшение изображения в GIS WebToolkit SE 6.18.0
 
[QUOTE]Михаил Перевёрткин написал:
Добрый день.
Получив GIS WebToolkit SE 6.18.0 и запустив, при нажатии на "Увеличить изображение", а потом на "Уменьшить изображение", они остаются обе активны.
Если это баг, просьба подсказать как поправить.
Если новая функция, просьба подсказать как это работает[/QUOTE]
Добрый день,

Благодарим за обнаружение ошибки.

Обе задачи вызывают свой обработчик взаимодействия с картой, закрывая другой, а сама задача остается активной.

Наиболее простой вариант для исправления - добавить обработчик onAnyActionClose в задачи [I]src/components/GwtkFrameScalingIn/task/GwtkFrameScalingInTask.ts[/I] и [I]src/components/GwtkFrameScalingOut/task/GwtkFrameScalingOutTask.ts[/I]:[CODE]onAnyActionClose(id: string) {
   if (SELECT_POLYGON_ACTION === id) {
       this.mapWindow.getTaskManager().detachTask(this.id);
   }
}[/CODE]
Изменено: Виктор Тазин - 29.03.2024 16:35:18 (Более правильное решение)
Построение полигона и позиционирование на необходимом месте
 
[QUOTE]Михаил Перевёрткин написал:
А может ли быть проблема настройках, или в чем то еще.
При вызове requestRender и когда не менялся масштаб,  то  перерисовка карты выполняется, но где то через 10 секунд[/QUOTE]
Настроек для обновления экрана нет. Тем более по 10 секунд смущает.

Перерисовка должна быть на следующий кадр отрисовки экрана.

Такое впечатление, что какое-то ожидание получения данных висит.

Во вкладке сети (консоли разработчика) запросы без задержек выполняются?
Установка масштаба
 
[QUOTE]Михаил Перевёрткин написал:
Версия GIS WebToolKit 6.9.0[/QUOTE]
Версия от 25.10.2022. С тех пор довольно много правок было сделано.
Но уже в 6.11.0 (21.02.2023) был добавлен компонент "Показать начальный экстент", в котором вызов следующий:
[CODE]map.setView(mapCenter, zoomLevel);
map.overlayRefresh('zoom');[/CODE]
Проверили на версии 6.9.0 - работает.

Попробуйте в консоли вызвать напрямую - отработает или нет:[CODE]GWTK.maphandlers.home()
[/CODE]

Построение полигона и позиционирование на необходимом месте
 
Здравствуйте,

Для перерисовки графических объектов необходимо вызвать [CODE]map.requestRender();[/CODE]либо [CODE]map.overlayRefresh();
[/CODE]
Установка масштаба
 
[QUOTE]Михаил Перевёрткин написал:

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


map.on({ type: 'home', target: 'map' }, this.handlers.home);[/QUOTE]
Попробуйте принудительно контекст задать
[CODE]map.on({ type: 'home', target: 'map' }, map.handlers.home.bind(map.handlers);[/CODE]
либо
[CODE]map.on({ type: 'home', target: 'map' }, (event) => map.handlers.home(event));[/CODE]
Установка масштаба
 
[QUOTE]Михаил Перевёрткин написал:
Да, я запустил с логированием. Ошибок нет.
Когда зашёл в глубь setViewport и overlayRefresh и расставил логи, то тоже ошибок не видно.
Может ли быть, что мы в целях устранения уязвимостей подняли версию jquery lj jquery-1.12.4 и  jquery-ui-1.11.2 и это где то нарушает работу
Как-будто не происходит обновления карты. Тоесть после того как не обновилось, любое действие с картой меняет на положение  которое сделали при помощи setViewport[/QUOTE]
Обновление jquery не должно никак повлиять, раз ошибок нет.

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

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


Можно упростить вызов, но начинка та же самая в итоге:
[CODE]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();

}, [/CODE]
Страницы: 1 2 3 4 След.



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

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