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 } }