Perform a feature analysis

Learn how to access the spatial analysis service using user authentication.

Perform a feature analysis using user authentication

A feature analysis is the process of using the spatial analysis service to perform server-side geometric and analytic operations on feature data. All feature analysis requests are job requests. The easiest way to programmatically run an analysis request to the spatial analysis service is to use ArcGIS REST JS, which provides a Job class that handles long- running operations.

In this tutorial, you use ArcGIS REST JS to perform a hot spot analysis to find statistically significant clusters of parking violations.

Prerequisites

Steps

Get the starter app

  1. Go to the Sign in with user authentication (browser) tutorial and download the solution.
  2. Unzip the folder and open it in a text editor of your choice, such as Visual Studio Code. The starter app includes the following:
    • callback.html: This contains callback as part of the authentication process.
    • index.html: This contains app logic and the OAuth 2.0 code necessary to perform the authentication.

Set up authentication

Create a new OAuth credential to register the application.

  1. Go to the Create OAuth credentials for user authentication tutorial to create an OAuth credential.
  2. Copy the Client ID and Redirect URL from your OAuth credentials item and paste them to a safe location. They will be used in a later step.

Set developer credentials

  1. In both the index.html and callback.html files, replace YOUR_CLIENT_ID and YOUR_REDIRECT_URL with the client ID and redirect URL of your OAuth credentials.

    index.html
    Use dark colors for code blocks
    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
        const authentication = await arcgisRest.ArcGISIdentityManager.beginOAuth2({
           clientId: "YOUR_CLIENT_ID", // Your client ID from OAuth credentials
           redirectUri: "YOUR_REDIRECT_URL", // The redirect URL registered in your OAuth credentials
           portal: "https://www.arcgis.com/sharing/rest" // Your portal URL
        })
    
    callback.html
    Use dark colors for code blocks
    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
        arcgisRest.ArcGISIdentityManager.completeOAuth2({
          clientId: "YOUR_CLIENT_ID", // Your client ID from OAuth credentials
          redirectUri: "YOUR_REDIRECT_URL", // The redirect URL registered in your OAuth credentials
          portal: "https://www.arcgis.com/sharing/rest" // Your portal URL
        })
    
  2. Run the app and ensure you can sign in successfully.

Add script references

In addition to ArcGIS REST JS Request, you also reference the Portal helper class from ArcGIS REST JS to obtain the spatial analysis service URL.

  1. Add references to the ArcGIS REST JS Portal helper class.

    Use dark colors for code blocks
    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
      <!-- ArcGIS REST JS used for user authentication -->
      <script src="https://unpkg.com/@esri/arcgis-rest-request@4/dist/bundled/request.umd.js"></script>
    
      <!-- ArcGIS REST JS used for portal service -->
      <script src="https://unpkg.com/@esri/arcgis-rest-portal@4/dist/bundled/portal.umd.js"></script>
    

Get the analysis URL

To make a request to the spatial analysis service, you need to get the URL first. The analysis service URL is unique to your organization.

  1. Call the getSelf operation from ArcGIS REST JS to obtain the analysis URL.

    Expand
    Use dark colors for code blocks
    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
        const getAnalysisUrl = async (session) => {
          const portalSelf = await arcgisRest.getSelf({
            authentication: session,
          });
    
          return portalSelf.helperServices.analysis.url;
        };
    
    Expand

Make the request

Use the Job class and set the operationURL and params required for the selected analysis.

  1. Add the parking violations feature layer to the points variable. This feature layer is the input data for the hot spot analysis.

    Expand
    Use dark colors for code blocks
    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
        const points =
          "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/sf_traffic_parking_violations_sa_osapi/FeatureServer/0";
    
    Expand
  2. Create a function that submits a Job request to the spatial analysis service using your organization's analysis URL. Set the params required for a hot spot analysis and authenticate using the session token.

    Expand
    Use dark colors for code blocks
    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
        const runAnalysis = async () => {
          const analysisUrl = await getAnalysisUrl(session);
          const operationUrl = `${analysisUrl}/FindHotSpots/submitJob`;
          const params = {
            analysisLayer: { url: points },
            shapeType: 'Hexagon',
            outputName: {
              serviceProperties: {
                name: `RestJS_find_hot_spots_${new Date().getTime()}`,
              },
            }, //Outputs results as a hosted feature serivce.
          };
    
          const jobReq = await arcgisRest.Job.submitJob({
            url: operationUrl,
            params: params,
            authentication: session,
          });
    
          // listen to the status event to get updates every time the job status is checked.
          jobReq.on(arcgisRest.JOB_STATUSES.Status, (jobInfo) => {
            console.log(jobInfo.status);
          });
    
          // get all the results, this will start monitoring and trigger events
          const jobResp = await jobReq.getAllResults();
    
          // jobResp.aggregatedLayer.value.url
          return jobResp;
        };
    
    
    Expand
  3. Call the runAnalysis function and store its result in the jobResponse variable.

    Expand
    Use dark colors for code blocks
    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
        const runAnalysis = async () => {
          const analysisUrl = await getAnalysisUrl(session);
          const operationUrl = `${analysisUrl}/FindHotSpots/submitJob`;
          const params = {
            analysisLayer: { url: points },
            shapeType: 'Hexagon',
            outputName: {
              serviceProperties: {
                name: `RestJS_find_hot_spots_${new Date().getTime()}`,
              },
            }, //Outputs results as a hosted feature serivce.
          };
    
          const jobReq = await arcgisRest.Job.submitJob({
            url: operationUrl,
            params: params,
            authentication: session,
          });
    
          // listen to the status event to get updates every time the job status is checked.
          jobReq.on(arcgisRest.JOB_STATUSES.Status, (jobInfo) => {
            console.log(jobInfo.status);
          });
    
          // get all the results, this will start monitoring and trigger events
          const jobResp = await jobReq.getAllResults();
    
          // jobResp.aggregatedLayer.value.url
          return jobResp;
        };
    
        const jobResponse = await runAnalysis()
    
    Expand

Handle the results

The results of a feature analysis are returned as feature data.

  1. Print out the metadata of the analysis. You can get the URL of the resulting feature layer from the metadata.

    Expand
    Use dark colors for code blocks
    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
        document.getElementById("result").textContent = JSON.stringify(jobResponse, null, 2);
    
    Expand

Run the app

Run the application and navigate to your localhost, for example: https://localhost:8080. The result should look similar to this.

What's next?

To learn how to perform other types of feature analysis, go to the related tutorials in the Spatial analysis services guide:

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.