Feature Layer Definition Expression

Screenshot of Feature Layer Definition Expression App

Description

This sample demonstrates how you can limit which features to display on the map. Use the buttons in the bottom toolbar to apply or reset definition expression.

How it Works

You can achieve this by setting the definition expression property on a feature layer. It is the syntax of a SQL where clause by which to limit which features are displayed on the map.

Developer Pattern

private void applyDefinitionExpression() {
    // 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'");
}

private void resetDefinitionExpression() {
    // set the definition expression to nothing (empty string, null also works)
    mFeatureLayer.setDefinitionExpression("");
}

Code

/* 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.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;

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.Basemap;
import com.esri.arcgisruntime.mapping.view.MapView;

public class MainActivity extends AppCompatActivity {

    MapView mMapView;
    FeatureLayer mFeatureLayer;

    boolean applyActive;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // set up the bottom toolbar
        createBottomToolbar();

        // inflate MapView from layout
        mMapView = (MapView) findViewById(R.id.mapView);

        // create a map with the topographic basemap
        ArcGISMap map = new ArcGISMap(Basemap.createTopographic());

        // 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);

    }

    private void applyDefinitionExpression() {
        // 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'");
    }

    private void resetDefinitionExpression() {
        // set the definition expression to nothing (empty string, null also works)
        mFeatureLayer.setDefinitionExpression("");
    }

    private void createBottomToolbar() {

        Toolbar bottomToolbar = (Toolbar) findViewById(R.id.bottomToolbar);
        bottomToolbar.inflateMenu(R.menu.menu_main);

        bottomToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                // Handle action bar item clicks
                int itemId = item.getItemId();
                //if statement is used because this sample is used elsewhere as a Library module
                if(itemId == R.id.action_def_exp){
                    // check the state of the menu item
                    if (!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);
                    }
                }
                return true;
            }
        });
    }

    @Override
    protected void onPause(){
        super.onPause();
        // pause MapView
        mMapView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // resume MapView
        mMapView.resume();
    }
}