using System.ComponentModel; using System.Runtime.Serialization; using System.Text.Json.Serialization; namespace OSMDatastructure.Graph; [Serializable] public class OsmNode { public ulong nodeId { get; } public HashSet edges { get; set; } public Coordinates coordinates { get; } [JsonIgnore][NonSerialized]public OsmNode? previousPathNode = null; [JsonInclude][NonSerialized]public double currentPathWeight = double.MaxValue; [JsonInclude][NonSerialized]public double currentPathLength = double.MaxValue; [JsonIgnore][NonSerialized]public double directDistanceToGoal = double.MaxValue; [OnDeserialized] internal void SetDefaultValues(StreamingContext context) { currentPathWeight = double.MaxValue; currentPathLength = double.MaxValue; directDistanceToGoal = double.MaxValue; } public OsmNode(ulong nodeId, float lat, float lon) { this.nodeId = nodeId; this.edges = new(); this.coordinates = new Coordinates(lat, lon); } [JsonConstructor] public OsmNode(ulong nodeId, Coordinates coordinates) { this.nodeId = nodeId; this.edges = new(); this.coordinates = coordinates; } public OsmEdge? GetEdgeToNode(OsmNode n) { HashSet e = edges.Where(edge => edge.neighborId == n.nodeId).ToHashSet(); if (e.Count > 0) return e.First(); else return null; } public override bool Equals(object? obj) { return obj != null && obj.GetType() == this.GetType() && ((OsmNode)obj).nodeId == this.nodeId; } public override string ToString() { if(previousPathNode is not null) return $"{nodeId} {coordinates} ec:{edges.Count} d:{directDistanceToGoal} w:{currentPathWeight} l:{currentPathLength} p:{previousPathNode.nodeId}"; return $"{nodeId} {coordinates} ec:{edges.Count} d:{directDistanceToGoal} w:{currentPathWeight} l:{currentPathLength} null"; } }