深入淺出 Javascript API(五)–Query & Find 查詢

來源:互聯網
上載者:User
查詢是webgis常用功能之一,基於地圖的查詢經曆了多種形式的演變,現在用什麼形式來展現查詢已經沒有固定模式,在適合webgis範圍內,什麼形式能夠滿足應用,就用什麼形式的查詢。舉例描述一個最經典的情境,滑鼠點擊地圖顯示一個TIP小視窗,顯示查詢對象的簡單資訊,小視窗中提供一個"詳細資料"連結,點擊後彈出網頁顯示資料卡片。還有這樣的形式,如拉框選擇點要素,同時在地圖下方的DIV顯示出選擇點的屬性資訊,這個在《[url=]ArcGIS Server 開發系列(五)--自訂 Toolbar 工具[/url]》通過ADF已經實現。Ags Javascript API如何完成這些功能呢?
    內容目錄:

1.Query查詢屬性資料(無地圖)
2.滑鼠移動顯示Query查詢結果
3.Find查詢地圖,並在頁面下方顯示相應屬性資料

1.僅用Query查詢屬性,不返回地圖資訊,此時就不再需要建立esri.layers.ArcGISMapServiceLayer對象來處理地圖,但是需要引入"esri.tasks.query",並建立QueryTask對象:
queryTask =
new esri.tasks.QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5");

    webgis查詢一般涉決定返回結果的參數,包括是否返回幾何圖形,查詢的屬性欄位,查詢方式(預設"SPATIAL_REL_INTERSECTS"),查詢Where語句等,例如:
query =
new esri.tasks.Query();
query.returnGeometry =
false;
query.outFields = ["SQMI","STATE_NAME","SUB_REGION","POP2000","POP2007","MALES","FEMALES"];

    執行查詢,並將結果寫入回呼函數showResults:
function execute(stateName) {
    query.text = stateName;
    queryTask.execute(query,showResults);
}

    所有的結果都會寫入到showResults參數Featureset對象中,遍曆該對象得到我們想要的屬性結果。

    查詢方式:

2.滑鼠移動顯示Query查詢結果是常用的查詢方式之一,最重要的就是利用了Ajax非同步傳輸,將少量的資訊顯示在一個Tip中,訪問效率高,體驗較好。這裡我們可以決定,是預設指定一圖層地區要素進行hover查詢,還是滑鼠點擊要查詢的要素後,再hover查詢,以實現前者為例,其他方式以此類推。

    查詢功能主要是這幾行程式碼完成:
var queryTask =
new esri.tasks.QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/3");
var query =
new esri.tasks.Query();
query.returnGeometry =
true;
query.outFields = ["NAME", "POP2000", "POP2007", "POP00_SQMI", "POP07_SQMI"];
query.where =
"STATE_NAME = 'South Carolina'";

    "query.text"和"query.where"區別在於,前者是通過"like"方式執行where查詢,後者是直接寫SQL語句。

    TIP UI是一個InfoWindow
var infoTemplate =
new esri.InfoTemplate();
infoTemplate.title =
"${NAME}";
infoTemplate.content =
"<b>2000 Population: </b>${POP2000}<br/>"
+
"<b>2000 Population per Sq. Mi.: </b>${POP00_SQMI}<br/>"
+
"<b>2007 Population: </b>${POP2007}<br/>"
+
"<b>2007 Population per Sq. Mi.: </b>${POP07_SQMI}";
map.infoWindow.resize(205,125);

    滑鼠移動到指定地區後,通過對滑鼠onmousemove和onmouseout事件來顯示或隱藏查詢TIPs
dojo.connect(map.graphics, "onMouseOver", function(evt) {
    var content = evt.graphic.getContent();
    map.infoWindow.setContent(content);
    var title = evt.graphic.getTitle();
    map.infoWindow.setTitle(title);
    evt.graphic.setSymbol(highlightSymbol);
    map.infoWindow.show(evt.screenPoint,map.getInfoWindowAnchor(evt.screenPoint));
});

dojo.connect(map.graphics, "onMouseOut", function(evt) {
    map.infoWindow.hide();
    evt.graphic.setSymbol(symbol);
});

3.Find查詢,和Query功能類似,但使用的REST服務不同,Query需要指定具體的REST圖層服務,如"http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/3",而Find僅需提供當前地圖服務"http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer",然後通過屬性來控制對哪個圖層進行尋找。
findTask =
new esri.tasks.FindTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer");
findParams =
new esri.tasks.FindParameters();
findParams.returnGeometry =
true;
findParams.layerIds = [0,1,2];
findParams.searchFields = ["CITY_NAME","NAME","SYSTEM","STATE_ABBR","STATE_NAME"];

   這樣做的好處是,可以方便的對多個圖層進行查詢,js代碼只需要設定layerIds,在此之前添加"dojo.require("esri.tasks.find");"。頁面下方顯示查詢結果,通過Ajax重新整理,這裡可以利用dojox.grid完成這個過程,Find搜尋只能用like方式,並且不區分大小寫,這是和Query另外一個區別。

    部落格園連結:http://www.cnblogs.com/flyingis/archive/2008/07/29/1255373.html

本主題由 flyingis 於 2008-10-16 09:00 設定高亮
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.