Limit the features displayed on a map with a definition expression.
Use case
Set a definition expression to filter out the features to be displayed. You might filter a dataset of tree quality selecting for only those trees which require maintenance or are damaged.
How to use the sample
Tap the 'Apply Expression' button to limit the features requested from the feature layer to those specified by the SQL query definition expression. Tap the 'Reset' button to remove the definition expression on the feature layer, which returns all the records.
How it works
Create a service feature table from a URL with new ServiceFeatureTable(url).
Create a feature layer from the service feature table with new FeatureLayer(serviceFeatureTable).
Set the limit of the features on your feature layer using the setDefinitionExpression().
Relevant API
FeatureLayer
FeatureLayer.setDefinitionExpression
ServiceFeatureTable
About the data
This map displays point features related to crime incidents that have been reported by city residents.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* Copyright 2016 ESRI
*
* All rights reserved under the copyright laws of the United States
* and applicable international laws, treaties, and conventions.
*
* You may freely redistribute and use this sample code, with or
* without modification, provided you include the original copyright
* notice and use restrictions.
*
* See the Sample code usage restrictions document for further information.
*
*/package com.esri.arcgisruntime.samples.featurelayerdefinitionexpression;
import android.os.Bundle;
import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import com.esri.arcgisruntime.ArcGISRuntimeEnvironment;
import com.esri.arcgisruntime.data.ServiceFeatureTable;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.SpatialReferences;
import com.esri.arcgisruntime.layers.FeatureLayer;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.BasemapStyle;
import com.esri.arcgisruntime.mapping.view.MapView;
publicclassMainActivityextendsAppCompatActivity{
MapView mMapView;
FeatureLayer mFeatureLayer;
boolean applyActive;
@OverrideprotectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// authentication with an API key or named user is required to access basemaps and other// location services ArcGISRuntimeEnvironment.setApiKey(BuildConfig.API_KEY);
// set up the bottom toolbar createBottomToolbar();
// inflate MapView from layout mMapView = findViewById(R.id.mapView);
// create a map with the topographic basemap ArcGISMap map = new ArcGISMap(BasemapStyle.ARCGIS_TOPOGRAPHIC);
// create feature layer with its service feature table// create the service feature table ServiceFeatureTable serviceFeatureTable = new ServiceFeatureTable(
getResources().getString(R.string.sample_service_url));
// create the feature layer using the service feature table mFeatureLayer = new FeatureLayer(serviceFeatureTable);
// add the layer to the map map.getOperationalLayers().add(mFeatureLayer);
// set the map to be displayed in the mapview mMapView.setMap(map);
// zoom to a view point of the USA mMapView.setViewpointCenterAsync(new Point(-13630845, 4544861, SpatialReferences.getWebMercator()), 600000);
}
privatevoidapplyDefinitionExpression(){
// apply a definition expression on the feature layer// if this is called before the layer is loaded, it will be applied to the loaded layer mFeatureLayer.setDefinitionExpression("req_Type = 'Tree Maintenance or Damage'");
}
privatevoidresetDefinitionExpression(){
// set the definition expression to nothing (empty string, null also works) mFeatureLayer.setDefinitionExpression("");
}
privatevoidcreateBottomToolbar(){
Toolbar bottomToolbar = findViewById(R.id.bottomToolbar);
bottomToolbar.inflateMenu(R.menu.menu_main);
bottomToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@OverridepublicbooleanonMenuItemClick(MenuItem item){
// handle action bar item clicksint itemId = item.getItemId();
// if statement is used because this sample is used elsewhere as a Library moduleif (itemId == R.id.action_def_exp) {
// check the state of the menu itemif (!applyActive) {
applyDefinitionExpression();
// change the text to reset applyActive = true;
item.setTitle(R.string.action_reset);
} else {
resetDefinitionExpression();
// change the text to apply applyActive = false;
item.setTitle(R.string.action_def_exp);
}
}
returntrue;
}
});
}
@OverrideprotectedvoidonPause(){
super.onPause();
mMapView.pause();
}
@OverrideprotectedvoidonResume(){
super.onResume();
mMapView.resume();
}
@OverrideprotectedvoidonDestroy(){
super.onDestroy();
mMapView.dispose();
}
}