在ArcGIS API中查詢功能是經(jīng)常使用的微酬,常用的三個查詢分別是FindTask艰亮,QueryTask孝凌,IdentifyTask离钝。它們各自都有自己的特點票编。
查詢功能分為屬性查詢和空間查詢
* | 屬性查詢 | 空間和屬性 | 識別查詢(圖) |
---|---|---|---|
單圖層 | * | QueryTask | * |
多圖層 | FindTask | * | IdentifyTask |
1. FindTask
官方文檔
對一個地圖服務(wù)的多個圖層對象(全部或指定幾個ID索引)做屬性查詢。
- 有兩個相關(guān)聯(lián)的屬性:
FindParameters:屬性查找的設(shè)定卵渴,包含圖層慧域,文本搜索,字段搜索浪读,指定返回幾何數(shù)據(jù)的精度昔榴,允許返回幾何圖形的最大偏移量等。根據(jù)需求設(shè)定碘橘。
FindResult:搜索返回的數(shù)據(jù)互订。根據(jù)需求處理數(shù)據(jù)。
- 簡單屬性搜索
//創(chuàng)建搜索的地圖服務(wù)和指定圖層
var find = new FindTask({
url: "http://*********/MapServer" });
var params = new FindParameters({
layerIds: [0], });
//js獲取點擊事件痘拆,執(zhí)行查找函數(shù)
document.getElementById("findBtn").addEventListener("click", doFind);
function doFind() {
//設(shè)定搜索為文本搜索并獲取搜索關(guān)鍵字
params.searchText =document.getElementById("inputTxt").value;
//按參數(shù)設(shè)定執(zhí)行查找
find.execute(params)
.then(showResults)//正確返回執(zhí)行函數(shù)
.catch(rejectedPromise);//錯誤返回執(zhí)行函數(shù)
}
//獲取表格要顯示的地方
var resultsTable = document.getElementById("tbl");
//正確請求仰禽,處理返回結(jié)果
function showResults(response) {
//得到搜索結(jié)果,清空上次搜索顯示結(jié)果
var results = response.results;
resultsTable.innerHTML = "";
//判斷本次搜索返回是不是空
if (results.length === 0) {
resultsTable.innerHTML = "<i>未搜索到結(jié)果</i>";
return;
}
// 設(shè)定表格的列數(shù)和列名
var topRow = resultsTable.insertRow(0);
var cell1 = topRow.insertCell(0);
cell1.innerHTML = "<b>名稱</b>";
//forEach遍歷搜索結(jié)果
results.forEach(function(findResult, i) {
// 通過findResult.feature.attributes取出對應(yīng)字段屬性
var state = findResult.feature.attributes[
"名稱"];
// 將獲取的屬性插入表格
var row = resultsTable.insertRow(i + 1);
var cell1 = row.insertCell(0);
cell1.innerHTML = state;
});
}
//請求失敗,打印錯誤信息
function rejectedPromise(error) {
console.error("msg: ", error.message);
}
//至于HTML標(biāo)簽input坟瓢、button勇边、和顯示結(jié)果的table不寫了,自行補全折联。
2. QueryTask
官方文檔
只能針對一個圖層進行空間或?qū)傩圆樵儭?/p>
- 有四個相關(guān)屬性
名稱 | 作用 |
---|---|
Query | 普通查詢粒褒,一般常用的查詢 |
AttachmentQuery | 翻譯為附件查詢,具體看官方文檔 |
RelationshipQuery | 關(guān)系查詢诚镰,具體看官方文檔 |
FeatureSet | 特征復(fù)位奕坟,搜索返回的特性集合,包含每個搜索結(jié)果的屬性和空間 |
- QueryTask有好幾種執(zhí)行查詢的方法清笨,不同的方法對應(yīng)不同的查詢:
名稱 | 返回格式 | 作用 |
---|---|---|
execute() | Promise<FeatureSet> | 常用查詢月杉,返回滿足查詢的對象屬性和空間 |
executeAttachmentQuery() | Promise<AttachmentInfo[]> | ** |
executeForCount() | Promise<Number> | 返回滿足輸入查詢的特征數(shù) |
executeForExtent() | Promise<[Object]> | 一個對象,包含滿足的范圍和計數(shù) |
executeForIds() | Promise<Number[]> | 對url指定的layer層查詢抠艾,返回的是滿足查詢的對象ID數(shù)組 |
executeRelationshipQuery() | Promise<FeatureSet> | 關(guān)系查詢RelationshipQuery使用 |
- 查詢Query也有許多設(shè)定苛萎,此處就不一一講解了,需要的話检号,看官方文檔腌歉,這里只說兩個常用方法。
where:根據(jù)字段查詢
query.where = "NAME = '" + stateName + "'";
query.where = "POP04 > " + population;
text:文本查詢齐苛,查詢使用的是服務(wù)器顯示的字段翘盖,
是使用“l(fā)ike”的WHERE子句的縮寫。
query.text = "山 ";
- 查詢結(jié)果
QueryTask查詢的返回結(jié)果是FeatureSet凹蜂,F(xiàn)eatureSet也有自己的屬性馍驯,一般常用的就是features,格式為Graphic[]玛痊,將其添加到GraphicsLayer中汰瘫,再添加到map即可在圖層顯示
參考教程上說明:(QueryTask進行查詢的地圖服務(wù)并不必項加載到Map中進行顯示。)
查詢定位實現(xiàn)代碼:
var Url = "http://****/MapServer/0"; //指定圖層
// 結(jié)果使用的渲染模板擂煞,使用了模板語法具體設(shè)定看官方文檔
var popupTemplate = {
title: "{名稱}",
fieldInfos: [{
fieldName: "OBJECTID",
label: "OBJECTID",
format: {
places: 0,
digitSeperator: true
}
}],
content: "<br><b>OBJECTID:</b> {OBJECTID}"
};
//設(shè)定點的symbol混弥,實現(xiàn)標(biāo)注地點效果
var mtnSymbol = {
type: "simple-marker",
style: "square",
color: "blue",
size: "8px",
outline: {
color: [ 255, 255, 0 ],
width: 3 // points
}
};
//創(chuàng)建layer,為了將搜索結(jié)果渲染在map上
var resultsLayer = new GraphicsLayer();
map.add(resultsLayer);
//新建查詢颈娜,設(shè)定鏈接和參數(shù)
var qTask = new QueryTask({url: Url});
var params = new Query({
//是否返回幾何
returnGeometry: true,
//要查詢的字段,全字段查詢
outFields: ["*"]
});
//執(zhí)行查詢函數(shù)
function doQuery() {
//獲取輸入內(nèi)容浙宜,設(shè)定查詢參數(shù)方式官辽,移除上一次的結(jié)果
var value = document.getElementById("inputTxt").value;
resultsLayer.removeAll();
params.text=value;
//查詢
qTask.execute(params)
.then(getResults)
.catch(promiseRejected);
}
function getResults(response) {
var peakResults = arrayUtils.map(response.features,
function(feature) {
//設(shè)定搜索結(jié)果的symbol和popupTemplate。
feature.symbol =mtnSymbol;
feature.popupTemplate = popupTemplate;
return feature;
}
);
//將搜索結(jié)果添加到Graphiclayer上
resultsLayer.addMany(peakResults);
//點擊實現(xiàn)視圖跳轉(zhuǎn)到結(jié)果layer上
view.goTo(peakResults).then(function() {
//將其中一個標(biāo)簽顯示出來
view.popup.open({
features: peakResults,
featureMenuOpen: true,
updateLocationEnabled: true
});
});
dom.byId("printResults").innerHTML =
"找到"+peakResults.length +"個結(jié)果 !";
}
function promiseRejected(error) {
console.error("msg: ", error.message);
}
//執(zhí)行查找功能
document.getElementById("doBtn").addEventListener("click", doQuery);
//將搜索框添加到view中顯示
view.when(function () {
view.ui.add("optionsDiv", "bottom-right");
}
HTML標(biāo)簽:
<div class="esri-widget" id="optionsDiv">
<h5>輸入關(guān)鍵詞查詢</h5>
<input type="text" id="inputTxt" size="25" value="**" />
<button class="esri-widget" id="doBtn">查找</button>
<br><p><span id="printResults"></span></p>
</div>
3.IdentifyTask
- 相關(guān)屬性
IdentifyParameters 參數(shù)設(shè)定
IdentifyResult 結(jié)果
是一個在地圖服務(wù)中識別要素的功能類粟瞬。當(dāng)用戶在客戶端使用Draw工具繪制了一個幾何對象以后同仆,這個幾何對象就可以作為IdentifyTask的參數(shù)収送到服務(wù)器迕行識別,滿足條件的要素將會被輸出裙品,返回要素都可以作為Graphic被添加到地圖上俗批。
具體實現(xiàn)目前沒做俗或,可參考官方文檔。
不足之處岁忘,歡迎指正辛慰。