Compare commits

...

4 Commits

Author SHA1 Message Date
c2cadd678c Now working with tags 2023-04-01 01:32:31 +02:00
15628d3544 Loading Tags 2023-04-01 01:32:25 +02:00
452c5d3177 Removed TagType.EMPTY 2023-04-01 01:32:15 +02:00
9dc282253d Removed TagType.EMPTY (now returns null instead)
AddTag(ulong, KeyValuePair) is now only Wrapper of AddTag(ulong, Tag)
AddTag now checks if tags already exist
2023-04-01 01:31:58 +02:00
5 changed files with 61 additions and 23 deletions

View File

@ -32,7 +32,7 @@ public class Tag
return new Tag(type, value); return new Tag(type, value);
} }
public static Tag ConvertToTag(string key, string value) public static Tag? ConvertToTag(string key, string value)
{ {
switch (key) switch (key)
{ {
@ -73,12 +73,18 @@ public class Tag
break; break;
} }
return new Tag(Tag.TagType.EMPTY, false);
return null;
}
public override string ToString()
{
return $"TAG {key.ToString()} {value.ToString()}";
} }
public enum TagType : byte public enum TagType : byte
{ {
highway, oneway, footway, sidewalk, cycleway, busway, forward, maxspeed, name, surface, lanes, access, tracktype, id, EMPTY highway, oneway, footway, sidewalk, cycleway, busway, forward, maxspeed, name, surface, lanes, access, tracktype, id
} }
public static readonly Dictionary<WayType, byte> defaultSpeedCar = new() { public static readonly Dictionary<WayType, byte> defaultSpeedCar = new() {

View File

@ -5,48 +5,48 @@ namespace OSMDatastructure.Graph;
[Serializable] [Serializable]
public class TagManager public class TagManager
{ {
public readonly Dictionary<ulong, HashSet<Tag>> wayTags = new(); public readonly Dictionary<ulong, HashSet<Tag>> wayTagSets = new();
public bool ContainsKey(ulong wayId, Tag.TagType key) public bool ContainsKey(ulong wayId, Tag.TagType key)
{ {
return wayTags.ContainsKey(wayId) && wayTags[wayId].Any(tag => tag.key == key); return wayTagSets.ContainsKey(wayId) && wayTagSets[wayId].Any(tag => tag.key == key);
} }
public object? GetTag(ulong wayId, Tag.TagType key) public object? GetTag(ulong wayId, Tag.TagType key)
{ {
return ContainsKey(wayId, key) ? wayTags[wayId].First(tag => tag.key == key) : null; return ContainsKey(wayId, key) ? wayTagSets[wayId].First(tag => tag.key == key) : null;
} }
public void AddTag(ulong wayId, string key, string value) public void AddTag(ulong wayId, string key, string value)
{ {
Tag tag = Tag.ConvertToTag(key, value); Tag? tag = Tag.ConvertToTag(key, value);
AddTag(wayId, tag); if(tag is not null)
AddTag(wayId, tag);
} }
public void AddTag(ulong wayId, Tag tag) public void AddTag(ulong wayId, Tag tag)
{ {
if (tag.key != Tag.TagType.EMPTY) if(!wayTagSets.ContainsKey(wayId))
wayTagSets.Add(wayId, new HashSet<Tag>());
HashSet<Tag> wayTags = wayTagSets[wayId];
if (!wayTags.Any(wayTag => wayTag.key == tag.key))
{ {
if(!wayTags.ContainsKey(wayId)) wayTags.Add(tag);
wayTags.Add(wayId, new HashSet<Tag>());
wayTags[wayId].Add(tag);
} }
} }
public void AddTag(ulong wayId, KeyValuePair<Tag.TagType, dynamic> keyValuePair) public void AddTag(ulong wayId, KeyValuePair<Tag.TagType, dynamic> tag)
{ {
if(!wayTags.ContainsKey(wayId)) AddTag(wayId, new Tag(tag.Key, tag.Value));
wayTags.Add(wayId, new HashSet<Tag>());
wayTags[wayId].Add(new Tag(keyValuePair.Key, keyValuePair.Value));
} }
public HashSet<Tag>? GetTagsForWayId(ulong wayId) public HashSet<Tag>? GetTagsForWayId(ulong wayId)
{ {
return wayTags.TryGetValue(wayId, out HashSet<Tag>? value) ? value : null; return wayTagSets.TryGetValue(wayId, out HashSet<Tag>? value) ? value : null;
} }
public bool ContainsWay(ulong wayId) public bool ContainsWay(ulong wayId)
{ {
return wayTags.ContainsKey(wayId); return wayTagSets.ContainsKey(wayId);
} }
} }

View File

@ -120,8 +120,9 @@ public class RegionConverter
currentTags.TryAdd(Tag.TagType.id, Convert.ToUInt64(wayReader.GetAttribute("id")!)); currentTags.TryAdd(Tag.TagType.id, Convert.ToUInt64(wayReader.GetAttribute("id")!));
if (wayReader.Name == "tag") if (wayReader.Name == "tag")
{ {
Tag wayTag = Tag.ConvertToTag(wayReader.GetAttribute("k")!, wayReader.GetAttribute("v")!); Tag? wayTag = Tag.ConvertToTag(wayReader.GetAttribute("k")!, wayReader.GetAttribute("v")!);
currentTags.TryAdd(wayTag.key, wayTag.value); if(wayTag is not null)
currentTags.TryAdd(wayTag.key, wayTag.value);
} }
else if (wayReader.Name == "nd") else if (wayReader.Name == "nd")
{ {
@ -193,8 +194,13 @@ public class RegionConverter
string tagsRegionPath = Path.Combine(outputPath, regionHash.ToString(), tagsFileName); string tagsRegionPath = Path.Combine(outputPath, regionHash.ToString(), tagsFileName);
regionTagsFileStreams.Add(regionHash, new FileStream(tagsRegionPath, FileMode.OpenOrCreate)); regionTagsFileStreams.Add(regionHash, new FileStream(tagsRegionPath, FileMode.OpenOrCreate));
} }
ulong id = currentTags[Tag.TagType.id];
TagManager tm = new TagManager();
foreach(KeyValuePair<Tag.TagType, dynamic> kv in currentTags)
tm.AddTag(id, kv);
#pragma warning disable SYSLIB0011 #pragma warning disable SYSLIB0011
bFormatter.Serialize(regionTagsFileStreams[regionHash], currentTags); bFormatter.Serialize(regionTagsFileStreams[regionHash], tm);
#pragma warning restore SYSLIB0011 #pragma warning restore SYSLIB0011
} }
} }

