需求:
使用ArcGIS Runtime SDK for Android100.x实现过滤ArcGISMapImageLayer子图层要素,通过筛选进行过滤其子图层中的一些要素的显示和隐藏。
思路:
①发布动态地图服务
ArcGISMapImageLayer对应的地图服务类型是动态地图服务
②使用ArcGISMapImageSublayer下的setDefinitionExpression方法实现对ArcGISMapImageLayer子图层进行过滤。链接:https://developers.arcgis.com/android/api-reference/reference/com/esri/arcgisruntime/layers/ArcGISMapImageSublayer.html#setDefinitionExpression(java.lang.String)
案例实现:
runtime for android 版本:100.9
假设在北京子图层中只显示除了房山区以外的其它要素
①使用arcgis desktop发布动态地图服务
如下图,可见发布的动态地图服务中有3个子图层(AAAAA风景名胜区、水系面、北京)
②使用ArcGISMapImageSublayer下的setDefinitionExpression方法实现对ArcGISMapImageLayer子图层进行过滤。
public class MainActivity extends AppCompatActivity {
private MapView mMapView;
private Button mQueryButton;
private EditText mQueryInputBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// inflate views from layout
mMapView = findViewById(R.id.mapView);
// create a map with a streets vector basemap and set initial viewpoint
ArcGISMap map = new ArcGISMap(Basemap.createStreetsVector());
Point initialLocation = new Point(12973064.334,4892683.809, SpatialReferences.getWebMercator());
Viewpoint viewpoint = new Viewpoint(initialLocation, 4000000);
map.setInitialViewpoint(viewpoint);
// set the map to be displayed in this view
mMapView.setMap(map);
// create and add a map image layer to the map
ArcGISMapImageLayer imageLayer = new ArcGISMapImageLayer(getString(R.string.usa_map));
map.getOperationalLayers().add(imageLayer);
// wait until the layer is loaded before enabling the query button
imageLayer.addDoneLoadingListener(() -> {
if (imageLayer.getLoadStatus() == LoadStatus.LOADED) {
// get and load each sublayer to query
ArcGISMapImageSublayer citiesSublayer = (ArcGISMapImageSublayer) imageLayer.getSublayers().get(0);
ArcGISMapImageSublayer statesSublayer = (ArcGISMapImageSublayer) imageLayer.getSublayers().get(1);
ArcGISMapImageSublayer countiesSublayer = (ArcGISMapImageSublayer) imageLayer.getSublayers().get(2);
countiesSublayer.setDefinitionExpression("NAME <> '房山区'" );
citiesSublayer.loadAsync();
statesSublayer.loadAsync();
countiesSublayer.loadAsync();
}
});
}
@Override
protected void onPause() {
super.onPause();
mMapView.pause();
}
@Override
protected void onResume() {
super.onResume();
mMapView.resume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.dispose();
}
}
其中setDefinitionExpression的参数是一条sql语句,可以通过arcmap的定义查询还获得,以免自己写语句时拼写错误,如下图:
最终的效果: