Supermap GIS二次开发之查询面内数据是否有点数据
作者:谢景,撰写时间:2019-1-18
在我们进行GIS二次开发的时候,经常会需要查询某个面区域里是否有点数据,或者是面区域里面的点数据是否超过多少个,如果超过,则该面区域高亮显示。
举个例子,就像我做的慢性病GIS系统,就需要查询一个社区里面的病人是否超过3人,超过则该社区高亮,在这里,病人坐标就是点数据。
下面做个简单的Demo演示一下查询过程。
思路:先查出面数据,然后再以面数据作为范围过滤条件对点数据进行查询,如果查出数据,则该面数据高亮。
下面演示代码:
function SelectRegion(){ //查询面数据的方法
var queryRegion, queryByBoundsParams, queryService;//定义变量
queryRegion = new SuperMap.REST.FilterParameter({ name: "Region@XJ" });//设置查询图层,这里是面数据所在的图层
// QueryBySQLParameters SQL 查询参数类
queryByBoundsParams = new SuperMap.REST.QueryBySQLParameters({
queryParams: [queryRegion], //queryParams:该类用于设置查询数据集的查询过滤参数。
});
queryService = new SuperMap.REST.QueryBySQLService(url, {
//processCompleted:设置成功回调函数
eventListeners: { "processCompleted": processCompleted_selectAddress }
});
queryService.processAsync(queryByBoundsParams);//负责将客户端的动态分段服务参数传递到服务端。
}
function processCompleted_selectAddress(obj){ //成功回调函数 obj是服务端传回来的数据
var i, len, features, feature,geometry, result = obj.result.recordsets;//声明变量
features = result[0].features;
for (i = 0, len = features.length; i < len; i++) { //循环面数据,调用查询点数据的方法,每个面数据都是查询点数据的范围过滤条件
feature = features[i];
geometry=feature.geometry;
SelectPoint(feature);//查询点数据的方法
}
}
function SelectPoint(feature){//查询点数据的方法
var queryRegion, queryByGeometryParams, queryService;
queryRegion = new SuperMap.REST.FilterParameter({ name: "Point@XJ" });//点数据所在图层
queryByGeometryParams = new SuperMap.REST.QueryByGeometryParameters({
queryParams: [queryRegion],
geometry: feature.geometry,//范围过滤条件
spatialQueryMode: SuperMap.REST.SpatialQueryMode.INTERSECT
});
queryService = new SuperMap.REST.QueryByGeometryService(url, {
eventListeners: {
//成功的回调函数是匿名方法
"processCompleted": function(obj){
//判断以面数据作为范围过滤条件下,有没有查询点数据,如果没有,则证明该面数据内没有点数据,如果有点数据,则使该面高亮显示。
if(obj.result.recordsets[0].features.length>0){
feature.style = {//设置面的样式
strokeColor: "#304DBE",
strokeWidth: 2,
pointerEvents: "visiblePainted",
fillColor: "#304DBE",
fillOpacity: 0.4
}
vectorLayer.addFeatures(feature);//将该面数据添加到vectorLayer图层中显示。
}
}
}
});
queryService.processAsync(queryByGeometryParams);//负责将客户端的动态分段服务参数传递到服务端。
}
效果图如下: