Zum Hauptinhalt springen

Netzwerkverfolgung

Bitte beachten

Diese Dokumentation gilt nur für die neue Netzwerkverfolgung ab Version 24.2.40 und ist nicht abwärts kompatibel mit Versionen kleiner 24.2.40

Die Netzwerkverfolgung kann sich bis zum offizellen Release von 24.2. noch jederzeit ändern.

Warnung

Start, Stop und End Feature müssen Tabellen der Topologie sein. Views können nicht verwendet werden.

Beispiel mit Benutzung des Standard Netzwerkverfolgungsdialoges und einer vorhandenen Vorlage.


//Achtung: die aufrufende Funktion muss "async" sein!!
public async void Test()
{

var api = this.Project.Application.ShowNetworkTracingDialog(); //Standard Dialog öffnen

//Auswählen eines vorhandenen Tracing Templates
//Diese muss im AppBuilder konfiguriert und dem Projekt zugewiesen sein.
//Wenn exists = false dann wurde das Template nicht gefunden und der Vorgang muss abgebrochen werden.
bool exists = api.SelectTracingTemplate("MyTemplate");

await api.SelectStartFeatureInMap(); //Wichtig, await!!
await api.SelectEndFeatureInMap();//Wichtig, await!!

//Wenn das Feature nicht aus der Karte kommen soll kann das Feature auch direkt per Code zugewiesen werden
//Die Tabelle des Features muss dazu aber im Template vorhanden sein.
//Ist die nicht der Fall wird das Feature nicht gesetzt!!
//api.SelectEndFeature(f);


api.ClearStopFeatures();
await api.SelectStopFeaturesFromMap();//Wichtig, await!!

await api.StartTracing();//Wichtig, await!!

}

Beispiel mit Benutzung des Standard Netzwerkverfolgungsdialoges und einer dynmaisch erzeugten Vorlage.


//Achtung: die aufrufende Funktion muss "async" sein!!
public async void Test()
{

var api = this.Project.Application.ShowNetworkTracingDialog(); //Standard Dialog öffnen

Client.Networktracing.NetworkTracingTemplate template = new Networktracing.NetworkTracingTemplate();
template.Name = "Name"; //Anzeige Name
template.ConnectionName = "MY_DB";
template.TopologyName = "MY_TOPO";
template.FeatureClasses.Add("TABLE");

api.SelectTracingTemplate(template);

await api.SelectStartFeatureInMap();//Wichtig, await!!
await api.SelectEndFeatureInMap();//Wichtig, await!!


api.ClearStopFeatures();
await api.SelectStopFeaturesFromMap();//Wichtig, await!!

await api.StartTracing();//Wichtig, await!!


}

Beispiel ohne Nutzung den Standard Netzwerkverfolgungsdialoges


//Achtung: die aufrufende Funktion muss "async" sein!!
public async void Test()
{

DbSchemaDefinition schema = this.Project.Repository.GetDbSchema("MY_CONNECTION");

DbTopology topology = schema.Topologies["MY_TOPOLOGY"];

NetworkTracing tracing = new NetworkTracing(schema, topo);

tracing.UseCore = true; // false um das alte netzworktracing zu benutzten.

tracing.TracingDirection = NetworkFlow.Both;
tracing.TracingType = NetworkTracingType.ShortestPath;
//tracing.ExcludeStopFeaturesFromResult = true;
//tracing.ForceGraphRefresh = true;
//tracing.Weighted = false; //True = shortest distance, False = path with the least amount of nodes


tracing.StartFeature = startFeature;
tracing.EndFeature = stopFeature; //Nur bei ShortestPath

//Add Stop Features (Optional)
//tracing.StopFeatures.Add(yourFeature);

//Add Stop Conditions
//tracing.StopConditions.Add("TABLE_NAME", "OPEN=1");

//Tracing starten
var result = await tracing.StartTracing(); //Muss mit await aufgerufen werden


//Achtung: StartTracing liefert maximal 20.000 Features zurück.

//Es kann sein das das Tracing Ergebniss Millionen von Featuren zurück liefert.
//Dann werden Millionen von Featuren als Ergebniss auf den Client übertragen.
//Dies kann den Client lahm legen da die Datenmengen die vom Server auf den Client übertragen werden müssen
//dann sehr gross werden und ggf auch ihren Hauptspeicher aufblassen und die Uebertragung dauert ggf sehr lange.

//TotalCount = Anzahl der gefundenen Features auf dem Server
//FeatureCount = Anzahl der bis jetzt übertragenen Features.

//Wenn nicht alle Features übertragen wurden weil es mehr als 20.000 sind
if (tracingResult.TotalCount > tracingResult.FeatureCount)
{
//Anwender warnen und fragen ob er das wirklich alles laden will!!
if (XYesNoBox.ShowDialog("{0} Features gefunden.\n{1} Features geladen.\n\nDas laden aller Feature kann lange dauern, den Hauptspeicher verbrauchen und ggf ihren Computer lahm legen\n\nWollen Sie wirklich alle laden?".Format(tracingResult.TotalCount, tracingResult.FeatureCount)))
{
//lade den rest der Daten
await tracingResult.LoadAllResults();
}
}

if (result.Succeeded)
{
// result.FeatureGroups liefert das Ergebnis gruppiert nach Feature Tabellen
foreach (FeatureGroup group in result.FeatureGroups)
{

//Beispiel zum öffnen eine Dialoges und Filtern der Ergebniss Feature
project.Forms.ShowForm(group.Table.Connection, group.Table.Name, group.Filter);

//Oder die einzelnen Feature der Tabelle zurückgeben.
foreach (FeatureContainer featureContainer in group.GetFeatures())
{
//featureContainer.Feature //Das Attribut Feature oder Geometrie Feature
//featureContainer.GeometryFeature //Das Geometry Feature
//featureContainer.Geometry //Die Geometrie

//Wenn es nicht ein ein Utility oder Label Feature ist,
//dann ist .Feature und .GeometryFeature das gleiche.
//Bei Utility, Label featuren etc sind diese verschieden.
}
}

//Wahlweise kann man alle Ergebnis Feature un gruppiert zurueck liefern
foreach (FeatureContainer featureContainer in result.GetFeatures())
{
}


//Wenn die Faetureklasse bekannt ist kann auch die Gruppe geholt werden
FeatureGroup myGroup = result.FeatureGroups.GetFeatureGroup("MY_TABLE");

//Get the Geometry of the shortest Path (combines all Line Features to one Linestring)
Mum.Geo.Geometry.LineString line = result.GetShortestPathGeometry();
}
else
{
XMsgBox.ShowExceptionDialog(result.ExceptionMessage);
}
}

