Настраиваемое всплывающее окно ArcGIS Esri

#vue.js #arcgis #esri #arcgis-js-api

#vue.js #arcgis #esri #arcgis-js-api

Вопрос:

Я использую Vue.js для моего веб-приложения. Я создал пользовательский всплывающий элемент html и попытался добавить его в пользовательский интерфейс (поверх значка дома, который вы можете видеть в примере), но я не могу сделать так, чтобы он отображался в координатах, на которые нажимается. Я знаю, что могу сделать это, добавив в пользовательский интерфейс view и установив положение «вручную», но я не смог найти ни одного примера установки конкретных координат. Заранее благодарю вас за помощь.

   this.viewt.ui.add(document.getElementsByClassName("popup")[0], {position: "manual"});  

пример

Код шаблона

 <template>
<div class="popup" v-if="openPopUp" ref="popupwindow">
        <article class="house-card" id="popup-test">
          <div class="img-wrapper">
            <img class="post-image"
                 src="https://www.comitatoaurora.com/wp-content/uploads/2019/11/contemporary-exterior.jpg"/>
            <div class="middle">
              €{{ Math.round(this.object.Price) }}
            </div>
          </div>
          <div class="article-details" :key="this.object.Address" @mouseover="hover = true"
               @mouseleave="hover = false">

            <div class="post-category">
              <div>
                {{
                  this.object.Address.replace(this.object.Address.substring(this.object.Address.indexOf(','),
                      this.object.Address.indexOf(',')   9), ', ')
                }}<span
                  style="margin: 0.3vw"></span>

              </div>
            </div>
            <div class="percentage-circle">
              <div class="progress-single">
                <v-progress-circular
                    color="rgba(81, 87, 102, 0.99)"
                    :size="30"
                    :width="2"
                    :value="this.object.Risk"
                >{{ this.object.Risk }}
                </v-progress-circular>
                <div class="progress-text">
                  <p>Risk</p>
                  <p>Score</p>
                </div>
              </div>
              <div class="progress-single">
                <v-progress-circular
                    color="rgba(81, 87, 102, 0.99)"
                    :size="30"
                    :width="2"
                    :value="this.object.Gross_rental_yield*10"
                >{{
                    Math.round((this.object.Gross_rental_yield  
                        Number.EPSILON) * 10) / 10
                  }}
                </v-progress-circular>
                <div class="progress-text">
                  <p>Gross</p>
                  <p>Yield</p>
                </div>
              </div>


              <div class="progress-single">
                <v-progress-circular
                    color="rgba(81, 87, 102, 0.99)"
                    :size="30"
                    :width="2"
                    :value="this.object.Net_yield*100/5"
                >{{ Math.round((this.object.Net_yield   Number.EPSILON) * 10) / 10 }}
                </v-progress-circular>
                <div class="progress-text">
                  <p>Net</p>
                  <p>Yield</p>
                </div>
              </div>
            </div>
            <div class="percentage-circle metrics-level">
              <div class="bottom-metric"><img height="12vh"
                                              src="../../public/img/year.svg"
                                              alt="year"/><b>{{
                  this.object.ConstructionYear
                }} </b></div>
              <div class="headerDivider"></div>

              <div class="bottom-metric"><img height="12vh"
                                              src="../../public/img/rent.svg"
                                              alt="rent"/><b>{{ this.object.Estimated_Rent }}€/mo</b>
              </div>
              <div class="headerDivider"></div>
              <div class="bottom-metric" style="margin-left: 0.15vw !important;"><img height="12vh"
                                                                                      src="../../public/img/square.svg"
                                                                                      alt="square"/>
                <b>{{ this.object.Sqm }}m<sup>2</sup></b></div>
            </div>
            <transition name="fadeo">
              <div v-if="hover" class="overlay">
                <router-link :to="{name:'card', params: { id: this.id }}">
                  <div class="overlay-text"> View Asset</div>
                </router-link>
              </div>
            </transition>
          </div>
        </article>
      </div>
      </template>  

Комментарии:

1. Это странно, вы можете добавить код шаблона всплывающего окна ?, и как вы добавляете его в слой ?.

2. да, я добавил код шаблона к первоначальному вопросу

3. Я создаю MapView и пытаюсь добавить элемент в его пользовательский интерфейс, поскольку он полностью настраиваемый

Ответ №1:

Существует два способа открытия всплывающего окна над выбранным объектом,

  1. автоматически, например, при выборе объекта,
  2. вручную, используя open метод всплывающего окна.

Если вы выбрали 1), вам необходимо установить PopupTemplate для слоя или графики. У вас есть несколько способов определить пользовательский контент для PopupTemplate , например, с помощью функции или обещания.

ArcGIS API — содержимое PopupTemplate

Если вы выбрали 2), то вам необходимо,

  1. отключите поведение по умолчанию, если вид (автоматически открывается в false),
  2. прослушивание событий щелчка,
  3. при каждом событии щелчка вручную открывайте всплывающее окно (если объект был выбран) с точкой карты события щелчка в качестве местоположения
 view.popup.autoOpenEnabled = false; // <- disable view popup auto open
view.on("click", function (event) { // <- listen to view click event
  if (event.button === 0) { // <- check that was left button or touch
    view.popup.open({ // <- open popup
      location: event.mapPoint, // <- use map point of the click event
      fetchFeatures: true // <- fetch the selected features (if any)
    });

  }
});
  

Комментарии:

1. дело в том, что мое всплывающее окно добавляется как обычный html-элемент, а не popUpTemplate, поскольку его создание только с использованием поля «содержимое» предлагает слишком ограниченные возможности оформления. Поэтому использование ‘view.popup.open’ здесь не сработает. я ищу в основном ту же функцию, но для добавления htmlэлемента

2. Извините за задержку.. Я вижу .. Итак, я думаю, что у вас есть несколько вариантов, i) вы можете сохранить всплывающее окно esri и использовать свой контент, ii) вы можете выбрать положение экрана по щелчку и переместить свое пользовательское всплывающее окно для соответствующего отображения, iii) отметьте выбранный объект на карте и отобразите свой контент висправлена позиция .. Я думаю, что i) и iii) являются хорошими возможностями и просты в реализации, ii) будет зависеть от того, насколько универсален ваш всплывающий компонент

3. Спасибо, я думаю, что идея с положением экрана подойдет мне!

4. Добавление этой строки решило мою проблему (view.popup.open не создавал всплывающее окно) — большое спасибо cabesuon: view.popup.autoOpenEnabled = false;