zoukankan      html  css  js  c++  java
  • arcgis js 3.x 之弹框拖动后添加引导线

    arcgis js 3.x 之弹框拖动后添加引导线

    效果:

    原理:

    1.先创建一个graphicLayer放到地图里面

    2.通过map.infoWindow.openPopups获取到点的经纬度和弹框的屏幕坐标

    3.通过map.toMap(new ScreenPoint(x,y)将屏幕坐标转换为经纬度

    4.用两个点的经纬度在地图上面绘制一条虚线graphic

    5.将线添加到map里面的graphicLayer里面

    6.每40毫秒调用一下2~5步,每次调用前先清除一下graphicLayer里面的graphic

    代码:

    1.创建地图和graphicLayer

     
      var map
      var graphicsLayer
    map = new Map("mapId", {
            logo:false,
            showAttribution: false
          })
          // 添加底图
          var tileInfo = new TileInfo({
            dpi: 90.71428571427429,
            rows: 256,
            cols: 256,
            compressionQuality: 0,
            origin: {
              x: -180,
              y: 90
            },
            spatialReference: {
              wkid: 4326
            },
          })
          var vecLayer = WebTiledLayer('http://{subDomain}.tianditu.com/DataServer?T=vec_c&x={col}&y={row}&l={level}&tk=42ed4b29c64f51d74daafc226d01064b', {
            subDomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
            tileInfo: tileInfo
          })
          var labelLayer = WebTiledLayer('http://{subDomain}.tianditu.com/DataServer?T=cva_c&x={col}&y={row}&l={level}&tk=42ed4b29c64f51d74daafc226d01064b', {
            subDomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
            tileInfo: tileInfo
          })
          map.addLayers([vecLayer, labelLayer])
        // 添加引导线图层 graphicsLayer
    = new GraphicsLayer() map.addLayer(graphicsLayer)
        // 刷新引导线 setInterval(()
    => { consol () }, 40) // 定位 var extent = new Extent({ xmax: 116.720392, xmin: 116.102933, ymax: 40.011797, ymin: 39.809015, spatialReference: { wkid: 4326 } }) map.setExtent(extent)

    2.添加点图层

    function getOtherFeatures (list) {
        var gras = []
        var json = {}
        var tempJson = {}
        for (var i = 0; i < list.length; i++) {
            tempJson = {
              "type":"Feature",
              "properties":{
                "Id": list[i].id,
                "name": list[i].name,
                "lon": list[i].gpsLon,
                "lat": list[i].gpsLat,
                "dzEventName": list[i].dzEventName,
                "remark": list[i].remark
              },
              "geometry":{
                "type":"Point",
                "dzEventName": list[i].dzEventName,
                "coordinates":[Number(list[i].gpsLon),Number(list[i].gpsLat)]
              }
          }
          gras.push(tempJson)
        }
        json.features = gras
        json.type = 'FeatureCollection'
        // 执行渲染点和弹窗方法
        addGeoJsonToMap_other(json)
      }
      // 其他不显示弹窗的点添加到地图
      function addGeoJsonToMap_other(data){
        require(["esri/map",
            "./geojsonlayer.js",
            "esri/geometry/Point",
            "esri/SpatialReference",
            "esri/geometry/ScreenPoint",
            "dojo/on",
            "dojo/dom",
            "dojo/domReady!"],
          function (Map, geojsonlayer, Point, SpatialReference,ScreenPoint,on, dom) {
            geoJsonLayer = {}
            geoJsonLayer = new geojsonlayer({
              baseMap:map,
              data: data,
              id: 'pointLayer_other'
            });
            geoJsonLayer.dataType="geojson";
            map.addLayer(geoJsonLayer);
          });
      }

    3.添加、清除引导线方法

    function consol () {
        require(["esri/map",
            "esri/Color",
            "esri/graphic",
            "esri/geometry/Point",
            "esri/geometry/Polyline",
            "esri/symbols/SimpleLineSymbol",
            "esri/SpatialReference",
            "esri/geometry/ScreenPoint",
            "dojo/on",
            "dojo/dom",
            "dojo/domReady!"],
          function (Map,Color,Graphic,Point,Polyline,SimpleLineSymbol, SpatialReference,ScreenPoint,on, dom) {
            //清除线
            graphicsLayer.clear()
            //获取当前打开的弹框
            let popups = map.infoWindow.openPopups
            popups.forEach((e) => {
              // 点坐标
              let p = e.location
              // 弹框坐标
              let offsetP = new ScreenPoint(e.domNode.offsetLeft + e.wrapperNode.offsetLeft, e.domNode.offsetTop)
              let winP = map.toMap(offsetP)
              // 生成线
              var paths = [[winP.x, winP.y],[p.x, p.y]];
              var line = new Polyline(paths);
              var sls = new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH,new Color([255,0,0]),3);
              var graphic = new Graphic(line,sls);
              graphicsLayer.add(graphic);
            })
        })
      }

    钻研不易,转载请注明出处。。。。。。

  • 相关阅读:
    面向对象与类
    引用数据类型
    方法
    java for 语句的用法
    java 数组
    Scanner与Random
    java基本语法
    java介绍及安装。
    数据库设计
    NFS相关、NFS服务端安装配置、exportfs命令、nfs客户端的问题
  • 原文地址:https://www.cnblogs.com/s313139232/p/15071509.html
Copyright © 2011-2022 走看看