Die Verfolgung zeigt immer ein Progress Fenster mit einem Abruch Knopf an. Der Endanwender kann den Vorgang damit jederzeit abbrechen.

Mit tracing.ShowProgressWindow = false kann dies auch ausgeschalten werden was jedoch keine gute Idee ist.

result.Canceled liefert "true" wenn der Anwender den Abbruch Knopf gedrückt hat oder wenn nicht alle Ergebnisse übertragen wurden.

Ab Version 24.2.146 / 25.1.17

Bei Utility Modellen hat ein Feature eine separate Geometrie Tabelle. Dafür wurden nun folgende erweitere Funktion zur Verfügung gestellt.

  • result.Items
    liefert für jedes Ergebnis die Attribut und Geometrie FID und Tabelle zurück. Bei nicht Utility Modellen steht bei Attribut und Geometrie das gleiche.

  • result.GeometryFeatureGroups
    liefert alle Geometrien gruppiert nach Tabellen zurück

  • result.GetGeometryFeatures
    liefert alle Geometrie Feature zurück

  • result.FeatureGroups
    Diese bereits vorhandene Funktion liefert immer die Attribut Tabelle zurück. Handelt es sich um keine Utility Feature dann ist dies auch gleichzeitig die Geometrie Tabelle.

Es kommt die Meldung "Graph must contain the source vertex"

Die Meldung bedeutet das bei Start, Stop oder End Feature eine Feature von einer Tabelle angegeben wurde das nicht in der Topology konfiguriert wurde, also kein Teil der Topologie ist, und oder das Feature nicht in der Topologie Tabelle *_CONN vorkommt.

Features von Views können generell nicht verwendet werden.

Beispiel einer Topologie Konfiguration

Beispiel einer *_CONN Tabelle.

SQL> select * from BUS_NET_CONN ORDER BY FID

FID TABLE_NAME_FROM FID_FROM TABLE_NAME_TO FID_TO FLOW DATE_CREATED DATE_MODIFIED USER_CREATED USER_MODIFIED
------ --------------- -------- ----------------- ------ ---- -------------------- -------------------- ------------ -------------
222742 BUS_ROUTE_NODE 20561 BUS_ROUTE_SEGMENT 135 2 10/12/2024 4:04:52 PM 10/12/2024 4:04:52 PM
222743 BUS_ROUTE_NODE 20561 BUS_ROUTE_SEGMENT 136 1 10/12/2024 4:04:52 PM 10/12/2024 4:04:52 PM
222744 BUS_ROUTE_NODE 20564 BUS_ROUTE_SEGMENT 136 2 10/12/2024 4:04:52 PM 10/12/2024 4:04:52 PM
222745 BUS_ROUTE_NODE 20564 BUS_ROUTE_SEGMENT 137 1 10/12/2024 4:04:52 PM 10/12/2024 4:04:52 PM
222746 BUS_ROUTE_NODE 20565 BUS_ROUTE_SEGMENT 137 2 10/12/2024 4:04:52 PM 10/12/2024 4:04:52 PM
222747 BUS_ROUTE_NODE 20565 BUS_ROUTE_SEGMENT 138 1 10/12/2024 4:04:52 PM 10/12/2024 4:04:52 PM