要素图层范围查询属性

要素图层范围查询属性

本文主要通过Query和FeatureLayer.setDefinitionExpression来对要素图层进行范围查询属性。查询结果由FeatureTable来显示,且形状也可以显示在地图上


有时候,我们往往需要对要素图层某个范围的属性进行查询。可以通过SQL查询语句,赋值给FeatureLayer.setDefinitionExpression,然后通过FeatureTable来显示查询结果,同时地图上只显示查询要素图。
地图上的要素和表格的要素是关联的,选择其中任何一个,另一个也会显示被选中要素:
这里写图片描述

1.首先,定义地图、要素图层、要素表格。

//底图定义
        var map = new Map("map",{
          basemap: "topo", 
          center:[102.96, 31.65],
           zoom:10
        });
        //要素图层定义
       var  myFeatureLayer = new esri.layers.FeatureLayer("http://localhost:6080/arcgis/rest/services/Test/ft/MapServer/0",{                  
            mode: esri.layers.FeatureLayer.MODE_ONDEMAND,    //按需加载feature
            outFields: ["*"],
            opacity:0.5,
            visible: true,
            id: "fLayer"
           });
       // 要素表格定义
       var myFeatureTable = new FeatureTable({
            featureLayer : myFeatureLayer,
            map : map,
            editable: true,
            syncSelection: true,
            showRelatedRecords: true,
            showAttachments: true,
            // outfields 显示要素属性
            outFields: ["Subbasin","mydb.DBO.subs2.Area","Len1", "Elev", "ElevMin", "ElevMax"],
          }, 'myTableNode');

2.然后,添加查询条件,查询按钮。

<div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'" style="height: 40px;">
            子流域序号:<input id="submin" />to
            <input id="submax" /><br>
            面积范围:
            <input id="areamin" />to
            <input id="areamax" />
            <button id="sqlque">
                查询</button>
        </div>

3.最后,查询条件的读入,查询设置。关键点:移除之前的要素图,判断查询条件是否为空,添加新的要素图,更新要素表格。

  myFeatureTable.startup(); //首先要素表格运行,不能放在点击函数里面,只需要refresh()在点击函数里。
 on(dom.byId("sqlque"), "click", function (e) {
        map.removeLayer(myFeatureLayer);//移除之前的要素图层查询结果
        //范围查询
        var submin = dom.byId("submin").value;//子流域序号最小值
        var submax = dom.byId("submax").value;//最大值
        //判断输入是否为零,若为零则自动设定范围
        if (submin==""){submin=0;} //最小值
        if (submax==""){submax=100;} //最大值
        var sql_sub="Subbasin >="+submin+"and Subbasin<="+submax;  //子流域序号SQL查询字符串
        var areamin = dom.byId("areamin").value;//面积最小值
        var areamax = dom.byId("areamax").value;//最大值
        //判断输入是否为零,若为零则自动设定范围
        if (areamin==""){areamin=0;}
        if (areamax==""){areamax=100000;} 
        var sql_area="Area >="+areamin+"and Area<="+areamax;    //面积SQL查询字符串
        var sql_r=  sql_sub+"and "+sql_area;      //子流域和面积查询字符串连接 注意and后面有空格!
         myFeatureLayer.setDefinitionExpression(sql_r); //使用setDefinitionExpression来进行查询
           //设置被选中标志参数
          var selectionSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
            new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
              new Color("blue"), 1),
            new Color("blue"));
          myFeatureLayer.setSelectionSymbol(selectionSymbol); //设置要素图层被选中标志

          // listen to featurelayer click event to handle selection 
          // from layer to the table. 
          // when user clicks on a feature on the map, the corresponding 
          // record will be selected in the table.   
          //监听要素图层点击事件,并传送相应参数给要素表格
          //当地图中要素被点击选中时,与之相关的属性记录也会在要素表格中被选中
          myFeatureLayer.on("click", function(evt) {
           var idProperty = myFeatureLayer.objectIdField;
           var feature, featureId, query1;
           if (evt.graphic && evt.graphic.attributes && evt.graphic.attributes[idProperty]) {
               feature = evt.graphic; //获取要素形状
               featureId = feature.attributes[idProperty]; //获取要素ID
               //实例化查询参数
               query1 = new Query();  
               query1.returnGeometry = false;  
               query1.objectIds = [featureId];
               query1.where = "1=1";  //取查询中的全部数据
               myFeatureLayer.selectFeatures(query1, FeatureLayer.SELECTION_NEW);
           }
         });
         map.addLayer(myFeatureLayer); //添加要素查询结果图层

         myFeatureTable.refresh(); //更新要素表格

          // listen to show-attachments event
          myFeatureTable.on("show-attachments", function(evt){
            console.log("show-attachments event - ", evt);
          });

          // listen to show-related-records event
          myFeatureTable.on("show-related-records", function(evt){
            console.log("show-related-records event - ", evt);
          });
      })

