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:
parent
8c8aadc2e1
commit
3350d8e3b9
@ -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; }
|
||||||
|
|
||||||
@ -37,5 +37,15 @@ 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,14 +12,19 @@ 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user