ArcGis Esri 自定义弹出窗口

Posted

技术标签:

【中文标题】ArcGis Esri 自定义弹出窗口【英文标题】:ArcGis Esri Custom Popup 【发布时间】:2021-02-24 14:28:45 【问题描述】:

我将 Vue.js 用于我的 Web 应用程序。我创建了一个自定义 html 弹出元素并尝试将其添加到 UI(在示例中可以看到的房屋图标顶部),但我无法使其出现在单击的坐标上。我知道我可以通过添加到视图 UI 并将位置设置为“手动”来做到这一点,但我找不到任何设置特定坐标的示例。提前感谢您的帮助。

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

example

模板代码

<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"
                    :
                    :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"
                    :
                    :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"
                    :
                    :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 
                                              src="../../public/img/year.svg"
                                              /><b>
                  this.object.ConstructionYear
                 </b></div>
              <div class="headerDivider"></div>

              <div class="bottom-metric"><img 
                                              src="../../public/img/rent.svg"
                                              /><b> this.object.Estimated_Rent €/mo</b>
              </div>
              <div class="headerDivider"></div>
              <div class="bottom-metric" style="margin-left: 0.15vw !important;"><img 
                                                                                      src="../../public/img/square.svg"
                                                                                      />
                <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>

【问题讨论】:

这很奇怪,能不能把弹窗模板代码加进去,你是怎么加到图层里的? 是的,我在最初的问题中添加了模板代码 我正在创建 MapView 并尝试向其 UI 添加一个元素,因为它是完全自定义的 【参考方案1】:

有两种方法可以在所选功能上打开弹出窗口,

    自动,例如在选择功能时, 手动,使用弹出open 方法。

如果您选择 1),则必须为图层或图形设置 PopupTemplate。您可以通过多种方式为 PopupTemplate 定义自定义内容,例如使用函数或承诺。

ArcGIS API - PopupTemplate content

如果您选择了 2),那么您需要,

    如果视图禁用默认行为(自动打开为 false), 监听点击事件, 在每个点击事件上手动打开弹出窗口(如果选择了一个功能),点击事件的地图点作为位置
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)
    );

  
);

【讨论】:

问题是,我的弹出窗口是作为常规 html 元素添加的,而不是 popUpTemplate,因为仅使用“内容”字段创建它提供的样式选项太有限。所以使用 'view.popup.open' 在这里不起作用。我正在寻找基本相同的功能,但要添加 HTMLElement 抱歉耽搁了......单击并浮动您的自定义弹出窗口以相应地显示,iii)在地图上标记所选功能并将您的内容显示在固定位置..我认为 i)和 iii)是很好的可能性并且易于实施,ii)取决于您的你的弹出组件有多通用 谢谢,我认为屏幕位置的想法对我有用! 添加这一行解决了我的问题(view.popup.open 没有创建弹出窗口) - 非常感谢 cabesuon: view.popup.autoOpenEnabled = false;

以上是关于ArcGis Esri 自定义弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

关闭一个自定义弹出窗口UIViewController并立即显示另一个自定义弹出窗口UIViewController -SWIFT

自定义警报/弹出窗口并持有 JS 引擎

可以在文件”另存为“的弹出窗口上添加自定义的路径选择按钮?

如何使用自定义布局创建对话框弹出窗口?

javascript--自定义弹出登陆窗口(弹出窗)

ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件