public void TestOrientationFrcFoW() { var data = new byte[1]; data[0] = 127; // orientation-frc-fow. OrientationConverter.Encode(Orientation.FirstToSecond, data, 0, 0); FunctionalRoadClassConvertor.Encode(FunctionalRoadClass.Frc3, data, 0, 2); FormOfWayConvertor.Encode(FormOfWay.Roundabout, data, 0, 5); Assert.AreEqual(92, data[0]); // frc-orientation-fow. data[0] = 127; FunctionalRoadClassConvertor.Encode(FunctionalRoadClass.Frc3, data, 0, 2); OrientationConverter.Encode(Orientation.FirstToSecond, data, 0, 0); FormOfWayConvertor.Encode(FormOfWay.Roundabout, data, 0, 5); Assert.AreEqual(92, data[0]); // frc-fow-orientation. data[0] = 127; FunctionalRoadClassConvertor.Encode(FunctionalRoadClass.Frc3, data, 0, 2); FormOfWayConvertor.Encode(FormOfWay.Roundabout, data, 0, 5); OrientationConverter.Encode(Orientation.FirstToSecond, data, 0, 0); Assert.AreEqual(92, data[0]); }
public void TestSideOfRoadFrcFow() { var data = new byte[1]; data[0] = 0; // sideofroad-frc-fow. SideOfRoadConverter.Encode(SideOfRoad.Left, data, 0, 0); FunctionalRoadClassConvertor.Encode(FunctionalRoadClass.Frc3, data, 0, 2); FormOfWayConvertor.Encode(FormOfWay.Roundabout, data, 0, 5); Assert.AreEqual(156, data[0]); // frc-sideofroad-fow. data[0] = 0; FunctionalRoadClassConvertor.Encode(FunctionalRoadClass.Frc3, data, 0, 2); SideOfRoadConverter.Encode(SideOfRoad.Left, data, 0, 0); FormOfWayConvertor.Encode(FormOfWay.Roundabout, data, 0, 5); Assert.AreEqual(156, data[0]); // frc-fow-sideofroad. data[0] = 0; FunctionalRoadClassConvertor.Encode(FunctionalRoadClass.Frc3, data, 0, 2); FormOfWayConvertor.Encode(FormOfWay.Roundabout, data, 0, 5); SideOfRoadConverter.Encode(SideOfRoad.Left, data, 0, 0); Assert.AreEqual(156, data[0]); }
public void TestEncoding1() { var data = new byte[1]; Assert.Catch <ArgumentOutOfRangeException>(() => { FormOfWayConvertor.Encode(FormOfWay.Undefined, data, 0, 10); }); FormOfWayConvertor.Encode(FormOfWay.Undefined, data, 0, 5); Assert.AreEqual(0, data[0]); FormOfWayConvertor.Encode(FormOfWay.Motorway, data, 0, 5); Assert.AreEqual(1, data[0]); FormOfWayConvertor.Encode(FormOfWay.MultipleCarriageWay, data, 0, 5); Assert.AreEqual(2, data[0]); FormOfWayConvertor.Encode(FormOfWay.SingleCarriageWay, data, 0, 5); Assert.AreEqual(3, data[0]); FormOfWayConvertor.Encode(FormOfWay.Roundabout, data, 0, 5); Assert.AreEqual(4, data[0]); FormOfWayConvertor.Encode(FormOfWay.TrafficSquare, data, 0, 5); Assert.AreEqual(5, data[0]); FormOfWayConvertor.Encode(FormOfWay.SlipRoad, data, 0, 5); Assert.AreEqual(6, data[0]); FormOfWayConvertor.Encode(FormOfWay.Other, data, 0, 5); Assert.AreEqual(7, data[0]); }
public void TestDecoding1() { Assert.Catch <ArgumentOutOfRangeException>(() => { FormOfWayConvertor.Decode(new byte[] { 0 }, 6); }); Assert.AreEqual(FormOfWay.Undefined, FormOfWayConvertor.Decode(new byte[] { 0 }, 0, 0)); Assert.AreEqual(FormOfWay.Undefined, FormOfWayConvertor.Decode(new byte[] { 0 }, 5)); Assert.AreEqual(FormOfWay.Motorway, FormOfWayConvertor.Decode(new byte[] { 1 }, 5)); Assert.AreEqual(FormOfWay.MultipleCarriageWay, FormOfWayConvertor.Decode(new byte[] { 2 }, 5)); Assert.AreEqual(FormOfWay.SingleCarriageWay, FormOfWayConvertor.Decode(new byte[] { 3 }, 5)); Assert.AreEqual(FormOfWay.Roundabout, FormOfWayConvertor.Decode(new byte[] { 4 }, 5)); Assert.AreEqual(FormOfWay.TrafficSquare, FormOfWayConvertor.Decode(new byte[] { 5 }, 5)); Assert.AreEqual(FormOfWay.SlipRoad, FormOfWayConvertor.Decode(new byte[] { 6 }, 5)); Assert.AreEqual(FormOfWay.Other, FormOfWayConvertor.Decode(new byte[] { 7 }, 5)); Assert.AreEqual(FormOfWay.Undefined, FormOfWayConvertor.Decode(new byte[] { 0 }, 4)); Assert.AreEqual(FormOfWay.Motorway, FormOfWayConvertor.Decode(new byte[] { 2 }, 4)); Assert.AreEqual(FormOfWay.MultipleCarriageWay, FormOfWayConvertor.Decode(new byte[] { 4 }, 4)); Assert.AreEqual(FormOfWay.SingleCarriageWay, FormOfWayConvertor.Decode(new byte[] { 6 }, 4)); Assert.AreEqual(FormOfWay.Roundabout, FormOfWayConvertor.Decode(new byte[] { 8 }, 4)); Assert.AreEqual(FormOfWay.TrafficSquare, FormOfWayConvertor.Decode(new byte[] { 10 }, 4)); Assert.AreEqual(FormOfWay.SlipRoad, FormOfWayConvertor.Decode(new byte[] { 12 }, 4)); Assert.AreEqual(FormOfWay.Other, FormOfWayConvertor.Decode(new byte[] { 14 }, 4)); }
/// <summary> /// Encodes a point along line location. /// </summary> public static byte[] Encode(PointAlongLineLocation location) { var data = new byte[17]; var header = new Header(); header.Version = 3; header.HasAttributes = true; header.ArF0 = false; header.IsPoint = true; header.ArF1 = false; HeaderConvertor.Encode(data, 0, header); CoordinateConverter.Encode(location.First.Coordinate, data, 1); FunctionalRoadClassConvertor.Encode(location.First.FuntionalRoadClass.Value, data, 7, 2); FormOfWayConvertor.Encode(location.First.FormOfWay.Value, data, 7, 5); FunctionalRoadClassConvertor.Encode(location.First.LowestFunctionalRoadClassToNext.Value, data, 8, 0); BearingConvertor.Encode(BearingConvertor.EncodeAngleToBearing(location.First.Bearing.Value), data, 8, 3); data[9] = DistanceToNextConvertor.Encode(location.First.DistanceToNext); CoordinateConverter.EncodeRelative(location.First.Coordinate, location.Last.Coordinate, data, 10); FunctionalRoadClassConvertor.Encode(location.Last.FuntionalRoadClass.Value, data, 14, 2); FormOfWayConvertor.Encode(location.Last.FormOfWay.Value, data, 14, 5); BearingConvertor.Encode(BearingConvertor.EncodeAngleToBearing(location.Last.Bearing.Value), data, 15, 3); OrientationConverter.Encode(location.Orientation.Value, data, 7, 0); SideOfRoadConverter.Encode(location.SideOfRoad.Value, data, 14, 0); if (location.PositiveOffsetPercentage.HasValue) { // positive offset percentage is present. OffsetConvertor.Encode(location.PositiveOffsetPercentage.Value, data, 16); } return(data); }
/// <summary> /// Decodes the given data into a location reference. /// </summary> public static PointAlongLineLocation Decode(byte[] data) { var pointAlongLine = new PointAlongLineLocation(); // decode first location reference point. var first = new LocationReferencePoint(); first.Coordinate = CoordinateConverter.Decode(data, 1); first.FuntionalRoadClass = FunctionalRoadClassConvertor.Decode(data, 7, 2); first.FormOfWay = FormOfWayConvertor.Decode(data, 7, 5); first.LowestFunctionalRoadClassToNext = FunctionalRoadClassConvertor.Decode(data, 8, 0); first.Bearing = BearingConvertor.DecodeAngleFromBearing(BearingConvertor.Decode(data, 8, 3)); first.DistanceToNext = DistanceToNextConvertor.Decode(data[9]); // decode second location reference point. var last = new LocationReferencePoint(); last.Coordinate = CoordinateConverter.DecodeRelative(first.Coordinate, data, 10); last.FuntionalRoadClass = FunctionalRoadClassConvertor.Decode(data, 14, 2); last.FormOfWay = FormOfWayConvertor.Decode(data, 14, 5); last.Bearing = BearingConvertor.DecodeAngleFromBearing(BearingConvertor.Decode(data, 15, 3)); pointAlongLine.First = first; pointAlongLine.Orientation = OrientationConverter.Decode(data, 7, 0); pointAlongLine.SideOfRoad = SideOfRoadConverter.Decode(data, 14, 0); pointAlongLine.PositiveOffsetPercentage = OffsetConvertor.Decode(data, 16); pointAlongLine.Last = last; return(pointAlongLine); }
/// <summary> /// Decodes the given data into a location reference. /// </summary> /// <param name="data"></param> /// <returns></returns> protected override ClosedLineLocation Decode(byte[] data) { // decode first location reference point. var first = new LocationReferencePoint(); first.Coordinate = CoordinateConverter.Decode(data, 1); first.FuntionalRoadClass = FunctionalRoadClassConvertor.Decode(data, 7, 2); first.FormOfWay = FormOfWayConvertor.Decode(data, 7, 5); first.LowestFunctionalRoadClassToNext = FunctionalRoadClassConvertor.Decode(data, 8, 0); first.Bearing = BearingConvertor.DecodeAngleFromBearing(BearingConvertor.Decode(data, 8, 3)); first.DistanceToNext = DistanceToNextConvertor.Decode(data[9]); // calculate the intermediate points count. var intermediateList = new List <LocationReferencePoint>(); int intermediates = (data.Length - 12) / 7; int location = 10; var reference = first.Coordinate; // the reference for the relative coordinates. for (int idx = 0; idx < intermediates; idx++) { // create an intermediate point. var intermediate = new LocationReferencePoint(); intermediate.Coordinate = CoordinateConverter.DecodeRelative(reference, data, location); reference = intermediate.Coordinate; location = location + 4; intermediate.FuntionalRoadClass = FunctionalRoadClassConvertor.Decode(data, location, 2); intermediate.FormOfWay = FormOfWayConvertor.Decode(data, location, 5); location = location + 1; intermediate.Bearing = BearingConvertor.DecodeAngleFromBearing(BearingConvertor.Decode(data, location, 3)); intermediate.LowestFunctionalRoadClassToNext = FunctionalRoadClassConvertor.Decode(data, location, 0); location = location + 1; intermediate.DistanceToNext = DistanceToNextConvertor.Decode(data[location]); location = location + 1; intermediateList.Add(intermediate); } // decode last location reference point. var last = new LocationReferencePoint(); // no last coordinates, identical to the first. last.Coordinate = first.Coordinate; last.FuntionalRoadClass = FunctionalRoadClassConvertor.Decode(data, location, 2); last.FormOfWay = FormOfWayConvertor.Decode(data, location, 5); location = location + 1; last.LowestFunctionalRoadClassToNext = FunctionalRoadClassConvertor.Decode(data, location, 0); last.Bearing = BearingConvertor.DecodeAngleFromBearing(BearingConvertor.Decode(data, location, 3)); location = location + 1; // create line location. var lineLocation = new ClosedLineLocation(); lineLocation.First = first; lineLocation.Intermediate = intermediateList.ToArray(); lineLocation.Last = last; return(lineLocation); }
/// <summary> /// Decodes the given data into a location reference. /// </summary> public static PoiWithAccessPointLocation Decode(byte[] data) { // decode first location reference point. var first = new LocationReferencePoint(); first.Coordinate = CoordinateConverter.Decode(data, 1); var orientation = OrientationConverter.Decode(data, 7, 0); first.FuntionalRoadClass = FunctionalRoadClassConvertor.Decode(data, 7, 2); first.FormOfWay = FormOfWayConvertor.Decode(data, 7, 5); first.LowestFunctionalRoadClassToNext = FunctionalRoadClassConvertor.Decode(data, 8, 0); first.Bearing = BearingConvertor.DecodeAngleFromBearing(BearingConvertor.Decode(data, 8, 3)); first.DistanceToNext = DistanceToNextConvertor.Decode(data[9]); // decode last location reference point. var last = new LocationReferencePoint(); // no last coordinates, identical to the first. last.Coordinate = CoordinateConverter.DecodeRelative(first.Coordinate, data, 10); var sideOfRoad = SideOfRoadConverter.Decode(data, 14, 0); last.FuntionalRoadClass = FunctionalRoadClassConvertor.Decode(data, 14, 2); last.FormOfWay = FormOfWayConvertor.Decode(data, 14, 5); last.Bearing = BearingConvertor.DecodeAngleFromBearing(BearingConvertor.Decode(data, 15, 3)); // poi details. var coordinate = CoordinateConverter.DecodeRelative(first.Coordinate, data, 17); // create line location. var poiWithAccessPointLocation = new PoiWithAccessPointLocation(); poiWithAccessPointLocation.First = first; poiWithAccessPointLocation.Last = last; poiWithAccessPointLocation.Coordinate = coordinate; poiWithAccessPointLocation.Orientation = orientation; poiWithAccessPointLocation.PositiveOffset = null; poiWithAccessPointLocation.SideOfRoad = sideOfRoad; return(poiWithAccessPointLocation); }
/// <summary> /// Encodes a point along line location. /// </summary> /// <param name="location"></param> /// <returns></returns> protected override byte[] EncodeByteArray(LineLocation location) { int size = 18; if (location.Intermediate != null) { // each intermediate adds 7 bytes. size = size + (location.Intermediate.Length * 7); } byte[] data = new byte[size]; var header = new Header(); header.Version = 3; header.HasAttributes = true; header.ArF0 = false; header.IsPoint = false; header.ArF1 = false; HeaderConvertor.Encode(data, 0, header); CoordinateConverter.Encode(location.First.Coordinate, data, 1); FunctionalRoadClassConvertor.Encode(location.First.FuntionalRoadClass.Value, data, 7, 2); FormOfWayConvertor.Encode(location.First.FormOfWay.Value, data, 7, 5); FunctionalRoadClassConvertor.Encode(location.First.LowestFunctionalRoadClassToNext.Value, data, 8, 0); BearingConvertor.Encode(BearingConvertor.EncodeAngleToBearing(location.First.Bearing.Value), data, 8, 3); data[9] = DistanceToNextConvertor.Encode(location.First.DistanceToNext); // calculate the intermediate points count. var position = 10; var reference = location.First.Coordinate; if (location.Intermediate != null) { for (int idx = 0; idx < location.Intermediate.Length; idx++) { // create an intermediate point. var intermediate = location.Intermediate[idx]; CoordinateConverter.EncodeRelative(location.First.Coordinate, intermediate.Coordinate, data, position); reference = intermediate.Coordinate; position = position + 4; FunctionalRoadClassConvertor.Encode(intermediate.FuntionalRoadClass.Value, data, position, 2); FormOfWayConvertor.Encode(intermediate.FormOfWay.Value, data, position, 5); position = position + 1; BearingConvertor.Encode(BearingConvertor.EncodeAngleToBearing(intermediate.Bearing.Value), data, position, 3); FunctionalRoadClassConvertor.Encode(intermediate.LowestFunctionalRoadClassToNext.Value, data, position, 0); position = position + 1; data[position] = DistanceToNextConvertor.Encode(intermediate.DistanceToNext); position = position + 1; } } CoordinateConverter.EncodeRelative(reference, location.Last.Coordinate, data, position); FunctionalRoadClassConvertor.Encode(location.Last.FuntionalRoadClass.Value, data, position + 4, 2); FormOfWayConvertor.Encode(location.Last.FormOfWay.Value, data, position + 4, 5); BearingConvertor.Encode(BearingConvertor.EncodeAngleToBearing(location.Last.Bearing.Value), data, position + 5, 3); if (location.PositiveOffsetPercentage.HasValue) { // positive offset percentage is present. OffsetConvertor.EncodeFlag(true, data, position + 5, 1); OffsetConvertor.Encode(location.PositiveOffsetPercentage.Value, data, position + 6); } if (location.NegativeOffsetPercentage.HasValue) { // positive offset percentage is present. OffsetConvertor.EncodeFlag(true, data, position + 5, 2); OffsetConvertor.Encode(location.NegativeOffsetPercentage.Value, data, position + 7); } return(data); }