ArcGIS JS API分页查询小结

如果遇到发布的服务要素非常多,比如点要素,此时如果想要查询相关的属性或几何信息,如果使用featurelayer的query方法,可能会遇到server后台返回数限制,而只能返回获取到返回数上限的要素数目。

一个简单的方法是,可以通过server manager中去修改对应服务的最大查询返回数目。但是如果在查询的数据量非常大的情况下,不建议无限调大返回的要素数量,这样会给服务器带来过大压力;同时不同的终端对返回数量的需求也不同,所以可以不调整后台返回数,而通过分页查询pagination来进行分段分批次查询。

1. 分页查询的要求

首先如果服务的数据源来源于sde,则对数据库有要求,数据库层面需要支持分页查询:

  • Microsoft SQL Server Enterprise/Exss 2012
  • Oracle 12c
  • PostgreSQL 9.1
    数据库应为这些版本以上的数据库。

其次,如果是发布的mapserver,存放在FileGDB也可以,但是Server版本需要为10.3.1以上的版本。

最后,相应的服务需要在rest服务页面显示支持pagination:
ArcGIS JS API分页查询小结_第1张图片

2. 分页查询测试

这里为了简单测试,先调整了后台返回条数控制,设置为20条:
ArcGIS JS API分页查询小结_第2张图片
经测试,对应服务的返回条数在Server调整最大返回为20条,代码中即使设置query得的num参数为查询返回的条数为50条,返回条数依然为20条,所以在查询时,返回条数num可以设置小于等于后台的设置。
ArcGIS JS API分页查询小结_第3张图片经测试,如果满足数据库的支持需求,则无论发布的是mapserver还是featureserver,都可以在代码中用featurelayer去承载,并通过query方法查询获取。

当设置参数start为0时,则对应获取返回前20个要素:
ArcGIS JS API分页查询小结_第4张图片可以通过rest后台对比要素,看查询返回结果是否正确:
ArcGIS JS API分页查询小结_第5张图片
当设置start为20时,则可以获取返回21-40个要素。后续要素也可以依次查询:
ArcGIS JS API分页查询小结_第6张图片参考测试示例代码如下:

<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="initial-scale=1,maximum-scale=1,user-scalable=no"
    />
    <title>
      MapImageLayer - set renderers on sublayers | Sample | ArcGIS Maps SDK for
      JavaScript 4.25
    title>

    <link
      rel="stylesheet"
      href="https://js.arcgis.com/4.25/esri/themes/light/main.css"
    />
    <script src="https://js.arcgis.com/4.25/">script>

    <style>
      html,
      body,
      #viewDiv {
        padding: 0;
        margin: 0;
        height: 100%;
        width: 100%;
      }
    style>

    <script>
      require(["esri/Map", "esri/views/MapView", 
      "esri/layers/MapImageLayer",
      "esri/symbols/PictureMarkerSymbol",
    "esri/layers/FeatureLayer"], (
        Map,
        MapView,
        MapImageLayer,
        PictureMarkerSymbol,
        FeatureLayer
      ) => {
        

        const layer = new FeatureLayer({
          url: "https://localhost:6443/arcgis/rest/services/pointlighttest/MapServer/0",
          
        });

        /*****************************************************************
         * Add the layer to a map
         *****************************************************************/

        layer.renderer = {
          type: "simple", 
          symbol: {
            type: "picture-marker", 
            url: "https://static.arcgis.com/images/Symbols/Shapes/BlackStarLargeB.png",
            width: "64px",
            height: "64px"
            }
        }

        const map = new Map({
          basemap: "dark-gray-vector",
          layers: [layer]
        });

        const view = new MapView({
          container: "viewDiv",
          map: map,
          zoom: 5,
          center: [108.5, 18.5]
        });

        const query = {
              start: 20,
              num: 50,
              outFields: ["*"],
              returnGeometry: true,
            };
            const promise = layer
              .queryFeatures(query)
              .then((featureSet) =>{console.log(featureSet.features)});
          
      });
    script>
  head>

  <body>
    <div id="viewDiv">div>
  body>
html>

你可能感兴趣的:(ArcGIS,JS,API笔记,arcgis,javascript,分页查询)