基于ArcGIS JS API 的点击查询功能

应用场景:

         点击地图要素,弹出信息窗,左边显示点击要素的图层树(因为是查询的多个图层),右边显示当前所选要素的所有属性数据,可通过树插件实现动态控制要显示的要素。如果不想把属性表里面的所有属性全部显示出来(因为包含一些ObjectId之类的无用字段),可以与后台数据库交互,获取需要显示的字段。

效果图:

详细代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>点击查询</title>
  <link rel="stylesheet" href="http://localhost/arcgis_js_api/library/3.25/3.25/dijit/themes/tundra/tundra.css">
  <link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.25/3.25/esri/css/esri.css" />
  <script type="text/javascript" src="http://localhost/arcgis_js_api/library/3.25/3.25/init.js"></script>

  <style type="text/css">
    *{
      margin:0px;
      padding:0px;
    }
    html,body{
      height:100%;
      width:100%;
      position: relative;
      overflow: hidden;
    }
  </style>

  <script type="text/javascript">
    require([
      'dojo/on',
        "dojo/dom",
        "dojo/dom-attr",
        "dojo/_base/declare",
        "dojo/_base/lang",
        "dojo/_base/array",
      'esri/map',
      'esri/layers/ArcGISDynamicMapServiceLayer',
        "dojo/_base/xhr",
        "esri/InfoTemplate",
        "esri/dijit/InfoWindow",
        "esri/tasks/IdentifyTask",
        "esri/tasks/IdentifyParameters",
        "esri/tasks/IdentifyResult",
        "esri/tasks/QueryTask",
        "esri/tasks/query",
        "esri/tasks/FeatureSet",
        "dojox/collections/Dictionary",
        "dojo/data/ItemFileReadStore",
        "dijit/tree/ForestStoreModel",
        "dijit/Tree",
        "esri/symbols/SimpleLineSymbol",
        "esri/geometry/Polyline",
        "esri/geometry/Polygon",
        "esri/geometry/geometryEngine",
        "esri/symbols/SimpleMarkerSymbol",
        "esri/Color",
        "esri/graphic",
    ],function(
      on,
      dom,
      domAttr,
      declare,
      lang,
      arrayUtil,
      Map,
      ArcGISDynamicMapServiceLayer,
      xhr,
      InfoTemplate,
      InfoWindow,
      IdentifyTask,
      IdentifyParameters,
      IdentifyResult,
      QueryTask,
      Query,
      FeatureSet,
      Dictionary,
      ItemFileReadStore,
      ForestStoreModel,
      Tree,
      SimpleLineSymbol,
      Polyline,
      Polygon,
      geometryEngine,
      SimpleMarkerSymbol,
      Color,
      Graphic
    ) {
      var map = new Map('mapDiv');
      var layer1 = new ArcGISDynamicMapServiceLayer("https://localhost:6443/arcgis/rest/services/SampleWorldCities/MapServer");
      map.addLayer(layer1);
      var clickQuery ,_clickUrl,_clickTree;
      var _clickIds;
      pointQueryClick();


      map.on("click",function(evt){
        if(clickQuery){
          identifyQuery(_clickUrl, _clickIds,
            evt.mapPoint, function(results, map) {
              if (results.length > 0) {
                // 利用hashtable进行对应的生成,获取相同名称的属性值,并放到同一个key对应的value中
                var hashtable = new Dictionary();
                // 这里生成新的数组,获取名字相同的图层名
                for (var i = 0; i < results.length; i++) {
                  if (!hashtable
                    .containsKey(results[i].layerName)) {
                    hashtable.add(
                      results[i].layerName,
                      [results[i].feature]);
                  } else {
                    var arrayFeature = hashtable
                      .item(results[i].layerName);
                    arrayFeature
                      .push(results[i].feature);
                  }
                  addGraphicsToMap(results[i].feature.geometry,null,null,null,null,null);
                }
                if (_clickTree) {
                  _clickTree.destroy();
                }
                handler_click_query(hashtable, evt);
              } else {
                alert("当前点未查询到任何元素");
              }
            });
        }

      });

        /**
         * 点击查询
         */
        function pointQueryClick(){
          _clickUrl = "https://localhost:6443/arcgis/rest/services/SampleWorldCities/MapServer";
          _clickIds = [0,1,2];
          clickQuery = true;
        }
        function identifyQuery(url, layerIds, geometry,bufferCallback) {
          var identifyTask = new IdentifyTask(url);
          var identifyParams = new IdentifyParameters();
          identifyParams.returnGeometry = true;
          identifyParams.tolerance = 5;
          identifyParams.layerIds = layerIds;
          identifyParams.layerOption = IdentifyParameters.LAYER_OPTION_VISIBLE;
          identifyParams.geometry = geometry;
          identifyParams.width = map.width;
          identifyParams.height = map.height;
          identifyParams.mapExtent = map.extent;
          identifyParams.spatialReference = map.spatialReference;
          identifyTask.execute(identifyParams, lang.hitch(this,
            function(results) {
              if (lang.isFunction(bufferCallback)) {
                bufferCallback(results, map);
              }
            }), function(err) {
          });
        }
        /**
         * 处理点击查询 hashtable key 为图层名称 value 为 feature数组
         */
        function handler_click_query (hashtable, evt) {
          var table_tree = "<div style=\"height:280px;overflow:hidden;\"><div id=\"pointQueryResult\" style=\"padding-left:0px;overflow:visible\" > <table width=\"375\" cellpadding=\"0\" style=\"border-width: 1px;border-color: #666666;border-collapse: collapse;\"><tr><th style=\"border:1px solid #666666;\">图层列表</th><th style=\"border:1px solid #666666;\">详细信息</th></tr><tr valign=\"top\">"
            + "<td style=\"width:140px;height:242px;vertical-align: top;border:1px solid #666666;\">"
            + "<div id=\"showLayerResult\" style=\"overflow:auto;width:100%;height:100%;margin:0px;padding:0px;\">";
          var treeData = [];
          hashtable.forEach(function(entry) {
            var item = {};
            item.id = entry.key;
            item.name = entry.key;
            item.type = "test";
            item.children = [];
            treeData.push(item);
            for (var i = 0; i < entry.value.length; i++) {
              var featureId = entry.value[i].attributes['FID']
                ? entry.value[i].attributes['FID']
                : entry.value[i].attributes['OBJECTID'];
              item.children.push({
                _reference : entry.key
                  + featureId
              });
              treeData.push({
                id : entry.key + featureId,
                name : featureId,
                type : "feature"
              });
            }
          });
          var data = {
            identifier : 'id',
            label : 'name',
            items : treeData
          };
          var store = new ItemFileReadStore({
            data : data
          });
          var treeModel = new ForestStoreModel({
            store : store,
            query : {
              type : "test"
            },
            childrenAttrs : ["children"]
          });

          table_tree += "<div id='treeThree'></div>";
          table_tree += "</div>";
          table_tree += "</div>";
          table_tree += "<td style=\"width:290px;height:245px;vertical-align: top;border: 1px solid #666666;\"><div style=\"overflow:auto;width:100%;height:100%;margin:0px;padding:0px;\" id='show_panel_attributes'>";
          table_tree += "</div></td></tr></table><div></div></div></div><div style=\"display:inline-block\"><input id=\"errorInfo\" style=\"display:none;\" type=\"button\" value=\"错误信息\"/><input id=\"errorSub\" style=\"float: right; display: none;\" type=\"button\" value=\"错误上报\"/></div>";
          map.infoWindow.setTitle("点击选择查询");
          map.infoWindow.setContent(table_tree);
          var tree = new Tree({
            model : treeModel,
            autoExpand : true,
            showRoot : false
          }, "treeThree");
          tree.startup();
          tree.on("click", function(item, node, evt) {
            // 获取当前点击的tree的id值
            if (!node.hasChildren()) {// 判断有没有子节点
              var selectId = item.id[0];// 当前的objectid
              var selectName = item.name[0];
              var parentId = node.getParent(selectId).item.id[0];// 图层名称
              var featureArray = hashtable.item(parentId);
              for (var i = 0; i < featureArray.length; i++) {
                if (selectName == (featureArray[i].attributes['FID'] ? featureArray[i].attributes['FID']: featureArray[i].attributes['OBJECTID'])) {
                    // 然后调用对应的单击事件方法
                    var content = _doFeatureForClickQuery(featureArray[i]);
                    domAttr.set('show_panel_attributes',
                      'innerHTML', content);
                    break;
                }
              }
            }
          });
          tree.on("load", function() {
            var childrenArray = tree.rootNode.getChildren();
            if (childrenArray.length > 0) {
              var key = childrenArray[0].item.id[0];
              var featureArray = hashtable.item(key);
              if (featureArray.length > 0) {
                  var content = _doFeatureForClickQuery(featureArray[0]);
                  domAttr.set('show_panel_attributes','innerHTML', content);
              }
            }
          });
          _clickTree = tree;
          map.infoWindow.resize(400, 360);
          map.infoWindow.show(evt.screenPoint, map
            .getInfoWindowAnchor(evt.screenPoint));
        }

        /**
         * 点击查询展示属性表里的所有字段
         */
        function _doFeatureForClickQuery (feature) {
          var contents = "";
          contents += "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse: collapse;\">";
          var flag = 0;
          for (var p in feature.attributes) {
            if (p.toString().toLowerCase().indexOf('shape') != -1
              || p.toString().toLowerCase()
                .indexOf('objectid') != -1
              || p.toString().toLowerCase()
                .indexOf('enabled') != -1)
              continue;
            contents += "<tr>";
            if (flag == 0) {
              contents += "<td height=\"20\" width=\"70\" style=\"border-bottom:1px solid #666666;border-right:1px solid #666666;text-align:right;\">";
            } else {
              contents += "<td height=\"20\" width=\"70\" style=\"border-top:1px solid #666666;border-bottom:1px solid #666666;border-right:1px solid #666666;text-align:right;\">";
            }
            contents += p;
            contents += "</td>";
            if (flag == 0) {
              contents += "<td width=\"125\" style=\"border-bottom:1px solid #666666;border-left:1px solid #666666;border-right:1px solid #666666;padding-left:2px;\">";
            } else {
              contents += "<td width=\"125\" style=\"border:1px solid #666666;padding-left:2px;\">";
            }
            flag++;
            contents += feature.attributes[p].toString()
              .toLowerCase() == "null"
              ? ""
              : feature.attributes[p];
            contents += "</td>";
            contents += "</tr>";
          }
          contents += "</table>";
          return contents;
        }

        function addGraphicsToMap (geometry) {
          var symbol = null;
          switch (geometry.type) {
            case "point" :
              symbol = new SimpleMarkerSymbol(
                SimpleMarkerSymbol.STYLE_CIRCLE, 10,
                new SimpleLineSymbol(
                  SimpleLineSymbol.STYLE_SOLID,
                  new Color([255, 0, 0]), 1),
                new Color([0, 255, 0, 0.25]));
              break;
            case "polyline" :
              symbol = new SimpleLineSymbol(
                SimpleLineSymbol.STYLE_SOLID, new Color([
                  255, 0, 0, 0.8]), 4);
              break;
          }
          var _graphic = new Graphic(geometry,symbol);
          map.graphics.add(_graphic);
        }
    }
    )
  </script>
