An array of analysis
This utility element may be created from a feature or asset type
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 viewGeoElement list immediately under IdentifyLayerResult when part of a FeatureLayer or from sublayerResults when part of a SubtypeFeatureLayer.
let queryParameters = QueryParameters()
queryParameters.whereClause = "GlobalId like '{D353C10C-E617-4618-BDD0-B48EDB822D07}'"
let queryResult = try await table.queryFeatures(using: queryParameters)
let feature = queryResult.features().first
let identifyLayerResult = try await mapViewProxy.identify(on: layer, screenPoint: screenPoint, tolerance: 5)
// Identifies the first feature of the feature layer.
guard let firstFeature = identifyLayerResult.geoElements.first else { return }
let firstFeatureLayerFeature = firstFeature as? ArcGISFeature
// Identifies the first feature from the sublayers' result.
guard let firstSublayerResult = identifyLayerResult.sublayerResults.first else { return }
let firstSublayerFeature = firstSublayerResult.geoElements.first as? ArcGISFeature
try await firstSublayerFeature?.load()
guard let feature = firstSublayerFeature else { return }
let element = utilityNetwork.makeElement(arcGISFeature: feature)
Utility element from an asset type
An asset type
// Gets the asset type from an element.
let assetType = otherElement.assetType
// Makes a new utility element from the asset type and global ID.
let element = utilityNetwork.makeElement(assetType: assetType, globalID: globalID)
// Gets the network source with the specified name.
guard let tableName = feature.table?.tableName else { return }
var networkSource = utilityNetwork.definition?.networkSource(named: tableName)
// Gets the asset group with the subtype name.
guard let subtypeName = feature.subtype?.name else { return }
var assetGroup = networkSource?.assetGroup(named: subtypeName)
// Gets an asset type from a feature's asset type code.
let assetTypeCode = feature.attributes["ASSETTYPE"] as? Int
guard let featureAssetType = assetGroup?.assetTypes.first(where: { $0.code == assetTypeCode }) else { return }
// Makes a new utility element with the feature's asset type.
let element1 = utilityNetwork.makeElement(assetType: featureAssetType, globalID: globalID)
// Gets the asset type by name.
networkSource = utilityNetwork.definition?.networkSource(named: "Electric Distribution Device")
assetGroup = networkSource?.assetGroup(named: "Service Point")
guard let lowVoltageAssetType = assetGroup?.assetType(named: "Single Phase Low Voltage Meter") else { return }
// Makes a new utility element with the low voltage asset type.
let element2 = utilityNetwork.makeElement(assetType: lowVoltageAssetType, globalID: globalID)
Utility element properties
A terminal is required when a UtilityElement that supports more than one terminal
if let terminalsCount = element.assetType.terminalConfiguration?.terminals.count,
terminalsCount > 1 {
element.terminal = element.assetType.terminalConfiguration?.terminals.first
}
If the feature
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.
if element.networkSource.kind == UtilityNetworkSource.Kind.edge {
var line = feature.geometry as? Polyline
if let polyline = line,
polyline.hasZ {
// If the polyline has a Z value, remove it.
let line2 = GeometryEngine.makeGeometry(from: polyline, z: nil)
line = line2
}
if mapPoint.spatialReference != nil,
let polyline = line,
polyline.spatialReference != mapPoint.spatialReference,
let projectedLine = GeometryEngine.project(polyline, into: mapPoint.spatialReference!) {
// Projects the line to the map point's spatial reference, if not already equivalent.
line = projectedLine
}
guard let polyline = line else { return }
// Calculates and sets the fraction of a tap location along the line.
let percentAlong = GeometryEngine.polyline(polyline, fractionalLengthClosestTo: mapPoint, tolerance: .nan)
if !percentAlong.isNaN {
element.fractionAlongEdge = percentAlong
}
}