View File

@ -26,6 +26,18 @@ public class RegionLoader
return r.ways; return r.ways;
} }
public TagManager GetTags(ulong regionHash)
{
Region r = GetRegion(regionHash);
return r.tagManager;
}
public HashSet<Tag>? GetTagsForWay(ulong regionHash, ulong wayId)
{
Region r = GetRegion(regionHash);
return r.tagManager.GetTagsForWayId(wayId);
}
public Region GetRegion(ulong regionHash) public Region GetRegion(ulong regionHash)
{ {
if (regionIdsDict.ContainsKey(regionHash)) if (regionIdsDict.ContainsKey(regionHash))
@ -60,6 +72,17 @@ public class RegionLoader
newRegion.nodes.Add(deserializedNode); newRegion.nodes.Add(deserializedNode);
} }
} }
using (FileStream tagsFileStream = new FileStream(Path.Join(path, regionHash.ToString(), RegionConverter.tagsFileName), FileMode.Open))
{
while (tagsFileStream.Position < tagsFileStream.Length)
{
TagManager tm = (TagManager)bFormatter.Deserialize(tagsFileStream);
ulong id = (ulong)tm.wayTagSets.First()!.Value.First(tag => tag.key == Tag.TagType.id)!.value;
foreach(Tag tag in tm.wayTagSets.First()!.Value)
newRegion.tagManager.AddTag(id, tag);
}
}
#pragma warning restore SYSLIB0011 #pragma warning restore SYSLIB0011
regionIdsDict.Add(regionHash, newRegion); regionIdsDict.Add(regionHash, newRegion);

View File

@ -17,7 +17,10 @@ public class Server
Console.WriteLine("Loaded"); Console.WriteLine("Loaded");
RegionLoader rl = new RegionLoader("D:/map"); RegionLoader rl = new RegionLoader("D:/map");
Region r = rl.GetRegion(13870001898000); Region r = rl.GetRegion(13870001898000);
Console.WriteLine(r.nodes.First());
Console.WriteLine(r.ways.First());
Console.WriteLine(rl.GetTagsForWay(13870001898000, 5897420)!.Last());
Console.WriteLine("Region loaded");
/* /*
Coordinates start = new Coordinates(48.243351f, 11.640417f); Coordinates start = new Coordinates(48.243351f, 11.640417f);