全部代码:

<!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.18/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="https://js.arcgis.com/3.18/esri/css/esri.css">
    <script src="https://js.arcgis.com/3.18/"></script>
    <style>
        html, body, #map
        {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
    <script>
    require([
      "esri/layers/FeatureLayer",
      "esri/dijit/FeatureTable",
      "esri/tasks/query",
      "esri/geometry/Extent",
      "esri/symbols/SimpleFillSymbol",
      "esri/symbols/SimpleLineSymbol",
      "esri/Color",
      "esri/map",      
      "dojo/dom-construct",
      "dojo/dom",
      "dojo/number",
      "dojo/parser",
      "dojo/ready",
      "dojo/on",
      "dojo/_base/lang",
      "dijit/registry",
      "dijit/form/Button",
      "dijit/layout/ContentPane",
      "dijit/layout/BorderContainer",
      "dijit/form/TextBox"
    ], function (
      FeatureLayer, FeatureTable, Query, Extent, SimpleFillSymbol, SimpleLineSymbol, Color, Map,
      domConstruct, dom, dojoNum, parser, ready, on,lang,registry, Button, ContentPane, BorderContainer, TextBox
    ) {
      parser.parse(); //解译器解译
      ready(function(){        
      //底图定义
        var map = new Map("map",{
          basemap: "topo", 
          center:[102.96, 31.65],
           zoom:10
        });
        //要素图层定义
       var  myFeatureLayer = new esri.layers.FeatureLayer("http://localhost:6080/arcgis/rest/services/Test/ft/MapServer/0",{                  
            mode: esri.layers.FeatureLayer.MODE_ONDEMAND,    //按需加载feature
            outFields: ["*"],
            opacity:0.5,
            visible: true,
            id: "fLayer"
           });
       // 要素表格定义
       var myFeatureTable = new FeatureTable({
            featureLayer : myFeatureLayer,
            map : map,
            editable: true,
            syncSelection: true,
            showRelatedRecords: true,
            showAttachments: true,
            // outfields 显示要素属性
            outFields: ["Subbasin","mydb.DBO.subs2.Area","Len1", "Elev", "ElevMin", "ElevMax"],
          }, 'myTableNode');
          myFeatureTable.startup(); //首先表格运行,不能放在点击函数里面,只需要refresh()在点击函数里。
          //点击函数,进行查询
        on(dom.byId("sqlque"), "click", function (e) {
        map.removeLayer(myFeatureLayer);//移除之前的要素图层查询结果
        //范围查询
        var submin = dom.byId("submin").value;//子流域序号最小值
        var submax = dom.byId("submax").value;//最大值
        //判断输入是否为零,若为零则自动设定范围
        if (submin==""){submin=0;} //最小值
        if (submax==""){submax=100;} //最大值
        var sql_sub="Subbasin >="+submin+"and Subbasin<="+submax;  //子流域序号SQL查询字符串
        var areamin = dom.byId("areamin").value;//面积最小值
        var areamax = dom.byId("areamax").value;//最大值
        //判断输入是否为零,若为零则自动设定范围
        if (areamin==""){areamin=0;}
        if (areamax==""){areamax=100000;} 
        var sql_area="Area >="+areamin+"and Area<="+areamax;    //面积SQL查询字符串
        var sql_r=  sql_sub+"and "+sql_area;      //子流域和面积查询字符串连接 注意and后面有空格!
         myFeatureLayer.setDefinitionExpression(sql_r); //使用setDefinitionExpression来进行查询
           //设置被选中标志参数
          var selectionSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
            new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
              new Color("blue"), 1),
            new Color("blue"));
          myFeatureLayer.setSelectionSymbol(selectionSymbol); //设置要素图层被选中标志

          // listen to featurelayer click event to handle selection 
          // from layer to the table. 
          // when user clicks on a feature on the map, the corresponding 
          // record will be selected in the table.   
          //监听要素图层点击事件,并传送相应参数给要素表格
          //当地图中要素被点击选中时,与之相关的属性记录也会在要素表格中被选中
          myFeatureLayer.on("click", function(evt) {
           var idProperty = myFeatureLayer.objectIdField;
           var feature, featureId, query1;
           if (evt.graphic && evt.graphic.attributes && evt.graphic.attributes[idProperty]) {
               feature = evt.graphic; //获取要素形状
               featureId = feature.attributes[idProperty]; //获取要素ID
               //实例化查询参数
               query1 = new Query();  
               query1.returnGeometry = false;  
               query1.objectIds = [featureId];
               query1.where = "1=1";  //取查询中的全部数据
               myFeatureLayer.selectFeatures(query1, FeatureLayer.SELECTION_NEW);
           }
         });
         map.addLayer(myFeatureLayer); //添加要素查询结果图层

         myFeatureTable.refresh(); //更新要素表格

          // listen to show-attachments event
          myFeatureTable.on("show-attachments", function(evt){
            console.log("show-attachments event - ", evt);
          });

          // listen to show-related-records event
          myFeatureTable.on("show-related-records", function(evt){
            console.log("show-related-records event - ", evt);
          });
      })
      });

    });
    </script>
