Skip to content

An array of analysis and tracing options usually begin with or include a utility element in the result. This element corresponds to a network feature or object that contains additional information such as a terminal or fraction along value that affects the analysis. For example, the utility element's terminal may limit the number of connectivity associations or change the direction of a trace, while its fraction along value may return a partial geometry from a trace.

This utility element may be created from a feature or asset type with a global id. The feature may be a result of a query or identify operation on a layer or table that is part of the utility network.

Utility element from a feature

You may query for a specific feature using any of its fields or geometry or interactively identify a feature in a map view. When using identify, the feature may be found in the GeoElement list immediately under IdentifyLayerResult when part of a FeatureLayer or from sublayerResults when part of a SubtypeFeatureLayer.

Use dark colors for code blocksCopy
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
    final query = QueryParameters()
      ..whereClause = "GlobalId like '{D353C10C-E617-4618-BDD0-B48EDB822D07}'";
    final queryResult = await table.queryFeatures(query);

    if (queryResult.features().isEmpty) return;
    final feature = queryResult.features().first as ArcGISFeature;
Use dark colors for code blocksCopy
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
    final identifyLayerResults = await _mapViewController.identifyLayers(
      screenPoint: position,
      tolerance: 5,
      returnPopupsOnly: false,
    );

    ArcGISFeature? sublayerFeature;
    ArcGISFeature? feature;

    for (final layerResult in identifyLayerResults) {
      if (layerResult.layerContent is SubtypeFeatureLayer) {
        for (final subLayerResult in layerResult.sublayerResults) {
          for (final geoElement in subLayerResult.geoElements) {
            sublayerFeature = geoElement as ArcGISFeature;
          }
        }
      } else if (layerResult.layerContent is FeatureLayer) {
        for (final geoElement in layerResult.geoElements) {
          feature = geoElement as ArcGISFeature;
        }
      }
    }
Use dark colors for code blocksCopy
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
    await feature.load();
    final element = _utilityNetwork.createElement(arcGISFeature: feature);

Utility element from an asset type

An asset type can come from another utility element or be derived from a feature in the utility network, except from a subnet line table that does not have an asset type. You can use the feature's table name to get its network source. Use the network source and the feature's subtype to get its asset group. From the asset group, you can select an asset type by name or code.

Use dark colors for code blocksCopy
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
    var assetType = otherElement.assetType;
    var element = _utilityNetwork.createElementWithAssetType(
      assetType,
      globalId: globalId,
    );

    final tableName = feature.featureTable?.tableName;
    if (tableName == null) return;
    var networkSource = _utilityNetwork.definition?.getNetworkSource(tableName);

    final subtypeName = feature.getFeatureSubtype()?.name;
    if (subtypeName == null) return;
    var assetGroup = networkSource?.getAssetGroup(subtypeName);
    if (assetGroup == null) return;

    final assetTypeCode = feature.attributes['ASSETTYPE'] as int;
    assetType =
        assetGroup.assetTypes.firstWhere((t) => t.code == assetTypeCode);

    networkSource = _utilityNetwork.definition
        ?.getNetworkSource('Electric Distribution Device');
    assetGroup = networkSource?.getAssetGroup('Service Point');

    assetType =
        assetGroup?.getAssetType('Single Phase Low Voltage Meter') ?? assetType;
    element = _utilityNetwork.createElementWithAssetType(
      assetType,
      globalId: globalId,
    );

Utility element properties

A terminal is required when a UtilityElement that supports more than one terminal is used in a trace and optional when used to get associations. Terminals impact traces and connectivity associations.

Use dark colors for code blocksCopy
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
    if (element.assetType.terminalConfiguration!.terminals.isNotEmpty) {
      element.terminal =
          element.assetType.terminalConfiguration!.terminals.first;
    }

If the feature represents a line, you can optionally specify a location along the line to use as a trace location. This value is a percentage of the length of the line, beginning from the line's 'from' point.

Use UtilityElement.fractionAlongEdge to define the location of the point along the line.

The following example uses the GeometryEngine to get the fraction of a tap location along the line.

Use dark colors for code blocksCopy
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
    if (element.networkSource?.sourceType == UtilityNetworkSourceType.edge &&
        feature.geometry is Polyline) {
      var line = feature.geometry as Polyline;
      if (line.hasZ) {
        final line2 = GeometryEngine.removeZ(line) as Polyline?;
        if (line2 != null) line = line2;
      }
      if (mapPoint.spatialReference != null &&
          line.spatialReference != mapPoint.spatialReference) {
        final projectedLine = GeometryEngine.project(
          line,
          outputSpatialReference: mapPoint.spatialReference!,
        ) as Polyline?;
        if (projectedLine != null) line = projectedLine;
      }
      final percentAlong = GeometryEngine.fractionAlong(
        line: line,
        point: mapPoint,
        tolerance: double.nan,
      );
      if (!percentAlong.isNaN) {
        element.fractionAlongEdge = percentAlong;
      }
    }

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