2023-02-03 23:35:22 +01:00
using OSMDatastructure ;
2023-03-14 17:00:59 +01:00
using OSMDatastructure.Graph ;
2023-02-03 23:35:22 +01:00
namespace OSMImporter
{
public class RegionManager
{
private string workingDirectory { get ; }
2023-03-14 17:00:59 +01:00
private readonly Dictionary < int , Region > _regions = new ( ) ;
2023-02-03 23:35:22 +01:00
public RegionManager ( string workingDirectory )
{
this . workingDirectory = workingDirectory ;
}
2023-02-05 20:02:22 +01:00
/// <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 )
2023-02-03 23:35:22 +01:00
{
2023-03-14 17:00:59 +01:00
if ( _regions . ContainsKey ( Coordinates . GetRegionHashCode ( coordinates ) ) )
return _regions [ Coordinates . GetRegionHashCode ( coordinates ) ] ;
2023-02-03 23:35:22 +01:00
else
{
2023-02-05 20:02:22 +01:00
Region loadedRegion = LoadRegion ( coordinates ) ;
2023-03-14 17:00:59 +01:00
_regions . Add ( loadedRegion . regionHash , value : loadedRegion ) ;
2023-02-03 23:35:22 +01:00
return loadedRegion ;
}
}
public Region [ ] GetAllRegions ( )
{
return this . _regions . Values . ToArray ( ) ;
}
2023-02-05 20:02:22 +01:00
/// <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 )
2023-02-03 23:35:22 +01:00
{
2023-03-14 17:00:59 +01:00
string fullPath = Path . Combine ( workingDirectory , Coordinates . GetRegionHashCode ( coordinates ) . ToString ( ) ) ;
2023-02-08 19:05:29 +01:00
DateTime startTime = DateTime . Now ;
2023-02-03 23:35:22 +01:00
if ( ! File . Exists ( fullPath ) )
2023-02-05 20:02:22 +01:00
{
2023-02-08 19:05:29 +01:00
throw new FileNotFoundException ( string . Format ( "[{0}] Region does not exist: {1}" , startTime , fullPath ) ) ;
2023-02-05 20:02:22 +01:00
}
2023-02-03 23:35:22 +01:00
FileStream fileStream = new FileStream ( fullPath , FileMode . Open ) ;
2023-02-08 19:05:29 +01:00
long fileStreamLength = fileStream . Length ;
Console . WriteLine ( "[{0}] Loading [{1}]bytes from {2}" , startTime . ToLocalTime ( ) , fileStreamLength , fullPath ) ;
2023-02-03 23:35:22 +01:00
byte [ ] regionBytes = new byte [ fileStream . Length ] ;
2023-02-08 19:05:29 +01:00
int loadedBytesLength = fileStream . Read ( regionBytes , 0 , regionBytes . Length ) ;
2023-02-03 23:35:22 +01:00
fileStream . Close ( ) ;
2023-02-08 19:05:29 +01:00
Console . WriteLine ( "\tLoaded [{0}]bytes ({1:P1}) in [{2}]ms" , loadedBytesLength , fileStreamLength / loadedBytesLength , DateTime . Now . Subtract ( startTime ) . TotalMilliseconds ) ;
2023-02-03 23:35:22 +01:00
return ByteConverter . ToRegion ( regionBytes ) ;
}
2023-02-05 20:02:22 +01:00
2023-02-06 17:32:55 +01:00
public OsmNode ? GetNode ( Coordinates coordinates )
2023-02-05 20:02:22 +01:00
{
2023-02-06 17:32:55 +01:00
Region regionWithNode = GetRegion ( coordinates ) ;
2023-03-14 17:00:59 +01:00
return regionWithNode . GetNodeWithCoordinates ( coordinates ) ;
2023-02-05 20:02:22 +01:00
}
2023-02-03 23:35:22 +01:00
}
}