本文主要讲解如何通过ArcGIS Runtime SDK for Android进行要素图层FeatureLayer的查询。
实现步骤:
1.创建Android项目
2.添加Runtime SDK依赖
3.添加权限及OpenGL ES支持
前三步本文省略,初学者可参照ArcGIS Runtime SDK for Android 入门(1):第一个地图应用程序(二维)
4.设置界面布局
(1)主布局XML添加代码:
<!-- MapView控件 -->
<com.esri.arcgisruntime.mapping.view.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.esri.arcgisruntime.mapping.view.MapView>
(2)菜单menu布局代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/action_search"
android:title="@string/action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="ifRoom" />
</menu>
5.编写代码:
思路:
(1)创建一个ServiceFeatureTable对象,并添加到地图。
(2)创建QueryParameters对象,并设置查询参数。
(3)ServiceFeatureTable执行查询操作 mServiceFeatureTable.queryFeaturesAsync(queryparameter)。
(4)处理查询结果信息 listenableFuture.addDoneListener()。
步骤:
(1)变量准备:
//MapView控件变量
MapView mMapView;
//ServiceFeatureTable变量,用于创建FeatureLayer要素图层
ServiceFeatureTable mServiceFeatureTable;
//FeatureLayer要素图层变量
FeatureLayer mFeaturelayer;
(2)onCreate方法中:
// 通过layout获取MapView控件变量
mMapView = (MapView) findViewById(R.id.mapView);
// 以地形图为底图创建地图对象
final ArcGISMap map = new ArcGISMap(Basemap.createTopographic());
// 设置地图在MapView中被显示
mMapView.setMap(map);
// 创建ServiceFeatureTable
mServiceFeatureTable = new ServiceFeatureTable("https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/2");
// 使用ServiceFeatureTable创建feature layer
mFeaturelayer = new FeatureLayer(mServiceFeatureTable);
mFeaturelayer.setOpacity(0.8f);
//重写renderer渲染器
SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLACK, 1);
SimpleFillSymbol fillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.YELLOW, lineSymbol);
mFeaturelayer.setRenderer(new SimpleRenderer(fillSymbol));
// 将图层添加到地图中
map.getOperationalLayers().add(mFeaturelayer);
// 设置一个视点
mMapView.setViewpointCenterAsync(new Point(-11000000, 5000000, SpatialReferences.getWebMercator()), 100000000);
(3)方法支持:
//处理搜索小部件的Intent事件
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String searchString = intent.getStringExtra(SearchManager.QUERY);
//执行查询
searchForState(searchString);
}
}
public void searchForState(final String searchString) {
// 清空所有以前的查询结果
mFeaturelayer.clearSelection();
// 创建一个能够根据搜索条件进行查询的对象
QueryParameters query = new QueryParameters();
// 设置查询不区分大小写
query.setWhereClause("upper(STATE_NAME) LIKE '%" + searchString.toUpperCase() + "%'");
// 调用进行要素查询
final ListenableFuture<FeatureQueryResult> future = mServiceFeatureTable.queryFeaturesAsync(query);
// 当查询结果返回时,使用addDoneListener触发
future.addDoneListener(new Runnable() {
@Override
public void run() {
try {
// 调用future的get方法获取结果
FeatureQueryResult result = future.get();
// 检查是否查询出了结果
if (result.iterator().hasNext()) {
// 获取查询结果的第一个要素的地图范围,并设置地图缩放至该范围
Feature feature = result.iterator().next();
//获取结果feature的几何形状变量
Geometry geoResult=feature.getGeometry();
//获取结果feature的几何外接矩形
Envelope envelope = geoResult.getExtent();
//创建用于显示查询结果的Symbol符号
SimpleFillSymbol FillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.RED, new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.RED, 2));
//创建用于显示查询结果的Graphic图形
Graphic graphicResult=new Graphic(geoResult,FillSymbol);
//创建用于显示查询结果的GraphicOverlay,并将Graphic加入其中
GraphicsOverlay graphicsOverlay=new GraphicsOverlay();
graphicsOverlay.getGraphics().add(graphicResult);
//显示查询结果
mMapView.getGraphicsOverlays().clear();
mMapView.getGraphicsOverlays().add(graphicsOverlay);
mMapView.setViewpointGeometryAsync(envelope, 10);
//查询要素
mFeaturelayer.selectFeature(feature);
} else {
Toast.makeText(MainActivity.this, "No states found with name: " + searchString, Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Toast.makeText(MainActivity.this, "Feature search failed for: " + searchString + ". Error=" + e.getMessage(),
Toast.LENGTH_SHORT).show();
Log.e(getResources().getString(R.string.app_name),
"Feature search failed for: " + searchString + ". Error=" + e.getMessage());
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//获取menu,如果它是当前项,这将把它添加到action bar中
getMenuInflater().inflate(R.menu.menu_main, menu);
// 获取SearchView然后设置对它进行可搜索配置
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
// 假设当前的activity是可被搜索的
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false); // 不要将小部件图标化,通过默认模式它进行缩放 Do not iconify the widget; expand it by default
return true;
}
6.运行APP:在搜索菜单中输入搜索内容,既可以进行要素查询。
感谢luq老师的指导