</head>
<body class="tundra">
  <div id="mapDiv" style="float:left;width: 100%;height: 100%;"></div>
</body>
</html>

上面的代码中是把属性表中所有的属性全部都显示出来了,要实现控制显示字段的话可自行修改。主要用到dojo 里面的xhr。下面的代码可以参考一下:

function fieldsAliansHandler(feature,parentId){
  var content = {"layerAlias": parentId};
  xhr.post({
    url :  "/clickQuer/showfields",   //后台访问地址
    handleAs : 'json',
    content:content,
    load : lang.hitch(this, function(response){
      pointFieldsAlians(feature,response);
    }),
    error : function(response, ioArgs) {
    }
  });
}
function pointFieldsAlians(feature,response){
  addGraphicsToMap(feature.geometry);
  var contents = "";
  contents += "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse: collapse;\">";
  var flag = 0;
  for(var i=0;i<response.length;i++){
    for (var p in feature.attributes) {
      if (p.toString().toLowerCase().indexOf('shape') != -1
        || p.toString().toLowerCase()
          .indexOf('objectid') != -1
        || p.toString().toLowerCase()
          .indexOf('enabled') != -1)
        continue;
      if(p.toString().toLowerCase() == response[i]["fieldName"] || p.toString() == response[i]["aliasName"]){
        contents += "<tr>";
        if (flag == 0) {
          contents += "<td height=\"20\" width=\"80\" style=\"border-bottom:1px solid #666666;border-right:1px solid #666666;text-align:right;\">";
        } else {
          contents += "<td height=\"20\" width=\"80\" style=\"border-top:1px solid #666666;border-bottom:1px solid #666666;border-right:1px solid #666666;text-align:right;\">";
        }
        contents += response[i]["aliasName"];
        contents += "</td>";
        if (flag == 0) {
          contents += "<td width=\"150\" style=\"border-bottom:1px solid #666666;border-left:1px solid #666666;border-right:1px solid #666666;padding-left:2px;\">";
        } else {
          contents += "<td width=\"150\" style=\"border:1px solid #666666;padding-left:2px;\">";
        }
        flag++;
        contents += feature.attributes[p].toString()
          .toLowerCase() == "null"
          ? ""
          : feature.attributes[p];
        contents += "</td>";
        contents += "</tr>";
      }

    }
  }
  contents += "</table>";
  domAttr.set('show_panel_attributes','innerHTML', contents);
}

要显示指定字段的话,其实跟上面的doFeatureForClickQuery差不多,无非就是多了个字段名的比较。

展开阅读全文

没有更多推荐了,返回首页