zoukankan      html  css  js  c++  java
  • [ArcGIS API for JavaScript 4.8] Sample Code-Get Started-popups简介

    【官方文档:https://developers.arcgis.com/javascript/latest/sample-code/intro-popup/index.html


     一、Intro to popups

    popups(弹出框)是一种用户与地图之间的交互方式,用户点击相关要素,会弹出对应的popup以查看所选要素的相关信息。每一个view(视图)都有一个popup,其要展示的内容可以来自layers、graphics或者仅仅是鼠标的点击信息。

    popup用于展示layer或者graphic的相关字段信息,也可以用来表现query(查询)或者其他一些和layer、graphic无关的动作。比如,可以展现鼠标点击处的经纬信息。

    这个例子实现弹出popup以展现鼠标点击处的经纬度信息和地址信息。需要实例化Locator类,并使用World Geocoding Service(世界地理编码服务)提供的reverse geocode(反解地理位置工具)计算出鼠标点击处的经纬度和地址信息。

     

    1.代码骨架

     1 <!doctype html>
     2 <html>
     3     <head>
     4         <meta charset="utf-8">
     5         <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
     6         <title>Intro to popups</title>
     7         
     8         <!-- 在线JS API的引入 -->
     9         <link rel="stylesheet" href="https://js.arcgis.com/4.8/esri/css/main.css">
    10         <script src="https://js.arcgis.com/4.8/"></script>
    11         
    12         <!-- 设置样式,正确显示地图 -->
    13         <style>
    14             html,body,#viewDiv{
    15                 padding:0;
    16                 margin:0;
    17                 height:100%;
    18                 width:100%;
    19             }
    20         </style>
    21         
    22         <script>
    23             
    24         </script>
    25     </head>
    26     
    27     <body>
    28         <div id="viewDiv"></div>
    29     </body>
    30 </html>

    其中包括JS API的引入、style样式的设置等等。

     

    2.加载模块并实例化

     1 <script>
     2   require([
     3      "esri/Map",
     4        "esri/views/MapView",
     5        "esri/tasks/Locator",
     6        "dojo/domReady!"
     7        ],function(Map,MapView,Locator){
     8             //使用world geocoding service,创建位置解析器
     9             var locatorTask=new Locator({
    10                 url:"https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer"
    11             });
    12                     
    13             //创建Map
    14             var map=new Map({
    15                 basemap:"streets-navigation-vector"
    16             });
    17                     
    18             //创建MapView
    19             var view=new MapView({
    20                  container:"viewDiv",
    21                  map:map,
    22                  center:[118.79647,32.05838],
    23                  zoom:10
    24             });        
    25     });
    26 </script>

    Map是创建地图的类,MapView是创建视图的类。具体请查看:https://www.cnblogs.com/wangmengdx/p/9385033.html

    Locator类通过使用世界地理编码服务(World Geocoding Service)创建了一个位置解析器。在Locator类的构造函数中需传入url:"https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer"。世界地理编码服务提供了解决方法将地址与坐标互相转换,更多信息请查看:https://geocode.arcgis.com/arcgis/index.html

     

    3.监听view的click事件并在点击处弹出popup

    当鼠标点击view时将触发view的click事件,弹出popup,将点击处的经纬信息展示出来。

     1 //监听view的click事件
     2 view.on("click",function(event){
     3     //停止派发事件,阻止它被分配到其他document节点
     4     event.stopPropagation();
     5                        
     6     //获取点击处的经纬度
     7     //保留3位小数
     8     var lon=Math.round(event.mapPoint.longitude*1000)/1000;
     9     var lat=Math.round(event.mapPoint.latitude*1000)/1000;
    10                         
    11     //配置popup弹出框
    12     view.popup.open({
    13         title:"Reverse geocode:["+lon+","+lat+"]",  //经纬度信息在popup的标题处显示
    14         location:event.mapPoint  //在鼠标点击处弹出popup
    15     });
    16 });

    当view的click事件被触发时先调用event.stopPropagation(),是为了停止派发事件,阻止这个事件被分配到其他document节点,具体信息请查看:http://www.w3school.com.cn/jsref/event_stoppropagation.asp

    event.mapPoint是一个对象,表示鼠标点击的那个地方。event.mapPoint.longitude是鼠标点击处所对应的实地经度值,默认小数点后14位左右。现在想输出小数点后3位,先将原经度值乘以1000,Math.round()方法四舍五入后,再除以1000,就可以起到输出小数点后3位的效果。注意下图中的点不是准确的同一个点,所以数值会有不同。

    经纬度ex1  经纬度ex2  经纬度ex3  经纬度ex4

    view.popup.open()方法配置popup弹出框,在title处配置经纬度信息。设置popup弹出在鼠标点击处。

     

    4.在popup弹出框中添加位置信息(address)

    当鼠标点击view时,触发locatorTask.locationToAddress()方法,传入鼠标点击处信息对象,以获得这一点所对应的实地地址。如果成功找到了鼠标点击处所对应的地址,就把这个地址信息在popup中显示;如果没有找到,就显示错误信息。

    注意这个方法locatorTask.locationToAddress()还是写在前面view的click事件的监听函数中。

     1 //查找鼠标点击处所对应的实地地址
     2 locatorTask.locationToAddress(event.mapPoint).then(function(response){
     3//将鼠标点击处的信息对象event.mapPoint传入函数locationToAddress()
     4     //传入完成后,调用匿名函数,传入参数是locationToAddress()返回的地址信息对象
     5     //如果成功找到地址,将其在popup中显示出来
     6     view.popup.content=response.address;
     7 }).catch(function(error){
     8//如果没找到,则在popup中显示错误信息
     9     view.popup.content="找不到地址"
    10 });

    locatorTask是前面创建的位置解析器(Locator类的实例),将鼠标点击处的信息对象event.mapPoint传入locatorTask的locationToAddress()函数。参数传入完成后,调用匿名函数,这时要传入的参数是之前locationToAddress()返回的地址信息对象response。

    如果查找地址成功,将地址信息在popup中展示出来;之后的catch()函数的意思是,如果前面的代码发生错误即地址信息没有找到,就执行catch()里的匿名函数,在popup里输出错误信息。JavaScript的promise.then().catch()语法请查看相关资料。

     

    5.最终代码及运行效果

     1 <!doctype html>
     2 <html>
     3     <head>
     4         <meta charset="utf-8">
     5         <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
     6         <title>Intro to popups</title>
     7         
     8         <!-- 在线JS API的引入 -->
     9         <link rel="stylesheet" href="https://js.arcgis.com/4.8/esri/css/main.css">
    10         <script src="https://js.arcgis.com/4.8/"></script>
    11         
    12         <!-- 设置样式,正确显示地图 -->
    13         <style>
    14             html,body,#viewDiv{
    15                 padding:0;
    16                 margin:0;
    17                 height:100%;
    18                 width:100%;
    19             }
    20         </style>
    21         
    22         <script>
    23             require([
    24                 "esri/Map",
    25                 "esri/views/MapView",
    26                 "esri/tasks/Locator",
    27                 "dojo/domReady!"
    28                 ],function(Map,MapView,Locator){
    29                     //使用world geocoding service
    30                     var locatorTask=new Locator({
    31                         url:"https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer"
    32                     });
    33                     
    34                     //创建Map
    35                     var map=new Map({
    36                         basemap:"streets-navigation-vector"
    37                     });
    38                     
    39                     //创建MapView
    40                     var view=new MapView({
    41                         container:"viewDiv",
    42                         map:map,
    43                         center:[118.79647,32.05838],
    44                         zoom:10
    45                     });
    46                     
    47                     //监听view的click事件
    48                     view.on("click",function(event){
    49                         //停止派发事件,阻止它被分配到其他document节点
    50                         event.stopPropagation();
    51                         
    52                         //获取点击处的经纬度
    53                         //保留3位小数
    54                         var lon=Math.round(event.mapPoint.longitude*1000)/1000;
    55                         var lat=Math.round(event.mapPoint.latitude*1000)/1000;
    56                         
    57                         //配置popup弹出框
    58                         view.popup.open({
    59                             title:"Reverse geocode:["+lon+","+lat+"]",  //经纬度信息在popup的标题处显示
    60                             location:event.mapPoint  //在鼠标点击处弹出popup
    61                         });
    62                         
    63                         //查找鼠标点击处所对应的实地地址
    64                         locatorTask.locationToAddress(event.mapPoint).then(function(response){
    65                             //将鼠标点击处的信息对象event.mapPoint传入函数locationToAddress()
    66                             //传入完成后,调用匿名函数,传入参数是locationToAddress()返回的地址信息对象
    67                             //如果成功找到地址,将其在popup中显示出来
    68                             view.popup.content=response.address;
    69                         }).catch(function(error){
    70                             //如果没找到,则在popup中显示错误信息
    71                             view.popup.content="找不到地址"
    72                         });
    73                     });    
    74             });
    75         </script>
    76     </head>
    77     
    78     <body>
    79         <div id="viewDiv"></div>
    80     </body>
    81 </html>

      Intro to popups

     

  • 相关阅读:
    黑产及社会工程学-学习历程
    ACE_Get_Opt函数笔记
    PlatformIO+Jlink进行调试
    Mac下搭建基于PlatformIO的嵌入式开发环境(STM32开发)
    选择排序
    插入排序
    JPEG原理详解 (转载)
    双链表基本操作
    单链表基本操作
    顺序表基本操作
  • 原文地址:https://www.cnblogs.com/wangmengdx/p/9417007.html
Copyright © 2011-2022 走看看