Added GetNode(Coordinates coordinates)

Added GetNode(ulong id)
Instead of returning null in LoadRegion now throw an exception when file is not found.
Added some Method descriptors
This commit is contained in:
C9Glax 2023-02-05 20:02:22 +01:00
parent 8c8aadc2e1
commit 3350d8e3b9
2 changed files with 53 additions and 10 deletions

View File

@ -2,7 +2,7 @@ namespace OSMDatastructure
{ {
public class Region public class Region
{ {
public const float regionSize = 0.01f; public const float regionSize = 0.01f; //For Splitting
private readonly Dictionary<ulong, Node> _nodesInRegion = new(); private readonly Dictionary<ulong, Node> _nodesInRegion = new();
public ulong regionHash { get; } public ulong regionHash { get; }
@ -36,6 +36,16 @@ namespace OSMDatastructure
{ {
return this._nodesInRegion.ContainsKey(id) ? this._nodesInRegion[id] : null; return this._nodesInRegion.ContainsKey(id) ? this._nodesInRegion[id] : null;
} }
public Node? GetNode(Coordinates coordinates)
{
foreach (Node node in this._nodesInRegion.Values)
{
if (node.Equals(coordinates))
return node;
}
return null;
}
} }
} }

View File

@ -11,16 +11,21 @@ namespace OSMImporter
{ {
this.workingDirectory = workingDirectory; this.workingDirectory = workingDirectory;
} }
public Region? GetRegion(Coordinates coordinates) /// <summary>
/// Checks wether the Region is already loaded and returns the Region, or tries to load the Region from file in workingDirectory
/// </summary>
/// <param name="coordinates">Coordinates of the Region (or within the Region) to load</param>
/// <returns>The Region at the specified Coordinates containing Nodes and Connections</returns>
/// <exception cref="FileNotFoundException">If the Regionfile can not be found.</exception>
public Region GetRegion(Coordinates coordinates)
{ {
if(this._regions.ContainsKey(coordinates.GetRegionHash())) if(this._regions.ContainsKey(coordinates.GetRegionHash()))
return this._regions[coordinates.GetRegionHash()]; return this._regions[coordinates.GetRegionHash()];
else else
{ {
Region? loadedRegion = LoadRegion(coordinates); Region loadedRegion = LoadRegion(coordinates);
if(loadedRegion != null) this._regions.Add(loadedRegion.regionHash, value: loadedRegion);
this._regions.Add(loadedRegion.regionHash, value: loadedRegion);
return loadedRegion; return loadedRegion;
} }
} }
@ -30,20 +35,48 @@ namespace OSMImporter
return this._regions.Values.ToArray(); return this._regions.Values.ToArray();
} }
private Region? LoadRegion(Coordinates coordinates) /// <summary>
///
/// </summary>
/// <param name="coordinates">Coordinates of the Region (or within the Region) to load</param>
/// <returns>The Region at the specified Coordinates containing Nodes and Connections</returns>
/// <exception cref="FileNotFoundException">If the Regionfile can not be found.</exception>
private Region LoadRegion(Coordinates coordinates)
{ {
string fullPath = Path.Combine(workingDirectory, coordinates.GetRegionHash().ToString()); string fullPath = Path.Combine(workingDirectory, coordinates.GetRegionHash().ToString());
Console.WriteLine(fullPath); Console.WriteLine(fullPath);
if (!File.Exists(fullPath)) if (!File.Exists(fullPath))
return null; {
throw new FileNotFoundException(string.Format("Region does not exist: {0}", fullPath));
}
FileStream fileStream = new FileStream(fullPath, FileMode.Open); FileStream fileStream = new FileStream(fullPath, FileMode.Open);
byte[] regionBytes = new byte[fileStream.Length]; byte[] regionBytes = new byte[fileStream.Length];
fileStream.Read(regionBytes, 0, regionBytes.Length); int _ = fileStream.Read(regionBytes, 0, regionBytes.Length);
fileStream.Close(); fileStream.Close();
return ByteConverter.ToRegion(regionBytes); return ByteConverter.ToRegion(regionBytes);
} }
public Node? GetNode(ulong id)
{
foreach (Region region in this._regions.Values)
{
Node? node = region.GetNode(id);
if (node != null)
return node;
}
return null;
}
public Node? GetNode(Coordinates coordinates)
{
Region? regionWithNode = GetRegion(coordinates);
if (regionWithNode == null)
return null;//TODO null handling
return regionWithNode.GetNode(coordinates);
}
} }
} }