"NAME like '%" + keyQuery + "%'" 既然是 “地圖”,“gis”,那么 查詢(QUERY)是必須的了。我們看看如何查詢。
動機:
我想要查找地圖上的某個點(要素,或者說某個位置 ),然后將檢索的結果 顯示出來(高亮)顯示。
執行查詢:
// 查詢的關鍵字String keyQuery = txtQueryString.getText().toString();Query query = new Query();// 類似sql語句的查詢 where語句query.setWhere("NAME like '%" + keyQuery + "%'");query.setReturnGeometry(true);// 指定查詢的目標圖層String queryUrl = URL_LAYER + "/0";// 構建查詢任務對象QueryTaskQueryTask queryTask = new QueryTask(queryUrl);
處理查詢的結果集:
FeatureSet fs = null;//結果集
你是否有了疑問:
為什么 我要寫這么一句
// 指定查詢的目標圖層
String queryUrl = URL_LAYER + "/0";
因為:你的圖層服務URL地址可能包含有多個圖層,而rest格式的url用 “/0 ” 這樣的“方式”表示第0個圖層。那么我們怎么知道要寫0,或者1,2,3等什么呢?這要看你的地圖制作者為你提供的內容了。我們再瀏覽器里打開我們的服務地址可以看到下面這樣:
注意到上面的 Layers: 省(0)了么? 這里的 0 ,就是第0個圖層。
為什么查詢的約束條件要這么寫?
// 類似sql語句的查詢 where語句
query.setWhere("NAME like '%" + keyQuery + "%'");
這其實是這么的一個查詢方式 ,比如: NAME like '%北京%' 。 是不是很像sql語句里的like語句啊。它的意思是查詢 “字段屬性名稱是NAME”的”值“,這里”是NAME里包含了 北京 這兩個字的 對象“,這里的對象,就是你查詢的結果,也就是返回的Graphic,這個對象,和字段(屬性)是地圖制作者向你提供的。我在瀏覽器打開我的地圖服務,可以看到下馬這樣:
注意 Filelds: 下面的描述了么? "NAME (Type:esriFieldTypeString,Alias:NAME). 它描述的內容是:”字符串格式,字段名稱是NAME“
----- -------------------
代碼如下
布局:
<?xml version="1.0" encoding="utf-8"?>
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
>
< TextView
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:text ="請輸入查詢關鍵字:" />
< EditText
android:id ="@+id/txtQueryString"
android:layout_width ="match_parent"
android:layout_height ="wrap_content"
android:ems ="10" android:text ="北京" >
< requestFocus />
</ EditText >
< Button
android:id ="@+id/queryButton"
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:layout_gravity ="center"
android:text ="執行查詢"
/>
< com.esri.android.map.MapView
xmlns:android ="http://schemas.android.com/apk/res/android"
android:id ="@+id/map" android:layout_width ="fill_parent"
android:layout_height ="fill_parent" url ="http://www.arcgis.com/home/webmap/viewer.html?webmap=58e58acce685442aa4c73f91fbb3a387"
>
</ com.esri.android.map.MapView >
</ LinearLayout >
代碼:
package demo;
import java.util.Random;
import com.esri.android.map.GraphicsLayer;
import com.esri.android.map.MapView;
import com.esri.core.geometry.Envelope;
import com.esri.core.map.FeatureSet;
import com.esri.core.map.Graphic;
import com.esri.core.renderer.SimpleRenderer;
import com.esri.core.symbol.SimpleFillSymbol;
import com.esri.core.symbol.SimpleMarkerSymbol;
import com.esri.core.symbol.SimpleMarkerSymbol.STYLE;
import com.esri.core.tasks.ags.query.Query;
import com.esri.core.tasks.ags.query.QueryTask;
import demo.attrbuteQuery.R;
import android.app.Activity;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class attrbuteQueryActivity extends Activity {
Button mQueryButton;
MapView mMapView;
final String URL_LAYER = " http://192.168.3.130/ArcGIS/rest/services/China/MapServer ";
GraphicsLayer mGraphicsLayer;
EditText txtQueryString;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtQueryString = (EditText) findViewById(R.id.txtQueryString);
mQueryButton = (Button) findViewById(R.id.queryButton);
mQueryButton.setOnClickListener( new OnClickListener() {
@Override
public void onClick(View arg0) {
// 查詢的關鍵字
String keyQuery = txtQueryString.getText().toString();
Query query = new Query();
// 類似sql語句的查詢 where語句
query.setWhere( " NAME like '% " + keyQuery + " %' ");
query.setReturnGeometry( true);
// 指定查詢的目標圖層
String queryUrl = URL_LAYER + " /0 ";
// 構建查詢任務對象QueryTask
QueryTask queryTask = new QueryTask(queryUrl);
FeatureSet fs = null; // 結果集
try {
fs = queryTask.execute(query); // 執行查詢
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
GraphicsLayer graphicsLayer = GetGraphicLayer();
String message = " No result comes back ";
if (fs != null && graphicsLayer.isInitialized() && graphicsLayer.isVisible()) {
// 獲得結果集內的 graphics 對象
Graphic[] grs = fs.getGraphics();
if (grs.length > 0) {
// 構建 簡單填充符號,該對象指定了一種“呈現方式”
SimpleFillSymbol symbol = new SimpleFillSymbol(
Color.RED);
// 設定呈現方式
graphicsLayer.setRenderer( new SimpleRenderer(symbol));
// 添加 graphic帶圖層,這時,會自動用剛剛指定的“呈現方式”來呈現
graphicsLayer.removeAll(); // 移除以前的
graphicsLayer.addGraphics(grs);
message = (grs.length == 1 ? " 1 result has " : Integer
.toString(grs.length) + " results have ")
+ " come back ";
}
}
Toast toast = Toast.makeText(attrbuteQueryActivity. this,
message, Toast.LENGTH_LONG);
toast.show();
}
});
mMapView = (MapView) findViewById(R.id.map);
// Add layer to MapView
mMapView.addLayer( new com.esri.android.map.ags.ArcGISDynamicMapServiceLayer(
URL_LAYER));
Envelope initextext = new Envelope( 12891659.0975195, 4817561.93785559,
12996377.82627, 4884902.95977474);
mMapView.setExtent(initextext);
}
/*
* 獲得 GetGraphicLayer
*/
private GraphicsLayer GetGraphicLayer() {
if (mGraphicsLayer == null) {
mGraphicsLayer = new GraphicsLayer();
mMapView.addLayer(mGraphicsLayer);
}
return mGraphicsLayer;
}
}