除了地图基本的放大缩小等功能,在webgis上的二次开发中,查询功能 通常作为需求的一部分需要我们去实现,今天就给大家详细的分析实例代码中的查询功能:Query features from a FeatureLayer

话不多说,进入今天的实例代码的分析

网址:https://developers.arcgis.com/javascript/latest/sample-code/featurelayer-query/index.html

界面:

然后我们来看代码:

第一段还是引用,这里我没标注释,希望和我一样基础一般的读者可以去api上查这些引用,印象会比较深。

第二段:这里是定义一些变量,方便引用。还有一些地图的设置,这些不详细介绍了,有不懂的读者请留言,我会解答。

第三段开始比较重要:

从大框架上看:当视图(view)加载好以后,进行一些操作,之后进行getvalues,getuniquevalues,addtoselect以及createbuffer等操作

中间这些操作是这样的:1.建立一个查询createQuery,API reference的截图在下面. 2.执行查询,返回一个FeatureSet

第四段:

第五段:

最后附上所有代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
    <title>Query features from a FeatureLayer - 4.10</title>
    <link rel="stylesheet" href="https://js.arcgis.com/4.10/esri/css/main.css">
    <script src="https://js.arcgis.com/4.10/"></script>
    <style>

        html,
        body,
        #viewDiv {
            height: %;
            width: %;
            margin: ;
            padding: ;
        }

        #infoDiv {
            background-color: white;
            color: black;
            padding: 6px;
            width: 400px;
        }

        #results {
            font-weight: bolder;
        }
    </style>
    <script>
    require([
        "esri/Map",
        "esri/views/MapView",
        "esri/layers/FeatureLayer",
        "esri/layers/GraphicsLayer",
        "esri/geometry/geometryEngine",
        "esri/Graphic"
      ],
      function (
        Map, MapView,
        FeatureLayer,
        GraphicsLayer,
        geometryEngine,
        Graphic
      ) {

        var quakesUrl =
          "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/ks_earthquakes_since_2000/FeatureServer/0";
        var wellBuffer, wellsGeometries, magnitude;//定义缓冲区,图形,和震级
        var wellTypeSelect = document.getElementById("well-type");//选择井的类型
        var magSlider = document.getElementById("mag");//slider滑动器,选择震级
        var distanceSlider = document.getElementById("distance");//选择距离
        var queryQuakes = document.getElementById("query-quakes");//查询地震按钮

        // 井图层
        var wellsLayer = new FeatureLayer({
          portalItem: { // autocasts as new PortalItem()
            id: "8af8dc98e75049bda6811b0cdf9450ee"
          },
          outFields: ["*"],
          visible: false
        });

        // 地震图层
        var quakesLayer = new FeatureLayer({
          url: quakesUrl,
          outFields: ["*"],
          visible: false
        });

        // 用于显示结果的图形图层
        var resultsLayer = new GraphicsLayer();

        //定义一个地图
        var map = new Map({
          basemap: "dark-gray",
          layers: [wellsLayer, quakesLayer, resultsLayer]
        });
        //定义一个视图
        var view = new MapView({
          container: "viewDiv",
          map: map,
          center: [-97.75188, 37.23308],
          zoom:
        });
        view.ui.add("infoDiv", "top-right");

        // 从井的图层中查询元素
        view.when(function () {//当视图加载完view.when()
            return wellsLayer.when(function () {
                var query = wellsLayer.createQuery();//创建可用于获取满足层的当前筛选器的特性的查询参数和定义。
                return wellsLayer.queryFeatures(query); //对feature服务执行查询,并返回一个FeatureSet,一旦promise解析,就可以使用then()方法访问该FeatureSet。
                //FeatureSet包含一个图形特性数组,可以将其添加到视图的图形中。如果没有发现任何结果,则不会填充此数组。
            });
          })
          .then(getValues)
          .then(getUniqueValues)
          .then(addToSelect)
          .then(createBuffer);

        function getValues(response) {//上面对featurelayer执行了查询,返回了了一个featureset(集合),getValues方法是获取集合里面某个属性所有的值
          var features = response.features;//featureset的features属性是从任务返回的图形数组
          var values = features.map(function (feature) {//对于查询出来的的feature,获取STATUS2这个字段的属性值
            return feature.attributes.STATUS2;
          });
          return values;//返回所有值
        }

        function getUniqueValues(values) {//对所有值进行筛选,得到唯一值的集合,
          var uniqueValues = [];//定义一个唯一值的集合

          values.forEach(function (item, i) {//进行循环判断,这里参数i不是很明白,作者感觉有点多余
               || uniqueValues.indexOf(item) === -) && //详细讲一下这里的判断,首先||为逻辑运算符
                  //a || b只要ab有一个为true就为true,ab都为false才为false,a(第一个)为true则不用判断b,直接为true,这样减少了不必要的运算
                  // &&就是并运算,整个判断是说:如果集合uniqueValues集合为空,且循环的item不为空,则将item加到uniqueValues集合里,
                  //当集合里面有元素之后,判断能否在集合里找到循环的item,如果能找到且不为空,则添加item到集合
              (item !== "")) {
              uniqueValues.push(item);
            }
          });
          return uniqueValues;
        }

        // 向井的类型添加惟一值选择元素。这将允许用户按类型筛选井。
        function addToSelect(values) {//根据井的类型筛选
          values.sort();//进行排序
          values.forEach(function (value) {
            var option = document.createElement("option");//创建一个"option"元素
            option.text = value;
            wellTypeSelect.add(option);//将option添加到井的类型选择器中,比如一共3种井,ABC,就会将ABC依次添加到wellTypeSelete中
          });

          return setWellsDefinitionExpression(wellTypeSelect.value);
        }

        // 在井的图层上设置定义表达式,以反映用户的选择
        function setWellsDefinitionExpression(newValue) {
          wellsLayer.definitionExpression = "STATUS2 = '" + newValue + "'";

          if (!wellsLayer.visible) {//设置井的图层的可见属性为true
            wellsLayer.visible = true;
          }

          return queryForWellGeometries();
        }

        // 获取wells层的所有几何图形,这些几何对象是由createQuery()方法创建一个查询对象,该对象遵循该层的definition表达式
        function queryForWellGeometries() {
          var wellsQuery = wellsLayer.createQuery();//建立一个查询对象

          return wellsLayer.queryFeatures(wellsQuery)//执行查询,返回一个featureset
            .then(function (response) {
              wellsGeometries = response.features.map(function (feature) {//查询完,井的图形设置为feature的图形
                return feature.geometry;
              });

              return wellsGeometries;//返回井的图形
            });
        }

        // 建立缓冲区
        function createBuffer(wellPoints) {
          var bufferDistance = parseInt(distanceSlider.value);//获取缓冲区的距离
          var wellBuffers = geometryEngine.geodesicBuffer(wellPoints, [bufferDistance], "meters",
            true);
          wellBuffer = wellBuffers[];

          // 将缓冲去作为图形添加到视图中
          var bufferGraphic = new Graphic({
            geometry: wellBuffer,
            symbol: {
              type: "simple-fill", // autocasts as new SimpleFillSymbol()
              outline: {
                width: 1.5,
                color: [, , , 0.5]
              },
              style: "none"
            }
          });
          view.graphics.removeAll();
          view.graphics.add(bufferGraphic);
        }

        // 获取由用户设置的地震级别
        magSlider.addEventListener("input", function () {
          magnitude = magSlider.value;
          document.getElementById("mag-value").innerText = magnitude;
        });
        // 获取由用户设置的距离
        distanceSlider.addEventListener("input", function () {
          document.getElementById("distance-value").innerText = distanceSlider.value;
        });
        // 在查询的图形周边创建缓冲区
        distanceSlider.addEventListener("change", function () {
          createBuffer(wellsGeometries);
        });
        // 在wells层上设置一个新的定义表达式,并围绕新wells创建一个新的缓冲区
        wellTypeSelect.addEventListener("change", function () {
          var type = event.target.value;
          setWellsDefinitionExpression(type)
            .then(createBuffer);
        });

        //对queryQuakes按钮添加click时间的监听
        queryQuakes.addEventListener("click", function () {
          queryEarthquakes()
            .then(displayResults);
        });

        function queryEarthquakes() {
          var query = quakesLayer.createQuery();//创建查询
          query.where = "mag >= " + magSlider.value;//定义查询条件:震级大于等于用户输入的数值
          query.geometry = wellBuffer;//定于查询的图形为井的缓冲区
          query.spatialRelationship = "intersects";//定义空间关系为"intersects"相交

          return quakesLayer.queryFeatures(query);返回符合条件的集合
        }

        // 在视图中显示查询结果并输出结果
        function displayResults(results) {

          resultsLayer.removeAll();//清除结果图层
          var features = results.features.map(function (graphic) {
            graphic.symbol = {
              type: "simple-marker", // autocasts as new SimpleMarkerSymbol()
              style: "diamond",
              size: 6.5,
              color: "darkorange"
            };
            return graphic;
          });
          var numQuakes = features.length;
          document.getElementById("results").innerHTML = numQuakes + " earthquakes found";
          resultsLayer.addMany(features);
        }

      });

    </script>
