/Core/OsmSharp.UnitTests/Routing/Serialization/RoutingSerializationTests.cs

https://bitbucket.org/tscheinpflug/osmsharp · C# · 287 lines · 142 code · 35 blank · 110 comment · 3 complexity · 33ccf6030bc12a0ff92131742b06331b MD5 · raw file

  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Reflection;
  5. using NUnit.Framework;
  6. using OsmSharp.Osm;
  7. using OsmSharp.Osm.Data.XML.Processor;
  8. using OsmSharp.Routing;
  9. using OsmSharp.Routing.Graph;
  10. using OsmSharp.Routing.Graph.DynamicGraph.PreProcessed;
  11. using OsmSharp.Routing.Graph.Router;
  12. using OsmSharp.Routing.Graph.Router.Dykstra;
  13. using OsmSharp.Routing.Graph.Serialization.v1;
  14. using OsmSharp.Routing.Osm.Data.Processing;
  15. using OsmSharp.Routing.Osm.Interpreter;
  16. using OsmSharp.Routing.Route;
  17. using OsmSharp.Tools.Math.Geo;
  18. namespace OsmSharp.UnitTests.Serialization
  19. {
  20. /// <summary>
  21. /// Holds tests for the routing serialization.
  22. /// </summary>
  23. [TestFixture]
  24. public class RoutingSerializationTests
  25. {
  26. /// <summary>
  27. /// Tests serializing/deserializing DynamicGraphRouterDataSource using the V1 routing serializer.
  28. /// </summary>
  29. [Test]
  30. public void RoutingSerializationDataSourceTest()
  31. {
  32. const string embeddedString = "OsmSharp.UnitTests.test_network.osm";
  33. // create the tags index.
  34. var tagsIndex = new OsmTagsIndex();
  35. // creates a new interpreter.
  36. var interpreter = new OsmRoutingInterpreter();
  37. // do the data processing.
  38. var original =
  39. new DynamicGraphRouterDataSource<PreProcessedEdge>(tagsIndex);
  40. var targetData = new PreProcessedDataGraphProcessingTarget(
  41. original, interpreter, original.TagsIndex, VehicleEnum.Car);
  42. var dataProcessorSource = new XmlDataProcessorSource(
  43. Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedString));
  44. targetData.RegisterSource(dataProcessorSource);
  45. targetData.Pull();
  46. // create serializer.
  47. var routingSerializer = new V1RoutingSerializer();
  48. // serialize/deserialize.
  49. IBasicRouterDataSource<PreProcessedEdge> deserializedVersion;
  50. byte[] byteArray;
  51. using (var stream = new MemoryStream())
  52. {
  53. try
  54. {
  55. routingSerializer.Serialize(stream, original);
  56. byteArray = stream.ToArray();
  57. }
  58. catch (Exception)
  59. {
  60. if (Debugger.IsAttached)
  61. {
  62. Debugger.Break();
  63. }
  64. throw;
  65. }
  66. }
  67. using (var stream = new MemoryStream(byteArray))
  68. {
  69. try
  70. {
  71. deserializedVersion = routingSerializer.Deserialize(stream);
  72. }
  73. catch (Exception)
  74. {
  75. if (Debugger.IsAttached)
  76. {
  77. Debugger.Break();
  78. }
  79. throw;
  80. }
  81. }
  82. //Assert.AreEqual(original.VertexCount, deserializedVersion.VertexCount);
  83. Assert.AreEqual(original.TagsIndex.Get(0), deserializedVersion.TagsIndex.Get(0));
  84. }
  85. /// <summary>
  86. /// Tests serializing/deserializing RoutingSerializationRoutingTest using the V1 routing serializer.
  87. /// </summary>
  88. [Test]
  89. public void RoutingSerializationRoutingTest()
  90. {
  91. const string embeddedString = "OsmSharp.UnitTests.test_network.osm";
  92. // create the tags index.
  93. var tagsIndex = new OsmTagsIndex();
  94. // creates a new interpreter.
  95. var interpreter = new OsmRoutingInterpreter();
  96. // do the data processing.
  97. var original =
  98. new DynamicGraphRouterDataSource<PreProcessedEdge>(tagsIndex);
  99. var targetData = new PreProcessedDataGraphProcessingTarget(
  100. original, interpreter, original.TagsIndex, VehicleEnum.Car);
  101. var dataProcessorSource = new XmlDataProcessorSource(
  102. Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedString));
  103. targetData.RegisterSource(dataProcessorSource);
  104. targetData.Pull();
  105. // create serializer.
  106. var routingSerializer = new V1RoutingSerializer();
  107. // serialize/deserialize.
  108. byte[] byteArray;
  109. using (var stream = new MemoryStream())
  110. {
  111. try
  112. {
  113. routingSerializer.Serialize(stream, original);
  114. byteArray = stream.ToArray();
  115. }
  116. catch (Exception)
  117. {
  118. if (Debugger.IsAttached)
  119. {
  120. Debugger.Break();
  121. }
  122. throw;
  123. }
  124. }
  125. IBasicRouterDataSource<PreProcessedEdge> deserializedVersion =
  126. routingSerializer.Deserialize(new MemoryStream(byteArray));
  127. Assert.AreEqual(original.TagsIndex.Get(0), deserializedVersion.TagsIndex.Get(0));
  128. // try to do some routing on the deserialized version.
  129. var basicRouter =
  130. new DykstraRoutingPreProcessed(deserializedVersion.TagsIndex);
  131. IRouter<RouterPoint> router = new Router<PreProcessedEdge>(
  132. deserializedVersion, interpreter, basicRouter);
  133. RouterPoint source = router.Resolve(VehicleEnum.Car,
  134. new GeoCoordinate(51.0578532, 3.7192229));
  135. RouterPoint target = router.Resolve(VehicleEnum.Car,
  136. new GeoCoordinate(51.0576193, 3.7191801));
  137. // calculate the route.
  138. OsmSharpRoute route = router.Calculate(VehicleEnum.Car, source, target);
  139. Assert.IsNotNull(route);
  140. Assert.AreEqual(5, route.Entries.Length);
  141. float latitude, longitude;
  142. deserializedVersion.GetVertex(20, out latitude, out longitude);
  143. Assert.AreEqual(latitude, route.Entries[0].Latitude, 0.00001);
  144. Assert.AreEqual(longitude, route.Entries[0].Longitude, 0.00001);
  145. Assert.AreEqual(RoutePointEntryType.Start, route.Entries[0].Type);
  146. deserializedVersion.GetVertex(21, out latitude, out longitude);
  147. Assert.AreEqual(latitude, route.Entries[1].Latitude, 0.00001);
  148. Assert.AreEqual(longitude, route.Entries[1].Longitude, 0.00001);
  149. Assert.AreEqual(RoutePointEntryType.Along, route.Entries[1].Type);
  150. deserializedVersion.GetVertex(16, out latitude, out longitude);
  151. Assert.AreEqual(latitude, route.Entries[2].Latitude, 0.00001);
  152. Assert.AreEqual(longitude, route.Entries[2].Longitude, 0.00001);
  153. Assert.AreEqual(RoutePointEntryType.Along, route.Entries[2].Type);
  154. deserializedVersion.GetVertex(22, out latitude, out longitude);
  155. Assert.AreEqual(latitude, route.Entries[3].Latitude, 0.00001);
  156. Assert.AreEqual(longitude, route.Entries[3].Longitude, 0.00001);
  157. Assert.AreEqual(RoutePointEntryType.Along, route.Entries[3].Type);
  158. deserializedVersion.GetVertex(23, out latitude, out longitude);
  159. Assert.AreEqual(latitude, route.Entries[4].Latitude, 0.00001);
  160. Assert.AreEqual(longitude, route.Entries[4].Longitude, 0.00001);
  161. Assert.AreEqual(RoutePointEntryType.Stop, route.Entries[4].Type);
  162. }
  163. ///// <summary>
  164. ///// Tests serializing/deserializing RoutingSerializationRoutingComparisonTest using the V1 routing serializer.
  165. ///// </summary>
  166. //[Test]
  167. //public void RoutingSerializationRoutingComparisonTest()
  168. //{
  169. // const string embeddedString = "OsmSharp.UnitTests.test_network_real1.osm";
  170. // // create the tags index.
  171. // var tagsIndex = new OsmTagsIndex();
  172. // // creates a new interpreter.
  173. // var interpreter = new OsmRoutingInterpreter();
  174. // // do the data processing.
  175. // var original =
  176. // new DynamicGraphRouterDataSource<PreProcessedEdge>(tagsIndex);
  177. // var targetData = new PreProcessedDataGraphProcessingTarget(
  178. // original, interpreter, original.TagsIndex, VehicleEnum.Car);
  179. // var dataProcessorSource = new XmlDataProcessorSource(
  180. // Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedString));
  181. // targetData.RegisterSource(dataProcessorSource);
  182. // targetData.Pull();
  183. // // create the original routing.
  184. // var basicRouterOriginal =
  185. // new DykstraRoutingPreProcessed(original.TagsIndex);
  186. // IRouter<RouterPoint> referenceRouter = new Router<PreProcessedEdge>(
  187. // original, interpreter, basicRouterOriginal);
  188. // // create serializer.
  189. // var routingSerializer = new V1RoutingSerializer();
  190. // // serialize/deserialize.
  191. // byte[] byteArray;
  192. // using (var stream = new MemoryStream())
  193. // {
  194. // try
  195. // {
  196. // routingSerializer.Serialize(stream, original);
  197. // byteArray = stream.ToArray();
  198. // }
  199. // catch (Exception ex)
  200. // {
  201. // if (Debugger.IsAttached)
  202. // {
  203. // Debugger.Break();
  204. // }
  205. // throw;
  206. // }
  207. // }
  208. // IBasicRouterDataSource<PreProcessedEdge> deserializedVersion =
  209. // routingSerializer.Deserialize(new MemoryStream(byteArray));
  210. // Assert.AreEqual(original.TagsIndex.Get(0), deserializedVersion.TagsIndex.Get(0));
  211. // // try to do some routing on the deserialized version.
  212. // var basicRouter =
  213. // new DykstraRoutingPreProcessed(deserializedVersion.TagsIndex);
  214. // IRouter<RouterPoint> router = new Router<PreProcessedEdge>(
  215. // deserializedVersion, interpreter, basicRouter);
  216. // // loop over all nodes and resolve their locations.
  217. // var resolvedReference = new RouterPoint[original.VertexCount];
  218. // var resolved = new RouterPoint[original.VertexCount];
  219. // for (uint idx = 1; idx < original.VertexCount + 1; idx++)
  220. // { // resolve each vertex.
  221. // float latitude, longitude;
  222. // if (original.GetVertex(idx, out latitude, out longitude))
  223. // {
  224. // resolvedReference[idx - 1] = referenceRouter.Resolve(VehicleEnum.Car, new GeoCoordinate(latitude, longitude));
  225. // resolved[idx - 1] = router.Resolve(VehicleEnum.Car, new GeoCoordinate(latitude, longitude));
  226. // }
  227. // Assert.IsNotNull(resolvedReference[idx - 1]);
  228. // Assert.IsNotNull(resolved[idx - 1]);
  229. // Assert.AreEqual(resolvedReference[idx - 1].Location.Latitude,
  230. // resolved[idx - 1].Location.Latitude, 0.0001);
  231. // Assert.AreEqual(resolvedReference[idx - 1].Location.Longitude,
  232. // resolved[idx - 1].Location.Longitude, 0.0001);
  233. // }
  234. // // check all the routes having the same weight(s).
  235. // for (int from_idx = 0; from_idx < resolved.Length; from_idx++)
  236. // {
  237. // for (int to_idx = 0; to_idx < resolved.Length; to_idx++)
  238. // {
  239. // OsmSharpRoute reference_route = referenceRouter.Calculate(VehicleEnum.Car,
  240. // resolvedReference[from_idx], resolvedReference[to_idx]);
  241. // OsmSharpRoute route = router.Calculate(VehicleEnum.Car,
  242. // resolved[from_idx], resolved[to_idx]);
  243. // //Assert.IsNotNull(reference_route);
  244. // //Assert.IsNotNull(route);
  245. // //Assert.AreEqual(reference_route.TotalDistance, route.TotalDistance, 0.0001);
  246. // // TODO: meta data is missing in some CH routing; see issue
  247. // //Assert.AreEqual(reference_route.TotalTime, route.TotalTime, 0.0001);
  248. // }
  249. // }
  250. //}
  251. }
  252. }