OSMServer/OSMDatastructure/Tag.cs

182 lines
5.8 KiB
C#
Raw Normal View History

using System.Text.Json;
using System.Text.Json.Serialization;
2023-04-09 17:06:45 +02:00
namespace OSMDatastructure;
2023-03-30 16:29:42 +02:00
[Serializable]
2023-03-30 16:29:42 +02:00
public class Tag
{
public TagType key { get; }
public dynamic value { get; }
[JsonConstructor]
2023-03-30 16:29:42 +02:00
public Tag(TagType key, dynamic value)
{
this.key = key;
if (value is JsonElement)
{
switch (key)
{
case TagType.highway:
this.value = (WayType)value.GetByte();
break;
case TagType.maxspeed:
this.value = value.GetByte();
break;
case TagType.forward:
case TagType.oneway:
this.value = value.GetBoolean();
break;
case TagType.id:
this.value = value.GetUInt64();
break;
case TagType.name:
case TagType.tagref:
this.value = value.GetString();
break;
default:
this.value = value;
break;
}
}
else
{
this.value = value;
}
2023-03-30 16:29:42 +02:00
}
2023-04-09 22:10:23 +02:00
public static HashSet<Tag> ConvertToTags(string key, string value)
2023-03-30 16:29:42 +02:00
{
2023-04-09 22:10:23 +02:00
HashSet<Tag> ret = new HashSet<Tag>();
2023-03-30 16:29:42 +02:00
switch (key)
{
case "highway":
try
{
2023-04-09 22:10:23 +02:00
ret.Add(new Tag(TagType.highway, (WayType)Enum.Parse(typeof(WayType), value, true)));
2023-03-30 16:29:42 +02:00
}
catch (ArgumentException)
{
2023-04-09 22:10:23 +02:00
ret.Add(new Tag(TagType.highway, WayType.unclassified));
2023-03-30 16:29:42 +02:00
}
2023-04-09 22:10:23 +02:00
break;
2023-03-30 16:29:42 +02:00
case "maxspeed":
2023-04-24 18:53:02 +02:00
case "maxspeed:max":
2023-03-30 16:29:42 +02:00
try
{
byte speed = Convert.ToByte(value);
2023-04-09 22:10:23 +02:00
if (speed != 255)
ret.Add(new Tag(TagType.maxspeed, speed));
2023-03-30 16:29:42 +02:00
}
catch (Exception)
{
2023-04-09 22:10:23 +02:00
ret.Add(new Tag(TagType.maxspeed, byte.MinValue));
2023-03-30 16:29:42 +02:00
}
2023-04-09 22:10:23 +02:00
break;
2023-03-30 16:29:42 +02:00
case "oneway":
switch (value)
{
case "yes":
2023-04-09 22:10:23 +02:00
ret.Add(new Tag(TagType.oneway, true));
break;
2023-03-30 16:29:42 +02:00
case "-1":
2023-04-09 22:10:23 +02:00
ret.Add(new Tag(TagType.forward, false));
ret.Add(new Tag(TagType.oneway, true));
break;
2023-03-30 16:29:42 +02:00
case "no":
2023-04-09 22:10:23 +02:00
ret.Add(new Tag(TagType.oneway, false));
break;
2023-03-30 16:29:42 +02:00
}
2023-04-09 23:55:24 +02:00
break;
2023-04-09 22:10:23 +02:00
case "name":
ret.Add(new Tag(TagType.name, value));
break;
case "ref":
ret.Add(new Tag(TagType.tagref, value));
2023-03-30 16:29:42 +02:00
break;
}
2023-04-09 22:10:23 +02:00
return ret;
2023-03-30 16:29:42 +02:00
}
public override string ToString()
{
return $"TAG {key.ToString()} {value.ToString()}";
}
2023-03-30 16:29:42 +02:00
public enum TagType : byte
{
2023-04-09 22:10:23 +02:00
highway, oneway, footway, sidewalk, cycleway, busway, forward, maxspeed, name, surface, lanes, access, tracktype, id, tagref
2023-03-30 16:29:42 +02:00
}
public static readonly Dictionary<WayType, byte> defaultSpeedCar = new() {
2023-04-09 17:37:52 +02:00
{ WayType.NONE, 0 },
2023-04-24 18:53:02 +02:00
{ WayType.motorway, 130 },
{ WayType.motorroad, 100 },
2023-04-09 19:22:34 +02:00
{ WayType.trunk, 85 },
2023-04-09 20:40:53 +02:00
{ WayType.primary, 65 },
{ WayType.secondary, 60 },
{ WayType.tertiary, 50 },
2023-04-09 22:10:23 +02:00
{ WayType.unclassified, 30 },
{ WayType.residential, 20 },
2023-04-09 19:22:34 +02:00
{ WayType.motorway_link, 60 },
2023-03-30 16:29:42 +02:00
{ WayType.trunk_link, 50 },
2023-04-09 19:22:34 +02:00
{ WayType.primary_link, 50 },
{ WayType.secondary_link, 50 },
2023-04-09 20:40:53 +02:00
{ WayType.tertiary_link, 30 },
{ WayType.living_street, 10 },
{ WayType.service, 0 },
2023-03-30 16:29:42 +02:00
{ WayType.pedestrian, 0 },
{ WayType.track, 0 },
2023-03-30 16:29:42 +02:00
{ WayType.bus_guideway, 0 },
{ WayType.escape, 0 },
{ WayType.raceway, 0 },
{ WayType.road, 20 },
2023-03-30 16:29:42 +02:00
{ WayType.busway, 0 },
{ WayType.footway, 0 },
{ WayType.bridleway, 0 },
{ WayType.steps, 0 },
{ WayType.corridor, 0 },
{ WayType.path, 0 },
{ WayType.cycleway, 0 },
{ WayType.construction, 0 }
};
public static readonly Dictionary<WayType, byte> defaultSpeedPedestrian = new() {
2023-04-09 17:37:52 +02:00
{ WayType.NONE, 0 },
2023-03-30 16:29:42 +02:00
{ WayType.motorway, 0 },
{ WayType.trunk, 0 },
{ WayType.primary, 0 },
{ WayType.secondary, 0 },
{ WayType.tertiary, 2 },
2023-03-30 16:29:42 +02:00
{ WayType.unclassified, 1 },
{ WayType.residential, 4 },
2023-03-30 16:29:42 +02:00
{ WayType.motorway_link, 0 },
{ WayType.trunk_link, 0 },
{ WayType.primary_link, 0 },
{ WayType.secondary_link, 0 },
{ WayType.tertiary_link, 0 },
{ WayType.living_street, 5 },
{ WayType.service, 2 },
{ WayType.pedestrian, 5 },
{ WayType.track, 1 },
2023-03-30 16:29:42 +02:00
{ WayType.bus_guideway, 0 },
{ WayType.escape, 1 },
2023-03-30 16:29:42 +02:00
{ WayType.raceway, 0 },
{ WayType.road, 2 },
2023-03-30 16:29:42 +02:00
{ WayType.busway, 0 },
{ WayType.footway, 4 },
{ WayType.bridleway, 1 },
{ WayType.steps, 2 },
{ WayType.corridor, 3 },
{ WayType.path, 4 },
{ WayType.cycleway, 1 },
2023-03-30 16:29:42 +02:00
{ WayType.construction, 0 }
};
// ReSharper disable InconsistentNaming
2023-04-09 19:22:34 +02:00
public enum WayType : byte { NONE, motorway, motorroad, trunk, primary, secondary, tertiary, unclassified, residential, motorway_link, trunk_link, primary_link, secondary_link, tertiary_link, living_street, service, pedestrian, track, bus_guideway, escape, raceway, road, busway, footway, bridleway, steps, corridor, path, cycleway, construction }
// ReSharper restore InconsistentNaming
2023-03-30 16:29:42 +02:00
public enum SpeedType { pedestrian, car, any }
2023-03-30 16:29:42 +02:00
}