「Arcgis的」空间查询和属性查询

概述

目录

「Arcgis的」空间查询和属性查询

概述

流程

FindTask

QueryTask

IdentifyTask


在ArcGIS API中查询功能是非常常用的,Esri给我们提供了三个类用于查询功能,FindTask,QueryTask,IdentifyTask,他们之间的区别为:

查询分为属性查询和空间查询类

属性查询:QueryTask,FindTask(只能属性。多个图层)

空间查询:IdentifyTask(多个图层),QueryTask(单个图层)

arcgis空间索引文件 arcgis空间查询属性查询_图层

 

任务,查询,和FeatureSet一起被用于查询地图里的图层并显示结果。流程

  1. 查询:等同于下搜寻条件,可以输入地图上选择的元素,列表里选择的值或输入值。
  2. 任务:将建立好的查询执行,搜寻结果会用的FeatureSet回传。
  3. 的FeatureSet:为搜寻的结果,包含多边形,信息窗口或该区块的表格栏位内容。

arcgis空间索引文件 arcgis空间查询属性查询_空间查询_02


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是进行空间和属性查询的功能类,可以在某个地图服务的某个子图层进行查询。

###先决条件

  1. 有需要查询的图层网址
  2. 进行查询的过滤条件

###上代码

// 新建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();
    }
}