「Arcgis的」空间查询和属性查询
概述
目录
「Arcgis的」空间查询和属性查询
概述
流程
FindTask
QueryTask
IdentifyTask
在ArcGIS API中查询功能是非常常用的,Esri给我们提供了三个类用于查询功能,FindTask,QueryTask,IdentifyTask,他们之间的区别为:
查询分为属性查询和空间查询类
属性查询:QueryTask,FindTask(只能属性。多个图层)
空间查询:IdentifyTask(多个图层),QueryTask(单个图层)
任务,查询,和FeatureSet一起被用于查询地图里的图层并显示结果。流程
- 查询:等同于下搜寻条件,可以输入地图上选择的元素,列表里选择的值或输入值。
- 任务:将建立好的查询执行,搜寻结果会用的FeatureSet回传。
- 的FeatureSet:为搜寻的结果,包含多边形,信息窗口或该区块的表格栏位内容。
FindTask
FindTask是在某个地图服务中进行属性查询的功能类,FindTask以FindParameters对象为参数,能查询同一个地图服务的一个或多个图层,并且可以在多个字段中进行查询.DindTask
只能用于属性资讯的查询,在FindTask执行结束后,可以从其回传结果中获取查询的对象来自哪个图层和哪个字段。
###代码上
基本页面
< input type = “ button ” value = “属性查询” id = “ Btn ” / >
< div id = “ divShowResult ” > < / div >
创建属性查询对象并给按钮绑定点击事件
//地图服务的URL
var MapServer = "http://localhost:6080/arcgis/rest/services/Test/MyService/MapServer";
//创建属性查询对象
var findTask = new FindTask(MapServer);
//创建属性查询参数
var findParams = new FindParameters();
on(dom.byId("Btn"),"click",function(){
//是否返回给我们几何信息
findParams.returnGeometry = true;
//对哪一个图层进行属性查询
findParams.layerIds = [1];
//查询的字段
findParams.searchFields = ["name"];
//searchText和searchFields结合使用,即查询name=J4
findParams.searchText = "J4";
//执行查询对象
findTask.execute(findParams, ShowFindResult);
})
处理属性查询返回给我们的数据
function ShowFindResult(queryResult) {
//创建线符号
var lineSymbol=new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 3);
//创建面符号
var fill=new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, lineSymbol);
if (queryResult.length == 0) {
dom.byId("divShowResult").innerHTML = "";
return;
}
var htmls = "";
if (queryResult.length >= 1) {
htmls = htmls + "<table style=\"width: 100%\">";
htmls = htmls + "<tr><td>名称</td></tr>";
for (var i = 0; i < queryResult.length; i++) {
//获得图形graphic
var graphic = queryResult[i].feature;
//赋予相应的符号
graphic.setSymbol(fill);
//将graphic添加到地图中,从而实现高亮效果
map.graphics.add(graphic);
//获得教学楼名称(此处是和shp属性表对应的)
var ptName = graphic.attributes["alias"];
if (i % 2 == 0)
htmls = htmls + "<tr>";
else
htmls = htmls + "<tr bgcolor=\"#F0F0F0\">";
htmls = htmls + "<td><a href=\"#\" \">" + ptName + "</a></td>";
htmls = htmls + "</tr>";
}
htmls = htmls + "</table>";
//将属性绑定在divShowResult上面
dom.byId("divShowResult").innerHTML = htmls;
}
}
QueryTask
QueryTask是进行空间和属性查询的功能类,可以在某个地图服务的某个子图层进行查询。
###先决条件
- 有需要查询的图层网址
- 进行查询的过滤条件
###上代码
// 新建QueryTask
var queryTask = new esri.tasks.QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/0");
// 新建Query物件
var query = new esri.tasks.Query();
// 是否返回 查詢結果的空間幾何資訊
query.returnGeometry = true;
// 設定要回傳的欄位
// 若要全部欄位皆回傳可輸入["*"]
query.outFields = ["CITY_NAME", "STATE_NAME", "POP1990"];
// 欄位查詢
query.where="OBJECTID="+schoolObjecid;
//查询全部
//query.where="1=1";
/********
有多重查詢方式:
//字符串查詢:
query.where = "NAME = '" + stateName + "'";
//數字查詢:
query.where = "POP04 > " + population;
//使用"like"的where子句的縮寫:
query.text = stateName;
//當用戶在地圖上選擇要素時使用(使用地圖查詢的意思):
query.geometry = evt.mapPoint;
**********/
// 創建了查詢過濾器以後,執行查詢。通過QueryTask.execute()方法執行查詢。
queryTask.execute(query,function(featureSet){
var fs = featureSet.features[0];
//如果查询成功並有返回值,控制台输出其他属性
if(fs){
console.log(fs.attributes.CITY_NAME);
console.log(fs.attributes.STATE_NAME);
console.log(fs.attributes.POP1990);
}else{
alert("訊息獲取錯誤");
}
}, (err) => {
console.log(' doXmQuerty ERROR!')
console.log(err)
});
IdentifyTask
IdentifyTask的使用与QueryTask十分类似,唯一不同的是IdentifyTask可以作用于多个图层,而QueryTask是作用于一个图层的。
###上代码
//空间查询
function identifyTask(geometry) {
//定义空间查询对象,注意他的参数是整个地图服务,而不是单个图层
var identifyTask = new IdentifyTask("http://localhost:6080/arcgis/rest/services/Test/Qingdao/MapServer");
//定义空间查询参数对象
var params = new IdentifyParameters();
//容差
params.tolerance = 5;
//是否返回几何信息
params.returnGeometry = true;
//空间查询的图层
params.layerIds = [0,1,2,3];
//空间查询的条件
params.layerOption = IdentifyParameters.LAYER_OPTION_ALL;
params.width = map.width;
params.height = map.height;
//空间查询的几何对象
params.geometry = geometry;
params.mapExtent = map.extent;
//执行空间查询
identifyTask.execute(params, showQueryResult);
}
//空间查询展示
function showQueryResult(idResults) {
//创建线符号
var lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 3);
//创建面符号
var fill = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, lineSymbol);
if (idResults.length > 0) {
var htmls = "<table style=\"width: 100%\">";
htmls = htmls + "<tr bgcolor=\"#E0E0E0\"><td> 图层 </td><td> 名 称</td></tr>";
for (var i = 0; i < idResults.length; i++) {
var result = idResults[i];
//获得图形graphic
var graphic = result.feature;
//设置图形的符号
graphic.setSymbol(fill);
var namevalue = result.feature.attributes.Name;
if (i % 2 == 1) {
htmls = htmls + "<tr bgcolor=\"#E0E0E0\"><td>" +
result.layerName + "</td><td>" + namevalue + "</td></tr>";
}
else {
htmls = htmls + "<tr><td>" + result.layerName + "</td><td>"
+ namevalue + "</td></tr>";
}
map.graphics.add(graphic);
}
htmls = htmls + "</table>";
document.getElementById("divShowResult").innerHTML = htmls;
$("#divShowResult").show();
}
else {
document.getElementById("divShowResult").innerHTML = "";
$("#divShowResult").show();
}
}