arcgis api for javascript学习-使用FeatureLayer结合FeatureTable实现查询并能根据查询结果将视图缩放至结果的范围

本文主要实现的功能是:
输入查询的条件(这里是模糊查询)
在这里插入图片描述

点击查询得到查询结果,并在属性中显示属性(FeatureTable)
在这里插入图片描述

主要的思路:
1. 定义FeatureLayer和FeatureTable,FeatureTable中有个属性zoomToSelection:true可以设置是否根据表和地图联动.(点击表中属性缩放至所选择的要素)点击图中的查询到的结果,表中属性被选中.
2. 点击按钮获取文本框中的查询条件,并将查询条件通过myFeatureLayer.setDefinitionExpression(sql)来筛选得到FeatureLayer的结果.
3. 通过FeatureLayer的点击事件实现点击地图对应表内容被选中.
4. 遍历筛选得到的FeatureLayer并获得最大的范围(union()方法),再通过Map.setExtent(方法缩放到视图.
5. 通过render渲染查询的FeatureLayer

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>FeatureTable - related records</title>
    <link rel="stylesheet" href="https://js.arcgis.com/3.34/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="https://js.arcgis.com/3.34/esri/css/esri.css">
    <script src="https://js.arcgis.com/3.34/"></script>
    <style>
        html, body, #map
        {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
    <script>
        var map;
        require([
            "esri/map",
            "esri/layers/ArcGISDynamicMapServiceLayer",
            "esri/layers/ArcGISTiledMapServiceLayer",
            "esri/layers/FeatureLayer",
            "esri/dijit/FeatureTable",
            "dojo/on",
            "dojo/dom",
            "esri/tasks/query",
            "esri/symbols/SimpleFillSymbol",
            "esri/symbols/SimpleLineSymbol",
            "esri/renderers/SimpleRenderer",
            "esri/geometry/Extent"
        ], function (
            Map,ArcGISDynamicMapServiceLayer,ArcGISTiledMapServiceLayer,FeatureLayer,FeatureTable,on,dom,Query,SimpleFillSymbol,SimpleLineSymbol,SimpleRenderer,Extent
        ) {
            map = new Map("map",{
                logo: false,
                slider: false,
                zoom: 5
            });
            var layer = new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/TestServer/mytile2/MapServer/");
            map.addLayer(layer);
            // 要素图层
            var myFeatureLayer = new FeatureLayer("http://localhost:6080/arcgis/rest/services/TestServer/mytile2/MapServer/1",{
                mode: FeatureLayer.MODE_ONDEMAND,
                outFields: ["*"],
                visible: true,
                id : "fLayer",
                opacity: 0.7
            });

            // 要素表格
            var myFeatureTable = new FeatureTable({
                featureLayer: myFeatureLayer,
                map: map,
                editable: true,
                syncSelection: true,
                showRelatedRecords: true,
                showAttachments: true,
                // zoomToSelection: true,
                // outfields 显示要素属性
                outFields: ["name","Shape_Leng"]
            },"myTable");

            myFeatureTable.startup();

            on(dom.byId("selectBtn"),"click",function (e) {
                // myFeatureTable.startup();
                //移除之前的查询结果
                map.removeLayer(myFeatureLayer);
                var selectText = dom.byId("selectText").value;
                var sql = "name like '%" + selectText + "%'"; // 注意sql语句格式,错了就查询不到
                // console.log(sql);

                myFeatureLayer.setDefinitionExpression(sql);
                var selectionSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
                    new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
                        new dojo.Color("blue"), 1),
                    new dojo.Color("blue"));

                myFeatureLayer.setSelectionSymbol(selectionSymbol); // 设置要素图层被选中标志
                // 监听要素图层点击事件,并传送相应的参数给表格
                // 当地图中要素被点击选中时,与之相关的属性记录也会在要素表格中被选中
                myFeatureLayer.on("click",function (evt) {
                    var idProperty = myFeatureLayer.objectIdField;
                    // console.log(idProperty);
                    var feature, featureId, query;
                    if (evt.graphic && evt.graphic.attributes && evt.graphic.attributes[idProperty]){
                        feature = evt.graphic; //获取要素
                        //点击地图上的要素高亮显示
                        feature.setSymbol(selectionSymbol);
                        map.graphics.add(feature);
                        featureId = feature.attributes[idProperty]; //获取要素id
                        //实例化查询
                        query = new Query();
                        query.returnGeometry = true;
                        query.objectIds = [featureId];
                        query.where = "1=1";
                        myFeatureLayer.selectFeatures(query, FeatureLayer.SELECTION_NEW);
                    }
                });
                var selExtent = new Extent();
                var query = new Query();
                query.where='1=1';
                query.returnGeometry = true;
                query.outFields = ['name'];
                myFeatureLayer.queryFeatures(query, function (featureSet) {
                    var features = featureSet.features;
                    selExtent = features[0].geometry.getExtent();
                    console.log("selExtent start-->",selExtent);
                    for (var i = 0, len = features.length; i < len; i++) {
                        console.log(i,features[i].geometry.getExtent());
                        selExtent = selExtent.union(features[i].geometry.getExtent());
                    }
                    map.setExtent(selExtent);
                });

                // map.setExtent(selExtent);//为啥这个地方不能访问selExtent
                //查询结果进行渲染
                var render = new SimpleRenderer(selectionSymbol);
                myFeatureLayer.setRenderer(render);
                map.addLayer(myFeatureLayer);
                myFeatureTable.refresh();

            });
        });
    </script>
</head>
<body>
<div id="map">
    <input type="text" id="selectText" />
    <input type="button" id="selectBtn" value="查询" />
</div>
<div id="selectRe" style="z-index: 9999; background-color: pink; width: 500px; height: 200px; position: absolute; bottom: 0;left: 0;">
    <div id="myTable"></div>
</div>
</body>
</html>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现使用 QueryTask 绘制多边形查询并将查询结果以表格形式返回,需要进行以下步骤: 1. 引入 ArcGIS API For JavaScript 3.X 版本和 Vue 框架。 2. 在 Vue 实例中创建地图,并添加绘图工具和表格。 ```javascript // 创建地图 var map = new esri.Map("map", { basemap: "streets" }); // 添加绘图工具 var tb = new esri.toolbars.Draw(map); tb.on("draw-end", doQuery); // 添加表格 new Vue({ el: '#table', data: { features: [] } }); ``` 3. 在绘制完成后触发 doQuery 函数进行查询。 ```javascript function doQuery(evt) { tb.deactivate(); var query = new esri.tasks.Query(); query.geometry = evt.geometry; query.outFields = ["*"]; // 查询所有字段 var queryTask = new esri.tasks.QueryTask("your service url"); queryTask.execute(query, showResults); // 执行查询 } ``` 4. 在 showResults 函数中处理查询结果,并将结果渲染到表格中。 ```javascript function showResults(featureSet) { var features = featureSet.features; var data = []; for (var i = 0; i < features.length; i++) { var feature = features[i]; var attributes = feature.attributes; var row = []; for (var j in attributes) { row.push(attributes[j]); } data.push(row); } // 渲染表格 var app = new Vue({ el: '#table', data: { features: data } }); } ``` 完整代码示例: ```html <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" /> <title>QueryTask Demo</title> <link rel="stylesheet" href="https://js.arcgis.com/3.38/esri/css/esri.css"> <style> #map { width: 100%; height: 500px; } #table { margin-top: 20px; } </style> </head> <body> <div id="map"></div> <div id="table"> <table> <thead> <tr> <th>Field 1</th> <th>Field 2</th> <th>Field 3</th> </tr> </thead> <tbody> <tr v-for="feature in features"> <td>{{feature[0]}}</td> <td>{{feature[1]}}</td> <td>{{feature[2]}}</td> </tr> </tbody> </table> </div> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script> <script src="https://js.arcgis.com/3.38/"></script> <script> var map = new esri.Map("map", { basemap: "streets" }); // 添加绘图工具 var tb = new esri.toolbars.Draw(map); tb.on("draw-end", doQuery); // 添加表格 new Vue({ el: '#table', data: { features: [] } }); function doQuery(evt) { tb.deactivate(); var query = new esri.tasks.Query(); query.geometry = evt.geometry; query.outFields = ["*"]; // 查询所有字段 var queryTask = new esri.tasks.QueryTask("your service url"); queryTask.execute(query, showResults); } function showResults(featureSet) { var features = featureSet.features; var data = []; for (var i = 0; i < features.length; i++) { var feature = features[i]; var attributes = feature.attributes; var row = []; for (var j in attributes) { row.push(attributes[j]); } data.push(row); } // 渲染表格 var app = new Vue({ el: '#table', data: { features: data } }); } </script> </body> </html> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值