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

Рисование нескольких окружностей в мультиполигоне

Поиск  Пользователи  Правила  Войти
Форум » Серверные приложения » GIS WebToolKit
Страницы: 1
RSS
Рисование нескольких окружностей в мультиполигоне
 
Добрый день.
Мы на основе src\components\GwtkSearchArea\actions\SelectMapCircleAction.ts  сделали компоненты по выделению произвольной  окружности.
Как можно сделать так, что бы  можно было выделять много областей, а не одну. То есть например после окончания выделения окружности, можно сразу рисовать следующий окружность, и старый не удалялся .

По полигону как вы посоветовали работает (https://gisweb.ru/forum/forum31/14007-vydelenie-neskolkikh-oblastey-v-gis-webtoolkit-se-6.18.0)
У меня получилось сделать рисования много областей, но с одним центром и разными радиусам, как можно сделать так, что после нажатия на правую кнопку можно рисовать окружность в другом месте. Вот код по нажатию на правую кнопку
Код
onMouseDown(event: MouseDeviceEvent) {
      if (this.pointObjectCenter && event.pressedMouseButtonList[2]) {

  
          const count = this.map.getActiveObject()?.getObjectSubObjectsCount() || 0;
          if (count <= 9 && this.circleCenter) {
              const objectNumber = count || -1 + 1;
              let pointSelector: PointSelector = { objectNumber };
              let centerPlane = this.mapWindow.getMap().pixelToPlane(this.circleCenter);
              const geoPoint = this.pointXY.toGeoPoint();
              const centrGeoPoint = centerPlane.toGeoPoint();
              if (geoPoint && centrGeoPoint) {
                  const center = this.map.geoToPixel(
                      centrGeoPoint,
                      this.mapWindow.getMap().getZoom()
                  );
                  let radius = this.circleCenter.distanceTo( event.mousePosition) || 0;
                  if (geoPoint && centrGeoPoint) {
                      let radius_meter = this.calculateTheDistance(
                          centrGeoPoint?.getLatitude(),
                          geoPoint?.getLatitude(),
                          centrGeoPoint?.getLongitude(),
                          geoPoint?.getLongitude()
                      );
  
                      this.customFields = { radius_meter, pointXY: centerPlane };
                            
            
                      const latitude = Number(centrGeoPoint.getLatitude()) || 0.1;
                      const longitude = Number(centrGeoPoint.getLongitude()) || 0.1;
                      const mapCalculator = new GWTK.MapCalculations(this.map);
  
                   
                      for (
                          let numberPoint = 0;
                          numberPoint < 361;
                          numberPoint = numberPoint + 10
                      ) {
                          const positions = mapCalculator.mapDirectPositionComputation(
                              latitude,
                              longitude,
                              numberPoint,
                              radius_meter
                          );
                          if (positions) {
                              this.multiObject.addGeoPoint(
                                  new GeoPoint(positions.l, positions.b),
                                  pointSelector
                              );
                          }
                      }
  
  
                      this.map.setActiveObject(this.multiObject);
  
                 
                      this.showLabel(center.x, center.y, radius_meter);
                      this.circleObject.removeAllPoints();
                      this.mapWindow.setCursor(CURSOR_TYPE.crosshair);
                      this.parentTask.setState(AREA_ACTION_ID, SELECT_CIRCLE_ACTION);
                  }
              } 
          } else {
              this.mapWindow.addSnackBarMessage(
                  'Максимальное количество полигонов - 10'
              );
          }
      }else if (event.originalEvent.button === 0) {
          if (!this.circleCenter) {

              const map = this.mapWindow.getMap();
              const pointXY = map.pixelToPlane(event.mousePosition.clone());

              if (pointXY) {
                  this.circleCenter = event.mousePosition.clone();
              }
          }
      }
  }
 
Добрый день,

Если правильно понял задачу - сейчас по левой кнопке выставляется центр окружности (если он не был задан), а рисование начинается после нажатия правой.

Собственно, можно переместить код задания центра наверх и убрать проверку левой клавиши и существования центра:
Код
onMouseDown(event: MouseDeviceEvent) {
    if (this.pointObjectCenter && event.pressedMouseButtonList[2]) {

        const map = this.mapWindow.getMap();
        const pointXY = map.pixelToPlane(event.mousePosition.clone());

        if (pointXY) {
            this.circleCenter = event.mousePosition.clone();
        }
            

        const count = this.map.getActiveObject()?.getObjectSubObjectsCount() || 0;
        if (count <= 9 && this.circleCenter) {
            const objectNumber = count || -1 + 1;
            let pointSelector: PointSelector = { objectNumber };
            let centerPlane = this.mapWindow.getMap().pixelToPlane(this.circleCenter);
            const geoPoint = this.pointXY.toGeoPoint();
            const centrGeoPoint = centerPlane.toGeoPoint();
            if (geoPoint && centrGeoPoint) {
                const center = this.map.geoToPixel(
                    centrGeoPoint,
                    this.mapWindow.getMap().getZoom()
                );
                let radius = this.circleCenter.distanceTo(event.mousePosition) || 0;
                if (geoPoint && centrGeoPoint) {
                    let radius_meter = this.calculateTheDistance(
                        centrGeoPoint?.getLatitude(),
                        geoPoint?.getLatitude(),
                        centrGeoPoint?.getLongitude(),
                        geoPoint?.getLongitude()
                    );

                    this.customFields = { radius_meter, pointXY: centerPlane };


                    const latitude = Number(centrGeoPoint.getLatitude()) || 0.1;
                    const longitude = Number(centrGeoPoint.getLongitude()) || 0.1;
                    const mapCalculator = new GWTK.MapCalculations(this.map);


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


                    this.map.setActiveObject(this.multiObject);


                    this.showLabel(center.x, center.y, radius_meter);
                    this.circleObject.removeAllPoints();
                    this.mapWindow.setCursor(CURSOR_TYPE.crosshair);
                    this.parentTask.setState(AREA_ACTION_ID, SELECT_CIRCLE_ACTION);
                }
            }
        } else {
            this.mapWindow.addSnackBarMessage(
                'Максимальное количество полигонов - 10'
            );
        }
    }
    // else if (event.originalEvent.button === 0) {
    //     if (!this.circleCenter) {
    //
    //         const map = this.mapWindow.getMap();
    //         const pointXY = map.pixelToPlane(event.mousePosition.clone());
    //
    //         if (pointXY) {
    //             this.circleCenter = event.mousePosition.clone();
    //         }
    //     }
    // }
}
Страницы: 1
Читают тему (гостей: 1)



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

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