</head>
<body>
    <div id="viewDiv"></div>
    <div id="infoDiv">
        Select well type:
        <select id="well-type"></select>
        <br> Well buffer distance:
        <input id=">&nbsp;
        <span id=</span> meters
        <br> Earthquake magnitude:
        <input id="mag" type="range" min="0.0" max="5.0" step="0.1" value="2.0">&nbsp;
        <span id="mag-value">2.0</span>
        <button id="query-quakes">Query Earthquakes</button>
        <br>
        <div id="results"></div>
    </div>
</body>
</html>

Sample Codes之Query features from a FeatureLayer的更多相关文章

  1. Interview Common Sample Codes

    1. Quick Sort: int partition(int A[], int p, int r) { int x = A[r]; // Pivot element int i = p - 1; ...

  2. ArcGIS API for JavaScript 4.2学习笔记[17] 官方第七章Searching(空间查询)概览与解释

    空间分析和空间查询是WebGIS有别于其他Web平台的特点.到这一章,就开始步入空间分析的内容了. [Search widget] 介绍空间查询的核心小部件"Search". [S ...

  3. Enhancing the Application: Advanced JDBC Features(转)

    Enhancing the Application: Advanced JDBC Features This chapter describes additional functionality th ...

  4. SQL optimizer -Query Optimizer Deep Dive

    refer: http://sqlblog.com/blogs/paul_white/archive/2012/04/28/query-optimizer-deep-dive-part-1.aspx  ...

  5. 【PSMA】Progressive Sample Mining and Representation Learning for One-Shot Re-ID

    目录 主要挑战 主要的贡献和创新点 提出的方法 总体框架与算法 Vanilla pseudo label sampling (PLS) PLS with adversarial learning Tr ...

  6. iOS苹果官方Demo合集

    Mirror of Apple’s iOS samples This repository mirrors Apple’s iOS samples. Name Topic Framework Desc ...

  7. Sphinx 2.2.11-release reference manual

    1. Introduction 1.1. About 1.2. Sphinx features 1.3. Where to get Sphinx 1.4. License 1.5. Credits 1 ...

  8. osg 添加 fbx插件 osg中编译fbx

    使用osg加载fbx模型,需要自己编译fbx插件,编译流程与插件使用案例如下 代码地址:https://github.com/shelltdf/osgFBX CMake Error: The foll ...

  9. Book Review: PowerShell 3.0 Advanced Administration Handbook

    Recently I read a book, PowerShell 3.0 Advanced Administration Handbook, which I found really worthy ...

随机推荐

  1. Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合

    复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...

  2. Pycharm中Python PEP8 的警告

    https://blog.csdn.net/serizawa_tamao/article/details/88658694

  3. centOS 重启 php-fpm

     ps axo pid,%cpu,%mem,comm |grep php-fpm ps aux | grep php-fpm pkill -9 php-fpm /etc/init.d/php-fpm ...

  4. java 集合之HashMap的三种遍历

    HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. 这周我们只需记住三种遍历方法 1.通过keySet()获取键,再利用hashmap里面的.get(key)方法通过键获取 ...

  5. 查看php-fpm的进程和端口号

    ps -ef | grep php-fpm   查看php-fpm所有的进程 ps -ef | grep php-fpn.conf 查看配置所在路径 netstat -lntp 查看监听端口  lis ...

  6. java 泛型的嵌套(map例子)

    package july7; //泛型加Map的输出! import java.util.Iterator; import java.util.Map; import java.util.Map.En ...

  7. C# 如何在项目引用x86 x64的非托管代码

    因为现在的项目使用的是 AnyCpu 在 x86 的设备使用的是x86,在x64使用的是x64,但是对于非托管代码,必须要在x64使用x64的dll,在x86使用x86的dll.在C++没有和C#一样 ...

  8. @RequestBody、@ResponseBody注解是如何将输入输出转换成json的

    @RequestBody.@ResponseBody注解,可以直接将输入解析成Json.将输出解析成Json,但HTTP 请求和响应是基于文本的,意味着浏览器和服务器通过交换原始文本进行通信,而这里其 ...

  9. activiti工作流引擎学习(二)

    1.连线 如果bpmn文件和java文件放在同一目录下,需要配置buildPath: 使用流程变量,设置连线需要的流程变量的名称,并设置流程变量的值,流程会按照指定的连线完成任务. 1.1一个活动中可 ...

  10. 学习Java第六周

    1.内存结构 Java程序在运行时,需要在内存中的分配空间为提高运算效率,空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式. 栈内存 ·用于存储局部变量,当数据使用完,所占 ...