① Arcgis for android identify 和query查询遇到的问题,求教
1、QueryTask:是一个进行空间和属性查询的功能类,它可以在某个地图服务的某个子图层内进行查询,顺便提一下的是,QueryTask进行查询的地图服务并不必须加载到Map中进行显示。QueryTask的执行需要两个先决条件:一个是需要查询的图层URL、一个是进行查询的过滤条件。
下面是QueryTask的基本过程:
//新建一个QueryTask
QueryTask queryTask = new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5");
// Query对象
Query query = new Query();
//传入空间几何范围,可以不设置
//合法的geometry类型是Extent, Point, Multipoint, Polyline, Polygon
query.Geometry = geometry;
//是否返回查询结果的空间几何信息
query.ReturnGeometry = true;
//查询结果返回的字段,字段必须在图层中,字段的大小写可忽略
query.OutFields.AddRange(new string[] { "AREANAME", "POP2000" });
//quer.OutField.Add("*"); //返回所有字段
//查询的where条件,可以是任何合法的SQL语句,可以不设置
query.Where = "POP2000 > 350000";
//异步查询,需要绑定queryTask的两个事件,通过ExecuteCompleted得到查询结果
queryTask.ExecuteCompleted += QueryTask_ExecuteCompleted;
queryTask.Failed += QueryTask_Failed;
queryTask.ExecuteAsync(query);
//同步查询,不需要绑定事件,直接返回查询结果
//FeatureSet featureSet = queryTask.Execute(query);
2、FindTask:允许对地图中一个或多个图层的要素进行基于属性字段值的查询(search one or more layers in a map for features with attribute values that match or contain an input value)。FindTask不能进行“空间查询”,因为FindTask可以对多个图层进行查询,所有它的url属性需要指向所查询的地图服务的REST URL,而不像QueryTask需要指定某个图层的URL。
下面是FindTask的基本过程:
//新建一个Find task
FindTask findTask = new FindTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/");
//异步执行,绑定事件
findTask.ExecuteCompleted += FindTask_ExecuteCompleted;
findTask.Failed += FindTask_Failed;
//初始化FindParameters参数
FindParameters findParameters = new FindParameters();
findParameters.LayerIds.AddRange(new int[] { 3 }); //查找的图层
findParameters.SearchFields.AddRange(new string[] { "NAME" }); //查找的字段范围
findParameters.ReturnGeometry = true;
findParameters.SearchText = FindTextBox.Text; //查找的“属性值”
//设置查询的LayerDefinitions
ESRI.ArcGIS.Client.LayerDefinition myDefinition = new ESRI.ArcGIS.Client.LayerDefinition();
myDefinition.LayerID = 3;
//设置LayerDefinition,属性字段“Name”属于ID为0的图层
//LayerDefinition的设置语句和Query中的Where语句一样
myDefinition.Definition = "NAME = 'XXX'";
//创建一个ObservableCollection,add设置的LayerDefinition
System.Collections.ObjectModel.ObservableCollection<LayerDefinition> myObservableCollection =
new System.Collections.ObjectModel.ObservableCollection<LayerDefinition>();
myObservableCollection.Add(myDefinition);
findParameters.LayerDefinitions = myObservableCollection; //设置查询的LayerDefinitions
//异步执行
findTask.ExecuteAsync(findParameters);
3、IdentifyTask:是一个在地图服务中识别要素(Feature)的功能类。通过IdentifyTask可以搜索地图层中与输入几何形相交的要素(search the layers in a map for features that intersect an input geometry)。因为也是在多个图层中查询,所以Task的URL是动态图层服务的地址。同样,返回的要素都可以作为Graphic被添加到地图的GraphicsLayer上。
基本过程如下:
//新建一个Identify task
IdentifyTask identifyTask = new IdentifyTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer");
//异步执行,绑定事件
identifyTask.ExecuteCompleted += IdentifyTask_ExecuteCompleted;
identifyTask.Failed += IdentifyTask_Failed;
//初始化 Identify parameters
IdentifyParameters identifyParameters = new IdentifyParameters();
identifyParameters.LayerOption = LayerOption.all;
//传递地图属性给 identify parameters
identifyParameters.MapExtent = MyMap.Extent;
identifyParameters.Width = (int)MyMap.ActualWidth;
identifyParameters.Height = (int)MyMap.ActualHeight;
//输入的几何参数为一个点,args来自点击事件
identifyParameters.Geometry = args.MapPoint; //Point Envelop Extent polyline polygon
//设置查询的LayerDefinitions
ESRI.ArcGIS.Client.LayerDefinition myDefinition = new ESRI.ArcGIS.Client.LayerDefinition();
myDefinition.LayerID = 3;
//设置LayerDefinition,属性字段“Name”属于ID为0的图层
//LayerDefinition的设置语句和Query中的Where语句一样
myDefinition.Definition = "NAME = 'XXX'";
//创建一个ObservableCollection,add设置的LayerDefinition
System.Collections.ObjectModel.ObservableCollection<LayerDefinition> myObservableCollection =
new System.Collections.ObjectModel.ObservableCollection<LayerDefinition>();
myObservableCollection.Add(myDefinition);
identifyParameters.LayerDefinitions = myObservableCollection; //设置查询的LayerDefinitions
//异步执行
identifyTask.ExecuteAsync(identifyParameters);
三种查询的返回结果:
QueryTask:返回的是一个FeatureSet。Featureset.features[i]可以加入到GraphicsLayer上显示,也可以通过Attributes属性字段得到属性信息。
FindTask:返回的是一个FindResults数组, FindResults[i].feature可以加入到GraphicsLayer上显示,也可以通过Attributes属性字段得到属性信息。
IdentifyTask:返回的是一个IdentifyResults数组,IdentifyResults[i].feature可以加入到GraphicsLayer上显示,也可以通过Attributes属性字段得到属性信息。
② android应用中的搜索功能怎么实现的
在APP应用中启用搜索
在app应用中,至少要执行如下的三个步骤,才能让app应用能够进行检索。如果要提供搜索建议,还需要执行第4步:
编写搜索配置的XML文件
编写搜索的activity类
在Android的manifest.xml文件中,对两面两个步骤的工作进行配置。
如果要使用搜索建议,则需要增加一个contentprovider。
配置搜索的XML配置文件
首先看下如何配置搜索的XML配置文件。先命名配置文件名称为searchable.xml,保存在res/xml文件夹中。然后需要设置搜索框的文本,并且应该增加一个hint的提示文本信息,如下代码所示:
<searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/search_label"> android:hint="@string/search_hint" </searchable>
关于搜索配置文件有很多的配置选项,建议参考Android的手册可以获得更多:
http://developer.android.com/guide/topics/search/searchable-config.html。
增加搜索的Activity
当用户进行搜索时,Android调用activity进行搜索,代码如下:
publicclass SampleSearchActivity extends ListActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handleIntent(getIntent()); }public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handleIntent(getIntent()); } public void onNewIntent(Intent intent) { setIntent(intent); handleIntent(intent); } public void onListItemClick(ListView l, View v, int position, long id) { // 点每个搜索结果时的处理代码 } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doSearch(query); } } private void doSearch(String queryStr) { //执行真正的查询结果处理 } }
在上面的代码中,在handleIntent方法中,当按下搜索按钮,系统就会自动发送Intent,action是Intent.ACTION_SEARCH,然后通过intent.getStringExtra(SearchManager.QUERY);获得要搜索的字符串。
其中为什么要包含onNewIntent()方法呢?主要是因为Android的back后退机制。Android会默认把每一个新的activity放到activity栈的顶部。如果用户点了后退键,则会关闭栈顶部的activity。尝试考虑一种情况,用户搜索一个内容并且系统列出了结果,如果用户发现结果不是他所要的,或者希望重新检索,则会重新点击搜索按键,这样将会产生一个新的搜索activity的实例,在activity栈中就会有两个搜索的activity,这是开发者并不期待的,所以,需要将这个搜索的activity声明为singleTop类型的activity,这样的话,无论用户按返回键还是尽心个多次的搜索,在acitivty栈中始终保持的是一个搜索activity的实例。因为当activity被设置为singleTop的加载模式时,如果堆栈的顶部已经存在了该Activity,那么,它便不会重新创建,而是调用onNewIntent。如果,该Activity存在,但不是在顶部,那么该Activity依然要重新创建。
mainifest配置文件
接下来,需要对manifest配置文件进行配置,必须要对其中进行如下配置:
搜索的activity.
使用搜索的intent
activity启动模式
searchable.xml中的元数据
更多的定义搜索的元数据
下面是典型的一个搜索的配置
<application android:icon="@drawable/icon" android:label="@string/app_name" android:name=".YourApp" > <meta-data android:name="android.app.default_searchable" android:value=".YourSearchActivity" /> <activity android:label="@string/app_name" android:launchMode="singleTop" android:name=".YourSearchActivity" > <intent-filter > <action android:name="android.intent.action.SEARCH" /> </intent-filter> <intent-filter > <action android:name="android.intent.action.VIEW" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> </application>
在上面的典型配置中,要注意如下几点:
1)由于当调用搜索activity时,Android调用的是android.intent.action.SEARCH作为搜索的intent,所以必须在intent-filter中包含android.intent.action.SEARCH。
2)在<meta-data>中,指出了searchable.xml的位置
3)同样在<meta-data>中,通过:
<meta-data android:name="android.app.default_searchable" android:value=".YourSearchActivity" />
指出了当执行搜索的字符串提交时,将调用哪一个activity去进行处理。
③ android判断某服务是否正在运行
Android系统中,判断应用塌昌腔服务是否启动有两种方式:
1.根据包名判断,以下团衫为判断代码:
public boolean checkApkExist(Context context, String packageName) {
if (packageName == null || “”.equals(packageName))
return false;
try {
ApplicationInfo info = context.getPackageManager()
.getApplicationInfo(packageName,
PackageManager.GET_UNINSTALLED_PACKAGES);
return true;
} catch (NameNotFoundException e) {
return false;
}
}
2. 根据Intent判断,以下为判迅轮断代码:
public boolean checkApkExist(Context context, Intent intent) {
List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent, 0);
if(list.size() > 0){
return true;
}
return false;
}
public boolean checkApkExist(Context context, String packageName) {
if (packageName == null || “”.equals(packageName)) return false;
try {
ApplicationInfo info = context.getPackageManager() .getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES); return true;
} catch (NameNotFoundException e) { return false; }
}
public boolean checkApkExist(Context context, Intent intent) {
List<ResolveInfo> list = context.getPackageManager()
.queryIntentActivities(intent, 0);
if (list.size() > 0) {
return true;
}
return false;
}