① 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;
}