arcgis for android 学习 - (6) 属性查询。检索图层上某个要素,并高亮显示它。
"NAME like '%" + keyQuery + "%'"
动机:
我想要查找地图上的某个点(要素,或者说某个位置 ),然后将检索的结果 显示出来(高亮)显示。
执行查询:
// 查询的关键字
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";
}
}
你是否有了疑问:
为什么 我要写这么一句
// 指定查询的目标图层
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“
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;
}
}