javascript
ArcGIS api for JavaScript 之 空间、属性查询
有一段時(shí)間又沒(méi)有發(fā)表博客記錄學(xué)習(xí)經(jīng)過(guò)了,有點(diǎn)懈怠啊,學(xué)習(xí)之路還要堅(jiān)持才行呢。
話不多說(shuō),進(jìn)入今天的正題:arcgis的空間和屬性查詢
arcgis js api 有三種常見的查詢:QueryTask、FindTask、IdentifyTask?
三者的區(qū)別:
- FIndTask 只能進(jìn)行屬性查詢,QueryTask和IdentityTask既可以進(jìn)行屬性查詢也可以進(jìn)行空間查詢
- 對(duì)于QueryTask,IdentityTask兩個(gè)類,QueryTask只可應(yīng)用于一個(gè)單獨(dú)的圖層,IdentityTask可應(yīng)用于地圖服務(wù)和多個(gè)圖層
- QueryTask可以進(jìn)行簡(jiǎn)單的統(tǒng)計(jì)功能。
具體實(shí)現(xiàn):
一、QueryTask:
只可在某個(gè)地圖服務(wù)的某個(gè)子圖層進(jìn)行查詢,它查詢的地圖服務(wù)并不必須加載到Map中進(jìn)行顯示,執(zhí)行QueryTask需要兩個(gè)先決條件:1.需要查詢的圖層的url ,精確到layerId;2.查詢的過(guò)濾條件
核心代碼:
1.1 利用QueryTask進(jìn)行空間查詢(常見的有拉框查詢、圓形和多邊形查詢)
用到的類:
"esri/toolbars/draw",
"esri/geometry/Extent",
"esri/SpatialReference",
"esri/geometry/Point",?
?? ?"esri/geometry/Polyline",
? ? "esri/geometry/Polygon",
? ? "esri/geometry/Circle",
"esri/symbols/SimpleMarkerSymbol",
?? ?"esri/symbols/SimpleLineSymbol",
?? ?"esri/symbols/SimpleFillSymbol",
?? ?"esri/symbols/PictureMarkerSymbol",
"esri/tasks/query",
?? ?"esri/tasks/QueryTask",
先上代碼在進(jìn)行講解吧。。。?
var toolbar_1=new Draw(map);$(".spatialSearch").on("click","button",function(){map.setMapCursor("pointer");//鼠標(biāo)變?yōu)閜ointervar val =$(this).attr("id");switch (val) {case "拉框":toolbar_1.activate(Draw.RECTANGLE);break;case "圓形":toolbar_1.activate(Draw.CIRCLE);break;case "多邊形":toolbar_1.activate(Draw.POLYGON);break;}})toolbar_1.on("draw-complete",searchCompleate);var url =companyServer;function searchCompleate(evt) {var point = new Point(evt.geometry.getExtent().getCenter());map.centerAndZoom(point,12);toolbar_1.deactivate();map.setMapCursor("default");var url_1 =url+"/0";var queryTask =new QueryTask(url_1);var query =new Query();query.returnGeometry=true;//返回空間查詢到geometry,方便把返回值結(jié)果以圖標(biāo)形式疊加在地圖上query.outFields =["*"];//返回的字段名稱query.outSpatialReference = map.spatialReference;query.spatialRelationship = Query.SPATIAL_REL_INTERSECTS;query.geometry = evt.geometry;//設(shè)置繪制框選圖形的范圍queryTask.execute(query, showQueryResult);}function showQueryResult(featureSet) {var lineSymbol=new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH, new dojo.Color([2, 166, 51]), 1);var fill=new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, lineSymbol,new dojo.Color([164, 212, 178]));if (featureSet.features.length == 0) {layer.msg('未查詢到結(jié)果!');return;}for (var i = 0; i < featureSet.features.length; i++) {var graphic = featureSet.features[i];//console.log(graphic.attributes);/***這里進(jìn)行你對(duì)查詢到的信息渲染和其他的一些操作***/}}首先我們不管是進(jìn)行空間拉框還是多邊形時(shí),都是利用畫圖工具來(lái)做的,所以我們需要先構(gòu)造一個(gè)Draw對(duì)象 即:
var toolbar_1=new Draw(map);
隨后當(dāng)我們點(diǎn)擊不同的查詢條件時(shí),我們需要激活畫圖工具 即:
toolbar_1.activate(Draw.RECTANGLE);
后面攜帶的參數(shù)是指不同圖形的類型,有矩形、圓形和多邊形等等,
接著,畫圖完成后我們需要回調(diào)一個(gè)方法,對(duì)這個(gè)我們畫出的范圍內(nèi)的geometry進(jìn)行什么樣的操作,即:
toolbar_1.on("draw-complete",searchCompleate);
在?searchCompleate 方法里,我做了如下的操作:
先獲取畫圖范圍的中心點(diǎn),地圖縮放到我畫的范圍里,
然后進(jìn)行我們的核心操作,查詢---
?var queryTask =new QueryTask(url_1);
? ?var query =new Query();
其中url_1 是指你需要查詢的地圖服務(wù)的地址,但是這里只能針對(duì)這個(gè)地圖服務(wù)的一個(gè) layer (圖層),
所以在上面我定義了一個(gè)?var url_1 =url+"/0";(url指地圖服務(wù)地址);
后面接著就是query攜帶的參數(shù)了,這里需要注意下坐標(biāo)系的問(wèn)題,(我有時(shí)查不出來(lái)就坐標(biāo)系的問(wèn)題)
接著就可以進(jìn)行查詢了
queryTask.execute(query, showQueryResult);
其中 showQueryResult 是查詢完成回調(diào)的方法,其中參數(shù) featureSet 是你查出來(lái)的結(jié)果
但是真正的 graphic 是 featureSet.features ,千萬(wàn)不要弄混淆,相比其他兩個(gè)查詢,這里都是不同的
1.2 進(jìn)行屬性查詢(即攜帶參數(shù) 、屬性信息對(duì)圖層進(jìn)行查詢)
//利用query進(jìn)行屬性查詢function doQuery(xzqbm,ctime,bzpmc,zrr) {var geometry;var query =new Query();var queryTask=new QueryTask(MapServer+"/0");//遍歷行政區(qū)范圍數(shù)組,找到對(duì)應(yīng)的行政區(qū)范圍for (var i = 0; i < XZQExtent.length; i++) {if(XZQExtent[i]["xzq"]==xzqbm){geometry=XZQExtent[i]["geo"];}}//如果有范圍查,在范圍內(nèi)查找if(geometry!=null){//定義查詢的范圍query.geometry = geometry;}else {query.geometry =map.extent;}//查詢統(tǒng)計(jì)時(shí)間if(ctime!=''){var date1 =ctime+"-01-01";var date2=ctime+"-12-30";query.where="CTIME >= date'"+date1+"'AND CTIME <= date'"+date2+"'";}//查詢標(biāo)志牌名稱if(bzpmc!=''){query.where="BZPMC like'%"+bzpmc+"%'";}//查詢保護(hù)責(zé)任人if(zrr!=''){query.where="BHZRR like '%"+zrr+"%'";}if(bzpmc==''&&ctime==''&&geometry==null&&zrr==''){query.where="1=1";if(!flag1){layer1.show();} }//返回所有字段query.outFields=["*"];//空間參考信息query.outSpatialReference=map.SpatialReference;//是否返回幾何信息query.returnGeometry=true;//執(zhí)行查詢queryTask.execute(query,ShowFindResult);}附上我之前寫的帶屬性的查詢,
更多的sql 參考:http://pro.arcgis.com/zh-cn/pro-app/help/mapping/navigation/sql-reference-for-elements-used-in-query-expressions.htm
以及:http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#//00s500000033000000
其實(shí)就是加一個(gè)query.where = xxx ;
?
?
二、FIndTask
FindTask是在某個(gè)地圖服務(wù)中進(jìn)行屬性查詢的功能類,FindTask以FindParameters對(duì)象為參數(shù),能查詢同一個(gè)地圖服務(wù)的一個(gè)或多個(gè)圖層,并且可以在多個(gè)字段中進(jìn)行查詢,FindTask僅僅用于屬性信息的查詢,在FindTask執(zhí)行結(jié)束后,可以從其返回結(jié)果中獲取查詢的對(duì)象來(lái)自哪個(gè)圖層和哪個(gè)字段
引用的模塊:
"esri/tasks/FindTask",
?"esri/tasks/FindParameters",
核心代碼:
//創(chuàng)建屬性查詢對(duì)象 var findTask = new FindTask(MapServer); //創(chuàng)建屬性查詢參數(shù) var findParams = new FindParameters();findParams.returnGeometry = true; //對(duì)哪一個(gè)圖層進(jìn)行屬性查詢 findParams.layerIds = [0]; //查詢的字段 findParams.searchFields = ["DLMC"]; //searchText和searchFields結(jié)合使用 // findParams.searchText = "水田"; findParams.searchText = val; //執(zhí)行查詢對(duì)象 findTask.execute(findParams, ShowFindResult);function ShowFindResult(queryResult) {//先清空已渲染的圖層clearGra();//創(chuàng)建線符號(hào)var lineSymbol=new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH, new dojo.Color([2, 166, 51]), 1);//創(chuàng)建面符號(hào)var fill=new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, lineSymbol,new dojo.Color([164, 212, 178]));if (queryResult.length == 0) {return;}if (queryResult.length >= 1) {for (var i = 0; i < queryResult.length; i++) {//獲得圖形graphicvar graphic = queryResult[i].feature;//賦予相應(yīng)的符號(hào)graphic.setSymbol(fill);//設(shè)置屬性var infoTemplate = new InfoTemplate("地塊信息","標(biāo)識(shí)碼:"+graphic.attributes["BSM"]+"</br>地類編號(hào):"+graphic.attributes["DLBM"]+"</br>地類名稱:"+graphic.attributes["DLMC"] +"<br/>權(quán)屬性質(zhì):"+graphic.attributes["QSXZ"]+" <br/>權(quán)屬單位名稱:"+graphic.attributes["QSDWMC"]+"</br>面積:"+graphic.attributes["TBMJ"]+"平方米");graphic.setInfoTemplate(infoTemplate);//console.log(graphic);//將graphic添加到地圖中,從而實(shí)現(xiàn)高亮效果// map.graphics.add(graphic);gl.add(graphic);}} }(僅供參考,不可拿來(lái)就用的)
三、IdentifyTask?
IdentifyTask是在某個(gè)地圖服務(wù)中進(jìn)行空間查詢,IdentifyTask以IdentifyParameters對(duì)象作為參數(shù),能查詢同一個(gè)地圖服務(wù)的一個(gè)或者多個(gè)圖層,IdentifyTask僅僅用于空間信息查詢
引用的模塊:
"esri/tasks/IdentifyTask", "esri/tasks/IdentifyParameters",核心代碼:
var identifyTask = new IdentifyTask(bzpLayers[0].url);//定義空間查詢參數(shù)對(duì)象var params = new IdentifyParameters();//容差params.tolerance = 3;//是否返回幾何信息params.returnGeometry = true;//空間查詢的圖層bzpLayers[0].visibleLayersparams.layerIds = bzpLayers[0].visibleLayers;params.layerOption = IdentifyParameters.LAYER_OPTION_ALL;params.width = map.width;params.height = map.height;// console.log(map.extent);params.geometry = map.extent;params.mapExtent = map.extent;identifyTask.execute(params,showAllBZP);//注意上面可能會(huì)因?yàn)榈貓D的參考系問(wèn)題查不出來(lái)function showAllBZP(results) {if (results.length>0) {var graphic = results[i].feature;.....}else {/*layer.msg('未查詢到相關(guān)要素!');*/}}如下圖,參數(shù)的屬性可能就變了
對(duì)了,關(guān)于查詢的時(shí)候需要用到 layerId 但是你不知道地圖服務(wù)有具體多少個(gè)圖層時(shí):附帶一個(gè)demo(獲取圖層的信息)
直接拷貝下就可以用哦~~~
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <head><title>獲取圖層信息</title><style type="text/css">@import "http://serverapi.arcgisonline.com/jsapi/arcgis/1.5/js/dojo/dijit/themes/tundra/tundra.css";</style><script type="text/javascript">var djConfig = { isDebug: (window.location.search.indexOf("debug")>-1) };</script><script type="text/javascript" src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=1.5"></script><script type="text/javascript" src="js/InfoExtends.js"></script><script type="text/javascript">dojo.require("esri.map");var layer, layerUrl;function init() {var map = new esri.Map("mapDiv");layerUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer";layer = new esri.layers.ArcGISDynamicMapServiceLayer(layerUrl);map.addLayer(layer);dojo.connect(map, "onLoad", getLayerScales);}dojo.addOnLoad(init);function getLayerScales() {for (var i = 0; i < layer.layerInfos.length; i++) {getLayerJson(layerUrl, i);}}function getLayerJson(url, id) {dojo.io.script.get({callbackParamName: "callback", //provided by the jsonp serviceurl: layerUrl + "/" + id + "/?f=json",load: function(response, ioArgs) {setLayerScale(response);},error: function(response, ioArgs) {console.log(response);return response;}});}function setLayerScale(layerJson) {var layerInfo = layer.layerInfos[layerJson.id]; /* get the layer object somehow */if (layerInfo)layerInfo.setScale(layerJson.minScale, layerJson.maxScale);}function showLayerInfos() {alert(dojo.toJson(layer.layerInfos));}</script> </head> <body class="tundra"><input type="button" onclick="showLayerInfos()" value="顯示子圖層信息" /><div id="mapDiv" style="position:relative; width:100%; height:100%; border:1px solid #000;"></div> </body> </html>?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的ArcGIS api for JavaScript 之 空间、属性查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 淘宝获取SKU详情API接口
- 下一篇: ArcGIS API For JS之空间