ArcGIS API For JavaScript(三)QueryTask&IdentifyTask實現空間查詢
ArcGIS API For JavaScript(三)QueryTask&IdentifyTask實現空間查詢
1、通過QueryTask()實現空間查詢
在地圖上畫一個多邊形,將和多邊形相交的要素找出並高亮顯示,之後動態新增表格,將要素的名稱依次顯示在表格中
<!DOCTYPE html>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>Hello World</title>
<linkrel="stylesheet"href="http://js.arcgis.com/3.9/js/dojo/dijit/themes/tundra/tundra.css"
<linkrel="stylesheet"href="http://js.arcgis.com/3.9/js/esri/css/esri.css" />
<scriptsrc="http://js.arcgis.com/3.9/"></script>
<style>
#mapDiv {
height: 600px;
width: 900px;
border:1pxsolidred;
}
</style>
<script>
require(["esri/map",
"esri/layers/ArcGISDynamicMapServiceLayer",
"dojo/dom",
"dojo/on"
"esri/tasks/QueryTask",
"esri/toolbars/draw",
"esri/tasks/query",
"esri/symbols/SimpleLineSymbol",
"esri/symbols/SimpleFillSymbol",
"esri/graphic",
"dojo/domReady!"],
function (Map, ArcGISDynamicMapServiceLayer,dom, on,
QueryTask, Draw, Query,
SimpleLineSymbol,SimpleFillSymbol,Graphic) {
var map = new Map("mapDiv");
var
map.addLayer(layer)
//定義一個繪圖工具
var toolBar = new Draw(map);
//給button繫結事件
on(dom.byId("Btn"),"click",function(){
//啟用繪圖工具,我要繪製一個面圖形
toolBar.activate(Draw.POLYGON);
})
on(toolBar, "draw-complete", function (result) {
//獲得繪圖得到的面
var geometry=result.geometry;
//關閉繪圖工具
toolBar.deactivate();
queryGraphic(geometry);
});
function queryGraphic(geometry) {
//建立查詢物件,注意:服務的後面有一個編號,代表對那一個圖層進行查詢
var queryTask = new QueryTask("http://localhost:6080/arcgis/rest/services/%E5%90%88%E5%B7%A5%E5%A4%A7%E5%B9%B3%E9%9D%A2%E7%AE%80%E5%9B%BE/MapServer/4");
//建立查詢引數物件
var query = new Query();
//空間查詢的幾何物件
query.geometry = geometry;
//伺服器給我們返回的欄位資訊,*代表返回所有欄位
query.outFields = ["*"];
//空間參考資訊
query.outSpatialReference = map.spatialReference;
//查詢的標準,此處代表和geometry相交的圖形都要返回
query.spatialRelationship = Query.SPATIAL_REL_INTERSECTS;
//是否返回幾何資訊
query.returnGeometry = true;
//執行空間查詢
queryTask.execute(query, showQueryResult);
}
function showQueryResult(queryResult) {
//建立線符號
var lineSymbol=new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 2);
//建立面符號
var fill=new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, lineSymbol,new dojo.Color([0,200,50]));
if (queryResult.features.length == 0) {
dom.byId("divShowResult").innerHTML = "查詢結果為空!";
return;
}
var htmls = "";
if (queryResult.features.length >= 1) {
htmls = htmls + "<table style=\"width: 900px\">"; //建立一個表,其中使用了轉義字元
htmls = htmls + "<tr><td>名稱</td></tr>"; //建立資料行
for (var i = 0; i < queryResult.features.length; i++) {
//得到graphic
var graphic = queryResult.features[i];
//給圖形賦予符號
graphic.setSymbol(fill);
//新增到地圖從而實現高亮效果
map.graphics.add(graphic);
//獲得教學樓的名稱資訊,此處應和shp的屬性表對應
var ptName = graphic.attributes["地物名稱"];
if (i % 2 == 0) //設定奇偶間隔底色
htmls = htmls + "<tr bgcolor=\"#a0b0c0\">";
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;
}
}
});
</script>
</head>
<bodyclass="tundra">
<divid="mapDiv"class="MapClass"></div>
<inputtype="button"value="空間查詢"id="Btn"/>
<divid="divShowResult"></div>
</body>
</html>
執行流程
結果顯示
2、利用IdentifyTask()實現空間查詢
在地圖上畫一個多邊形,設定需要查詢的多個圖層,將和多邊形相交的要素找出並高亮顯示,之後動態新增表格,將要素所在的圖層和名稱依次顯示在表格中
<!DOCTYPE html>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>Hello World</title>
<linkrel="stylesheet"href="http://js.arcgis.com/3.9/js/dojo/dijit/themes/tundra/tundra.css"/>
<linkrel="stylesheet"href="http://js.arcgis.com/3.9/js/esri/css/esri.css" />
<scriptsrc="http://js.arcgis.com/3.9/"></script>
<style>
#mapDiv {
height: 600px;
width: 900px;
border:1pxsolidred;
}
</style>
<script>
require(["esri/map",
"esri/layers/ArcGISDynamicMapServiceLayer",
"dojo/on",
"dojo/dom",
"esri/tasks/IdentifyTask",
"esri/tasks/IdentifyParameters",
"esri/toolbars/draw",
"esri/symbols/SimpleFillSymbol",
"esri/symbols/SimpleLineSymbol",
"esri/graphic",
"dojo/domReady!"],
function (Map,
ArcGISDynamicMapServiceLayer,
on,
dom,
IdentifyTask,
IdentifyParameters,
Draw,
SimpleFillSymbol,
SimpleLineSymbol,
Graphic
) {
var map = new Map("mapDiv");
//地圖服務的url
var MapServer = "http://localhost:6080/arcgis/rest/services/%E5%90%88%E5%B7%A5%E5%A4%A7%E5%B9%B3%E9%9D%A2%E7%AE%80%E5%9B%BE/MapServer";
//定義一個動態地圖服務
var layer = new ArcGISDynamicMapServiceLayer(MapServer);
map.addLayer(layer)
//定義繪圖物件
var toolBar = new Draw(map);
//繫結點選事件
on(dom.byId("Btn"),"click",function(e){
//啟用繪圖工具:繪製面
toolBar.activate(esri.toolbars.Draw.POLYGON);
})
//給繪圖工具繫結繪圖完成事件
on(toolBar, "draw-complete", function (result)
{
//獲得繪圖得到的面
var geometry=result.geometry;
//關閉繪圖工具
toolBar.deactivate();
//執行空間查詢
identifyQuery(geometry);
});
function identifyQuery(geometry) {
//定義空間查詢物件,注意他的引數是整個地圖服務,而不是單個圖層
var identifyTask = new IdentifyTask(MapServer);
//定義空間查詢引數物件
var params = new IdentifyParameters();
//容差
params.tolerance = 5;
//是否返回幾何資訊
params.returnGeometry = true;
//空間查詢的圖層,此時是兩個圖層
params.layerIds = [3,4];
//空間查詢的條件
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]), 2);
//建立面符號
var fill=new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, lineSymbol,new dojo.Color([0,200,50]));
if (idResults.length > 0) {
var htmls = "<table style=\"width: 900px\">";
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;
if(result.layerName == "面") //如果是面圖層,則提取地物名稱欄位
namevalue = result.feature.attributes.地物名稱;
else//否則提取道路名稱欄位
namevalue = result.feature.attributes.道路名稱;
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;
}
else {
document.getElementById("divShowResult").innerHTML = "";
}
}
});
</script>
</head>
<bodyclass="tundra">
<divid="mapDiv"class="MapClass"></div>
<inputtype="button"value="空間查詢"id="Btn"/>
<divid="divShowResult"></div>
</body>
</html>
結果顯示
地理資訊科學
Writed By NX
QQ:1051926720