如果遇到发布的服务要素非常多,比如点要素,此时如果想要查询相关的属性或几何信息,如果使用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:
2. 分页查询测试
这里为了简单测试,先调整了后台返回条数控制,设置为20条:
经测试,对应服务的返回条数在Server调整最大返回为20条,代码中即使设置query得的num参数为查询返回的条数为50条,返回条数依然为20条,所以在查询时,返回条数num可以设置小于等于后台的设置。
经测试,如果满足数据库的支持需求,则无论发布的是mapserver还是featureserver,都可以在代码中用featurelayer去承载,并通过query方法查询获取。
当设置参数start为0时,则对应获取返回前20个要素:
可以通过rest后台对比要素,看查询返回结果是否正确:
当设置start为20时,则可以获取返回21-40个要素。后续要素也可以依次查询:
参考测试示例代码如下:
<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>