在ArcGIS for Android(10.1.1) 查找使用FindTask这个类,给它传入FindParameters的参数,可以执行查找操作,并返回FindResult类型的List集合,跟QueryTask和IdentifyTask都有点像,但它们三个还是有差别的:
QueryTask所查找的对象为一个MapServer的只图层,并可以可以不用加载进来就可以直接进行查询,可以进行空间查询和属性查询。
IdentifyTask识别的对象为一个MapServer,进行的是空间识别。
FindTask的查找对象也是一个MapServer,可以根据设置查找的字符串,进行属性的查找,
进行的是属性查询
以下代码,是在一个MapServer的layerID为2的图层中,查找所有字段指中与“island”相匹配的斑块并显示出来。
public class FindTaskTestActivity extends Activity {
private List<FindResult> res;
private GraphicsLayer gl;
MapView mMapView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMapView = (MapView) findViewById(R.id.map);
ArcGISDynamicMapServiceLayer basemap = new ArcGISDynamicMapServiceLayer(
"http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer");
mMapView.addLayer(basemap);
mMapView.setExtent(new Envelope(-159.267600772764,11.2206525667169,
-32.0310878479893, 62.5140046432286));
gl=new GraphicsLayer();
mMapView.addLayer(gl);
mMapView.setOnSingleTapListener(new MyOnSingleTagLis());
}
class MyOnSingleTagLis implements OnSingleTapListener {
public void onSingleTap(float arg0, float arg1) {
//定义各种查找参数
final FindParameters paras = new FindParameters();
paras.setReturnGeometry(true);//需要返回Geometry
paras.setSearchText("island");//搜索关键字为island
paras.setLayerIds(new int[]{2});//查找图层(默认为查找所有图层)
//paras.setSearchFields(new String[]{});//搜索自动化,没有设置默认为搜索全部字段
final FindTask findtask = new FindTask(
"http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer");
new Thread() {
public void run() {
try {
//在子线程中执行操作
res=findtask.execute(paras);
proResult(res);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
}
/**
* 处理查找结果,把结果显示出来
*/
private void proResult(final List<FindResult> res){
if(res==null || res.size()==0){
return;
}
runOnUiThread(new Runnable() {
public void run() {
for(FindResult fr: res){
Geometry g=fr.getGeometry();
//由于知道我们查找的图层是个面图层,可以定义面的符号,如果不知道图层的类型,可以通过fr.getGeometryType()判断
SimpleFillSymbol sfs=new SimpleFillSymbol(Color.RED);
//把查找的图型显示出来
gl.addGraphic(new Graphic(g, sfs));
//获取所有属性,并遍历出来
Map<String, Object> atts= fr.getAttributes();
Set<Entry<String, Object>> entrys= atts.entrySet();
for(Entry<String, Object> entry :entrys){
Log.i(entry.getKey(), entry.getValue().toString());
}
Log.i("Attributes", "----------------------------------------");
//由于上面的设置查找的结果只有一个FindResult,可以把地图缩放到这个查找的结果范围,便于观察
//如果有多个返回结果,就不适合这样弄啦
mMapView.setExtent(g,100);
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
mMapView.pause();
}
@Override
protected void onResume() {
super.onResume();
mMapView.unpause();
}
}
结果