</head>
<body class="claro esri">
    <div data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="design:'headline'"
        style="width: 100%; height: 100%;">
        <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'" style="height: 40px;">
            子流域序号:<input id="submin" />to
            <input id="submax" /><br>
            面积范围:
            <input id="areamin" />to
            <input id="areamax" />
            <button id="sqlque">
                查询</button>
        </div>
        <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center', splitter:true"
            style="height: 60%">
            <div id="map">
            </div>
        </div>
        <div id="bot" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'bottom', splitter:true"
            style="height: 40%">
            <div id="myTableNode">
            </div>
        </div>
    </div>
</body>
</html>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要获取某个经纬度范围内所有要素属性,需要使用Cesium的ImageryLayer和ImageryProvider API。 首先,你需要创建一个ImageryProvider对象,这个对象包含了WMS服务的信息,例如服务地址、图层名称等。然后,你需要将这个ImageryProvider对象传递给ImageryLayer对象,最终添加到Cesium的场景中。 下面是一个示例代码,可以加载WMS服务并获取指定经纬度范围内所有要素属性: ```javascript // 创建ImageryProvider对象 var imageryProvider = new Cesium.WebMapServiceImageryProvider({ url: 'http://your_wms_service_url', layers: 'your_layer_name' }); // 创建ImageryLayer对象 var imageryLayer = new Cesium.ImageryLayer(imageryProvider); // 添加ImageryLayer到场景中 viewer.imageryLayers.add(imageryLayer); // 指定要查询的经纬度范围 var west = -120.0; var south = 30.0; var east = -110.0; var north = 40.0; // 获取所有要素属性 var promise = Cesium.sampleTerrainMostDetailed(viewer.terrainProvider, [Cesium.Rectangle.fromDegrees(west, south, east, north)]); Cesium.when(promise, function() { var terrainData = promise.valueOf(); var positions = []; var ellipsoid = viewer.scene.globe.ellipsoid; for (var lat = south; lat <= north; lat += 0.01) { for (var lon = west; lon <= east; lon += 0.01) { var position = ellipsoid.cartographicToCartesian(Cesium.Cartographic.fromDegrees(lon, lat)); positions.push(position); } } var promises = Cesium.sampleTerrainMostDetailed(viewer.terrainProvider, positions); Cesium.when(promises, function() { for (var i = 0; i < promises.length; i++) { var terrainHeight = promises[i].height; var cartographic = ellipsoid.cartesianToCartographic(positions[i]); var latitude = Cesium.Math.toDegrees(cartographic.latitude); var longitude = Cesium.Math.toDegrees(cartographic.longitude); // 在这里获取要素属性 } }); }); ``` 这段代码首先创建了一个ImageryProvider对象,然后将其传递给ImageryLayer对象,并将ImageryLayer添加到Cesium场景中。然后指定了要查询的经纬度范围,并通过`sampleTerrainMostDetailed`方法获取了该范围内所有点的高程信息。接下来,通过循环遍历所有点,并将点的经纬度转换为地理坐标系下的位置,再通过`sampleTerrainMostDetailed`方法获取每个点的高程信息。最后,可以在循环中获取每个点所对应的要素属性

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值