日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

ArcGIS api for JavaScript 之 空间、属性查询

發布時間:2024/3/26 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ArcGIS api for JavaScript 之 空间、属性查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有一段時間又沒有發表博客記錄學習經過了,有點懈怠啊,學習之路還要堅持才行呢。

話不多說,進入今天的正題:arcgis的空間和屬性查詢

arcgis js api 有三種常見的查詢:QueryTask、FindTask、IdentifyTask?

三者的區別:

  • FIndTask 只能進行屬性查詢,QueryTask和IdentityTask既可以進行屬性查詢也可以進行空間查詢
  • 對于QueryTask,IdentityTask兩個類,QueryTask只可應用于一個單獨的圖層,IdentityTask可應用于地圖服務和多個圖層
  • QueryTask可以進行簡單的統計功能。

具體實現:

一、QueryTask:

只可在某個地圖服務的某個子圖層進行查詢,它查詢的地圖服務并不必須加載到Map中進行顯示,執行QueryTask需要兩個先決條件:1.需要查詢的圖層的url ,精確到layerId;2.查詢的過濾條件

核心代碼:

1.1 利用QueryTask進行空間查詢(常見的有拉框查詢、圓形和多邊形查詢)

用到的類:

"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",

先上代碼在進行講解吧。。。?

var toolbar_1=new Draw(map);$(".spatialSearch").on("click","button",function(){map.setMapCursor("pointer");//鼠標變為pointervar 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,方便把返回值結果以圖標形式疊加在地圖上query.outFields =["*"];//返回的字段名稱query.outSpatialReference = map.spatialReference;query.spatialRelationship = Query.SPATIAL_REL_INTERSECTS;query.geometry = evt.geometry;//設置繪制框選圖形的范圍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('未查詢到結果!');return;}for (var i = 0; i < featureSet.features.length; i++) {var graphic = featureSet.features[i];//console.log(graphic.attributes);/***這里進行你對查詢到的信息渲染和其他的一些操作***/}}

首先我們不管是進行空間拉框還是多邊形時,都是利用畫圖工具來做的,所以我們需要先構造一個Draw對象 即:

var toolbar_1=new Draw(map);

隨后當我們點擊不同的查詢條件時,我們需要激活畫圖工具 即:

toolbar_1.activate(Draw.RECTANGLE);

后面攜帶的參數是指不同圖形的類型,有矩形、圓形和多邊形等等,

接著,畫圖完成后我們需要回調一個方法,對這個我們畫出的范圍內的geometry進行什么樣的操作,即:

toolbar_1.on("draw-complete",searchCompleate);

在?searchCompleate 方法里,我做了如下的操作:

先獲取畫圖范圍的中心點,地圖縮放到我畫的范圍里,

然后進行我們的核心操作,查詢---

?var queryTask =new QueryTask(url_1);
? ?var query =new Query();

其中url_1 是指你需要查詢的地圖服務的地址,但是這里只能針對這個地圖服務的一個 layer (圖層),

所以在上面我定義了一個?var url_1 =url+"/0";(url指地圖服務地址);

后面接著就是query攜帶的參數了,這里需要注意下坐標系的問題,(我有時查不出來就坐標系的問題)

接著就可以進行查詢了

queryTask.execute(query, showQueryResult);

其中 showQueryResult 是查詢完成回調的方法,其中參數 featureSet 是你查出來的結果

但是真正的 graphic 是 featureSet.features ,千萬不要弄混淆,相比其他兩個查詢,這里都是不同的

1.2 進行屬性查詢(即攜帶參數 、屬性信息對圖層進行查詢)

//利用query進行屬性查詢function doQuery(xzqbm,ctime,bzpmc,zrr) {var geometry;var query =new Query();var queryTask=new QueryTask(MapServer+"/0");//遍歷行政區范圍數組,找到對應的行政區范圍for (var i = 0; i < XZQExtent.length; i++) {if(XZQExtent[i]["xzq"]==xzqbm){geometry=XZQExtent[i]["geo"];}}//如果有范圍查,在范圍內查找if(geometry!=null){//定義查詢的范圍query.geometry = geometry;}else {query.geometry =map.extent;}//查詢統計時間if(ctime!=''){var date1 =ctime+"-01-01";var date2=ctime+"-12-30";query.where="CTIME >= date'"+date1+"'AND CTIME <= date'"+date2+"'";}//查詢標志牌名稱if(bzpmc!=''){query.where="BZPMC like'%"+bzpmc+"%'";}//查詢保護責任人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;//執行查詢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

其實就是加一個query.where = xxx ;

?




?

二、FIndTask

FindTask是在某個地圖服務中進行屬性查詢的功能類,FindTask以FindParameters對象為參數,能查詢同一個地圖服務的一個或多個圖層,并且可以在多個字段中進行查詢,FindTask僅僅用于屬性信息的查詢,在FindTask執行結束后,可以從其返回結果中獲取查詢的對象來自哪個圖層和哪個字段

引用的模塊:

"esri/tasks/FindTask",
?"esri/tasks/FindParameters",

核心代碼:

//創建屬性查詢對象 var findTask = new FindTask(MapServer); //創建屬性查詢參數 var findParams = new FindParameters();findParams.returnGeometry = true; //對哪一個圖層進行屬性查詢 findParams.layerIds = [0]; //查詢的字段 findParams.searchFields = ["DLMC"]; //searchText和searchFields結合使用 // findParams.searchText = "水田"; findParams.searchText = val; //執行查詢對象 findTask.execute(findParams, ShowFindResult);function ShowFindResult(queryResult) {//先清空已渲染的圖層clearGra();//創建線符號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 (queryResult.length == 0) {return;}if (queryResult.length >= 1) {for (var i = 0; i < queryResult.length; i++) {//獲得圖形graphicvar graphic = queryResult[i].feature;//賦予相應的符號graphic.setSymbol(fill);//設置屬性var infoTemplate = new InfoTemplate("地塊信息","標識碼:"+graphic.attributes["BSM"]+"</br>地類編號:"+graphic.attributes["DLBM"]+"</br>地類名稱:"+graphic.attributes["DLMC"] +"<br/>權屬性質:"+graphic.attributes["QSXZ"]+" <br/>權屬單位名稱:"+graphic.attributes["QSDWMC"]+"</br>面積:"+graphic.attributes["TBMJ"]+"平方米");graphic.setInfoTemplate(infoTemplate);//console.log(graphic);//將graphic添加到地圖中,從而實現高亮效果// map.graphics.add(graphic);gl.add(graphic);}} }

(僅供參考,不可拿來就用的)




三、IdentifyTask?

IdentifyTask是在某個地圖服務中進行空間查詢,IdentifyTask以IdentifyParameters對象作為參數,能查詢同一個地圖服務的一個或者多個圖層,IdentifyTask僅僅用于空間信息查詢

引用的模塊:

"esri/tasks/IdentifyTask", "esri/tasks/IdentifyParameters",

核心代碼:

var identifyTask = new IdentifyTask(bzpLayers[0].url);//定義空間查詢參數對象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);//注意上面可能會因為地圖的參考系問題查不出來function showAllBZP(results) {if (results.length>0) {var graphic = results[i].feature;.....}else {/*layer.msg('未查詢到相關要素!');*/}}

如下圖,參數的屬性可能就變了

對了,關于查詢的時候需要用到 layerId 但是你不知道地圖服務有具體多少個圖層時:附帶一個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>

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的ArcGIS api for JavaScript 之 空间、属性查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。