Associations.png file) or a document, that is associated with individual features in a geodatabase or feature layer.
| Association | Description | Geometry supported |
|---|---|---|
| Connectivity | Models the connectivity between two junctions that don't have geometric coincidence (are not in the same x, y and z location). A transformer may be connected to a fuse, for example. | Yes |
| Structural attachment | Models equipment attached to structures. A transformer bank may be attached to a pole, for example. | Yes |
| Containment | Models assets that contain other assets. A vault may contain valves and pipes, for example. | No |
// Get the QList of utility association objects from the utility network via
// the associations async method (uses QFuture).
utilityNetwork->associationsAsync(utilityElement, UtilityAssociationType::Containment).then
(this, [] (const QList<UtilityAssociation*>& associations)
{
// Test if we have some utility associations.
if (associations.isEmpty())
return;
// Loop thru the utility associations.
for (UtilityAssociation* association : associations)
{
// Get the first ("from") and second ("to") elements in the association.
UtilityElement* fromElement = association->fromElement();
UtilityElement* toElement = association->toElement();
// Provide some feedback.
qDebug() << fromElement->assetType()->name() << " " << toElement->assetType()->name();
}
});
You can also provide an envelope to find all valid associations within the specified extent.
The following example creates a new graphics overlay to display all associations within the map extent using a unique symbol
// Create symbols for the structural attachment and connectivity associations.
SimpleLineSymbol* attachmentSymbol = new SimpleLineSymbol
(
SimpleLineSymbolStyle::Dot, // style
QColor("green"), // color
5, // width
this // parent
);
SimpleLineSymbol* connectivitySymbol = new SimpleLineSymbol
(
SimpleLineSymbolStyle::Dot, // style
QColor("red"), // color
5, // width
this // parent
);
// Create a unique value renderer for the attachment value associations.
UniqueValue* attachmentValue = new UniqueValue
(
"Attachment", // label
"", // description
QVariantList{static_cast<int>(UtilityAssociationType::Attachment)}, // values
attachmentSymbol, // symbol
this // parent
);
// Create a unique value renderer for the connectivity value associations.
UniqueValue* connectivityValue = new UniqueValue
(
"Connectivity", // label
"", // description
QVariantList{static_cast<int>(UtilityAssociationType::Connectivity)}, // values
connectivitySymbol, // symbol
this // parent
);
// Create a unique value renderer for the associations.
UniqueValueRenderer* uniqueValueRenderer = new UniqueValueRenderer
(
"", // default label
nullptr, // default symbol
QStringList{"AssociationType"}, // field names
QList<UniqueValue*>{attachmentValue, connectivityValue}, // unique values
this // parent
);
// Create a graphics overlay for the associations.
GraphicsOverlay* associationsOverlay = new GraphicsOverlay(this);
// Get the graphics overlay list model from the map view.
GraphicsOverlayListModel* graphicsOverlayListModel = m_mapView->graphicsOverlays();
// Append the graphics overlay to the graphics overlay list model.
graphicsOverlayListModel->append(associationsOverlay);
// Set the unique value renderer for the graphics overlay.
associationsOverlay->setRenderer(uniqueValueRenderer);
// Get the current viewpoint from the map view.
const Viewpoint viewpoint = m_mapView->currentViewpoint(ViewpointType::BoundingGeometry);
// Get the geometry fomr the viewpoint.
const Geometry geometry = viewpoint.targetGeometry();
// Get the envelope from the view point's geometry.
const Envelope envelope = geometry.extent();
// Get the QList of utility association objects from the utility network via
// the associations async method (uses QFuture).
utilityNetwork->associationsAsync(envelope).then(this, [this, associationsOverlay]
(const QList<UtilityAssociation*>& associations)
{
// Loop thru the utility associations.
for (UtilityAssociation* association : associations)
{
// Test the association type and make sure it's not a containment relationship.
if (association->associationType() != UtilityAssociationType::Containment)
{
// Create a new graphic using the geometry from the association.
Graphic* graphic = new Graphic(association->geometry(), this);
// Get the attribute list model from the graphic.
AttributeListModel* attributeListModel = graphic->attributes();
// Add an attribute to the graphic.
attributeListModel->insertAttribute
(
"GlobalId", // attribute name - QString
association->globalId() // attribute value - QVariant
);
// Add another attribute to the graphic.
attributeListModel->insertAttribute
(
"AssociationType", // attribute name - QString
(int)association->associationType() // attribute value - QVariant
);
// Add a graphic for the association.
associationsOverlay->graphics()->append(graphic);
}
}
});
Specifying a utility element
Specifying an extent will return all its connectivity or structural attachment associations with geometry. The geometry value (polyline) represents the connection relationship between a from element and a to element. You can use the geometry to visualize the association as a graphic

