选择集是存放当前地图中查询选择结果的集合,通过Select方法进行查询操作后,查询结果就会被关联至选择集中,通过访问选择集可以获取以前的查询结果。本实例以美国行政区数据为例,根据用户设定的查询条件,执行Select查询并将查询结果要素与选择集进行关联,然后对选择集中的要素进行显示。
实现步骤:
1.创建Android项目
2.添加Runtime SDK依赖
前两步本文省略,初学者可参照 ArcGIS Runtime SDK for Android 入门(1):第一个地图应用程序(二维)
3.添加权限及OpenGL ES支持
在AndroidManifest.xml中添加:
<!--联网权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!--OpenGL ES支持 -->
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
4.设置界面布局
布局XML代码:
<LinearLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="horizontal"
android:layout_weight="1">
<Spinner
android:id="@+id/spnState"
android:layout_width="0dp"
android:layout_height="match_parent"
android:spinnerMode="dropdown"
android:overlapAnchor="false"
android:layout_weight="1"/>
<Spinner
android:id="@+id/spnSelectionMode"
android:layout_width="0dp"
android:layout_height="match_parent"
android:spinnerMode="dropdown"
android:overlapAnchor="false"
android:layout_weight="1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="Select"
android:textSize="15sp"
android:id="@+id/btnSelect"/>
</LinearLayout>
<!-- MapView组件 -->
<com.esri.arcgisruntime.mapping.view.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="11">
</com.esri.arcgisruntime.mapping.view.MapView>
<Button
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="清空选择集"
android:textSize="16sp"
android:id="@+id/btnClearSelection"/>
</LinearLayout>
5.编写代码
思路:
(1)加载在线要素服务数据。
(2)通过设置下拉框,来进行查询条件的构造执行Select查询。
(3)通过设置下拉框,设置选择集的关联模式,将查询结果关联至图层选择集中。
步骤:
(1)变量准备:
private ArcGISMap mMap; //地图对象
private MapView mMapView; //MapView组件对象
private ServiceFeatureTable mServiceFeatureTable; //要素表服务对象
private FeatureLayer mFeaturelayer; //要素图层对象
private Spinner mStatesSpinner; //用于选择州名的下拉框组件件对象
private Spinner mSelectionModesSpinner; //用于选择州名的下拉框组件对象
private Button mSelectButton; //用于触发Query查询的按钮对象
private Button mClearSelectionButton; //用于清空查询结果的按钮对象
(2)onCreate方法:
//获取各UI元素
mMapView =(MapView)findViewById(R.id.mapView);
mStatesSpinner=(Spinner)findViewById(R.id.spnState);
mSelectionModesSpinner=(Spinner)findViewById(R.id.spnSelectionMode);
mSelectButton=(Button)findViewById(R.id.btnSelect);
mClearSelectionButton=(Button)findViewById(R.id.btnClearSelection);
//初始化下拉框
initSpinner();
//以地形图为底图创建地图对象
mMap = new ArcGISMap(Basemap.createTopographic());
//设置地图在MapView中显示
mMapView.setMap(mMap);
//通过URL创建ServiceFeatureTable对象
mServiceFeatureTable= new ServiceFeatureTable(getResources().getString(R.string.sample_service_url));
//使用ServiceFeatureTable对象创建Featurelayer对象
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));
//设置选择集显示样式
mFeaturelayer.setSelectionColor(Color.RED);
mFeaturelayer.setSelectionWidth(5);
//将图层添加到地图中
mMap.getOperationalLayers().add(mFeaturelayer);
//设置一个初始的地图视点
mMapView.setViewpointCenterAsync(new Point(-11000000, 5000000, SpatialReferences.getWebMercator()), 100000000);
//“SELECT”按钮的点击监听事件
mSelectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//调用queryStateByAttribute方法执行属性查询
selectState(mStatesSpinner.getSelectedItem().toString(),mSelectionModesSpinner.getSelectedItem().toString());
}
});
//“清空选择集”按钮的点击监听事件
mClearSelectionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//删除图层选择集
mFeaturelayer.clearSelection();
}
});
(3)初始化下拉框方法:
//初始化下拉框
private void initSpinner() {
//创建并实例化用于获取下拉框显示内容的泛型对象
ArrayList<String> stateArrayList=new ArrayList<String>();
ArrayList<String> selectionArrayList=new ArrayList<String>();
//通过资源文件设置下拉框中的显示内容
//获取XML中定义的数组
String[] stateStringArray=getResources().getStringArray(R.array.sample_state_names);
String[] selectionStringArray=getResources().getStringArray(R.array.sample_selection_modes);
//将数组导入到ArrayList对象中
for(int i=0;i<stateStringArray.length;i++){
stateArrayList.add(stateStringArray[i]);
}
for(int i=0;i<selectionStringArray.length;i++){
selectionArrayList.add(selectionStringArray[i]);
}
//创建并绑定用于控制下拉框显示的适配器对象
ArrayAdapter arrayAdapter1=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,stateArrayList);
arrayAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mStatesSpinner.setAdapter(arrayAdapter1);
ArrayAdapter arrayAdapter2=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,selectionArrayList);
arrayAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSelectionModesSpinner.setAdapter(arrayAdapter2);
}
(4)执行Select查询并关联选择集的核心方法:
//执行Select查询并对选择集进行展示
public void selectState(String strSearch,String strSelectionMode) {
//创建查询参数对象
QueryParameters queryParameters = new QueryParameters();
//构建where子句
queryParameters.setWhereClause("upper(STATE_NAME) LIKE '%" + strSearch.toUpperCase() + "%'");
//根据选择集关联模式执行Select
switch (strSelectionMode){
case "ADD":
mFeaturelayer.selectFeaturesAsync(queryParameters, FeatureLayer.SelectionMode.ADD);
break;
case "NEW":
mFeaturelayer.selectFeaturesAsync(queryParameters, FeatureLayer.SelectionMode.NEW);
break;
case "SUBTRACT":
mFeaturelayer.selectFeaturesAsync(queryParameters, FeatureLayer.SelectionMode.SUBTRACT);
break;
}
}
6.运行App:能够实现简单的操作选择集操作。
补充:在string.xml中添加字符串与数组资源:
<string name="sample_service_url">https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/2</string>
<string-array name="sample_state_names">
<item>Arkansas</item>
<item>California</item>
<item>Colorado</item>
<item>Connecticut</item>
<item>Delaware</item>
<item>District of Columbia</item>
<item>Florida</item>
<item>Georgia</item>
<item>Hawaii</item>
<item>Idaho</item>
<item>Illinois</item>
<item>Indiana</item>
<item>Iowa</item>
<item>Kansas</item>
<item>Kentucky</item>
<item>Louisiana</item>
<item>Maine</item>
<item>Maryland</item>
<item>Massachusetts</item>
<item>Michigan</item>
<item>Minnesota</item>
<item>Mississippi</item>
<item>Missouri</item>
<item>Montana</item>
<item>Nebraska</item>
<item>Nevada</item>
<item>New Hampshire</item>
<item>New Jersey</item>
<item>New Mexico</item>
<item>New York</item>
<item>North Carolina</item>
<item>North Dakota</item>
<item>Ohio</item>
<item>Oklahoma</item>
<item>Oregon</item>
<item>Pennsylvania</item>
<item>Rhode Island</item>
<item>South Carolina</item>
<item>South Dakota</item>
<item>Tennessee</item>
<item>Texas</item>
<item>Utah</item>
<item>Vermont</item>
<item>Virginia</item>
<item>Washington</item>
<item>West Virginia</item>
<item>Wisconsin</item>
<item>Wyoming</item>
</string-array>
<string-array name="sample_selection_modes">
<item>ADD</item>
<item>NEW</item>
<item>SUBTRACT</item>
</string-array>