public void RTreeMemoryIndexAddTests() { // build test-data. var testDataList = new List<KeyValuePair<BoxF2D, DataTestClass>>(); const int count = 10000; var randomGenerator = new RandomGenerator(66707770); // make this deterministic for (int idx = 0; idx < count; idx++) { double x1 = randomGenerator.Generate(1.0); double x2 = randomGenerator.Generate(1.0); double y1 = randomGenerator.Generate(1.0); double y2 = randomGenerator.Generate(1.0); var box = new BoxF2D(new PointF2D(x1, y1), new PointF2D(x2, y2)); var testData = new DataTestClass(); testData.Data = idx.ToString(System.Globalization.CultureInfo.InvariantCulture); testDataList.Add(new KeyValuePair<BoxF2D, DataTestClass>( box, testData)); } // create the index and reference index. var index = new RTreeMemoryIndex<DataTestClass>(); var reference = new ReferenceImplementation<DataTestClass>(); // add all the data. for (int idx = 0; idx < count; idx++) { var keyValuePair = testDataList[idx]; index.Add(keyValuePair.Key, keyValuePair.Value); reference.Add(keyValuePair.Key, keyValuePair.Value); //Assert.AreEqual(reference.Count(), index.Count()); } //Assert.AreEqual(count, index.Count()); // generate random boxes and compare results. for (int idx = 0; idx < 200; idx++) { double x1 = randomGenerator.Generate(1.0); double x2 = randomGenerator.Generate(1.0); double y1 = randomGenerator.Generate(1.0); double y2 = randomGenerator.Generate(1.0); var box = new BoxF2D(new PointF2D(x1, y1), new PointF2D(x2, y2)); var resultIndex = new HashSet<DataTestClass>(index.Get(box)); var resultReference = new HashSet<DataTestClass>(reference.Get(box)); foreach (var data in resultIndex) { Assert.IsTrue(resultReference.Contains(data)); } foreach (var data in resultReference) { Assert.IsTrue(resultIndex.Contains(data)); } } }
/// <summary> /// Serializes this scene2D to the given stream. /// </summary> /// <param name="stream"></param> /// <param name="compress"></param> public void SerializeStyled(Stream stream, bool compress) { // build the index. var index = new RTreeMemoryIndex <Scene2DEntry>(); foreach (var primitiveLayer in _primitives) { foreach (var primitive in primitiveLayer.Value) { index.Add(primitive.GetBox(), new Scene2DEntry() { Layer = primitiveLayer.Key, Id = 0, Scene2DPrimitive = primitive }); } } // create the serializer. var serializer = new OsmSharp.UI.Renderer.Scene.Storage.Styled.Scene2DStyledSerializer(); serializer.Serialize(stream, index); }
/// <summary> /// Serializes this scene2D to the given stream. /// </summary> /// <param name="stream"></param> /// <param name="compress"></param> public override void Serialize(Stream stream, bool compress) { // build the index. var index = new RTreeMemoryIndex <Scene2DEntry>(); foreach (var primitiveLayer in _primitives) { foreach (var primitive in primitiveLayer.Value) { index.Add(primitive.GetBox(), new Scene2DEntry() { Layer = primitiveLayer.Key, Id = 0, Scene2DPrimitive = primitive }); } } // create the serializer. var serializer = new Scene2DRTreeSerializer(compress); serializer.Serialize(stream, index); }
public void RTreeMemoryIndexEnumerationTests() { // create the index. var index = new RTreeMemoryIndex <DataTestClass>(); // build test-data. var testDataList = new HashSet <DataTestClass>(); const int count = 10000; var randomGenerator = new RandomGenerator(66707770); // make this deterministic for (int idx = 0; idx < count; idx++) { double x1 = randomGenerator.Generate(1.0); double x2 = randomGenerator.Generate(1.0); double y1 = randomGenerator.Generate(1.0); double y2 = randomGenerator.Generate(1.0); var box = new BoxF2D(new PointF2D(x1, y1), new PointF2D(x2, y2)); var testData = new DataTestClass(); testData.Data = idx.ToString(System.Globalization.CultureInfo.InvariantCulture); testDataList.Add(testData); index.Add(box, testData); } // compare and check if all data gets enumerated. HashSet <DataTestClass> reference = new HashSet <DataTestClass>(); foreach (DataTestClass dataTestClass in index) { reference.Add(dataTestClass); Assert.IsTrue(testDataList.Contains(dataTestClass)); } Assert.AreEqual(testDataList.Count, reference.Count); Assert.AreEqual(testDataList.Count, index.Count); }
/// <summary> /// Serializes the given scene. /// </summary> /// <param name="stream"></param> /// <param name="scene"></param> /// <param name="compress"></param> public static void Serialize(Stream stream, TagsCollectionBase metaTags, Scene2D scene, bool compress) { RuntimeTypeModel typeModel = SceneSerializer.BuildRuntimeTypeModel(); // [MetaIndexLenght:4][Metadata][SeneIndexLength:4][SceneIndex][SceneLengths:4*zoomFactors.length][Scenes] // MetaIndexLenght: int The lenght of the meta index. // Metadata: a number of serialized tags. // SceneIndexLength: int The length of the sceneindex in bytes. // SceneIndex: the serialized scene index. // SceneLengths: int[] The lengths of the scenes per zoom level as in the zoomfactors array. // Scenes: The serialized scenes themselves. // serialize meta tags. byte[] tagsBytes = (new TagsCollectionSerializer()).Serialize(metaTags); stream.Write(BitConverter.GetBytes(tagsBytes.Length), 0, 4); stream.Write(tagsBytes, 0, tagsBytes.Length); // index index. SceneIndex sceneIndex = new SceneIndex(); sceneIndex.LineStyles = scene.GetStyleLines(); sceneIndex.PointStyles = scene.GetStylePoints(); sceneIndex.PolygonStyles = scene.GetStylePolygons(); sceneIndex.TextStyles = scene.GetStyleTexts(); sceneIndex.ZoomRanges = scene.GetZoomRanges(); sceneIndex.ZoomFactors = scene.GetZoomFactors(); sceneIndex.IconImage = scene.GetImages(); // write SceneIndex long positionAfterMeta = stream.Position; stream.Seek(positionAfterMeta + 4, SeekOrigin.Begin); long indexStart = stream.Position; typeModel.Serialize(stream, sceneIndex); // write SeneIndexLength int indexSize = (int)(stream.Position - indexStart); stream.Seek(positionAfterMeta + 0, SeekOrigin.Begin); stream.Write(BitConverter.GetBytes(indexSize), 0, 4); // write Scenes. stream.Seek(positionAfterMeta + 4 + indexSize + 4 * sceneIndex.ZoomFactors.Length, SeekOrigin.Begin); // index into r-trees and serialize. int[] lengths = new int[sceneIndex.ZoomFactors.Length]; for (int idx = 0; idx < lengths.Length; idx++) { long position = stream.Position; Dictionary <uint, SceneObject> sceneAtZoom = scene.GetObjectsAt(idx); RTreeMemoryIndex <SceneObject> memoryIndex = new RTreeMemoryIndex <SceneObject>(); float latestProgress = 0; int sceneObjectIdx = 0; foreach (KeyValuePair <uint, SceneObject> sceneObjectPair in sceneAtZoom) { // loop over all primitives in order. SceneObject sceneObject = sceneObjectPair.Value; uint id = sceneObjectPair.Key; switch (sceneObject.Enum) { case SceneObjectType.IconObject: case SceneObjectType.PointObject: case SceneObjectType.TextObject: OsmSharp.UI.Renderer.Scene.Scene2D.ScenePoint geo = scene.GetPoint(sceneObject.GeoId); PointF2D point = new PointF2D(geo.X, geo.Y); memoryIndex.Add(new BoxF2D(point), sceneObject); break; case SceneObjectType.LineObject: case SceneObjectType.LineTextObject: case SceneObjectType.PolygonObject: OsmSharp.UI.Renderer.Scene.Scene2D.ScenePoints geos = scene.GetPoints(sceneObject.GeoId); memoryIndex.Add(new BoxF2D(geos.X, geos.Y), sceneObject); break; } float progress = (float)System.Math.Round((((double)sceneObjectIdx / (double)sceneAtZoom.Count) * 100)); if (progress != latestProgress) { OsmSharp.Logging.Log.TraceEvent("SceneSerializer", OsmSharp.Logging.TraceEventType.Information, "Indexing scene objects at zoom {1} ({2}/{3})... {0}%", progress, sceneIndex.ZoomFactors[idx], sceneObjectIdx, sceneAtZoom.Count); latestProgress = progress; } sceneObjectIdx++; } // serialize the r-tree. OsmSharp.Logging.Log.TraceEvent("SceneSerializer", OsmSharp.Logging.TraceEventType.Information, "Serializing RTRee..."); SceneObjectRTreeSerializer memoryIndexSerializer = new SceneObjectRTreeSerializer( scene, compress, idx, SceneSerializer.CalculateScaleFactor(sceneIndex.ZoomFactors[idx])); memoryIndexSerializer.Serialize(new LimitedStream(stream), memoryIndex); lengths[idx] = (int)(stream.Position - position); } // write SceneLengths long end = stream.Position; stream.Seek(positionAfterMeta + 4 + indexSize, SeekOrigin.Begin); for (int idx = 0; idx < lengths.Length; idx++) { stream.Write(BitConverter.GetBytes(lengths[idx]), 0, 4); } stream.Seek(end, SeekOrigin.Begin); }
public void RTreeMemoryIndexSmall1Tests() { var rect1 = new BoxF2D(0, 0, 2, 2); var rect2 = new BoxF2D(4, 0, 6, 2); var rect3 = new BoxF2D(0, 4, 2, 6); var rect4 = new BoxF2D(4, 4, 6, 6); var rect5 = new BoxF2D(1, 1, 3, 3); // create the index and reference index. var index = new RTreeMemoryIndex <string>(4, 1); // add data. index.Add(rect1, rect1.ToString() + "1"); index.Add(rect1, rect1.ToString() + "2"); index.Add(rect1, rect1.ToString() + "3"); index.Add(rect1, rect1.ToString() + "4"); index.Add(rect2, rect2.ToString() + "1"); index.Add(rect2, rect2.ToString() + "2"); index.Add(rect2, rect2.ToString() + "3"); index.Add(rect2, rect2.ToString() + "4"); index.Add(rect3, rect3.ToString() + "1"); index.Add(rect3, rect3.ToString() + "2"); index.Add(rect3, rect3.ToString() + "3"); index.Add(rect3, rect3.ToString() + "4"); index.Add(rect4, rect4.ToString() + "1"); index.Add(rect4, rect4.ToString() + "2"); index.Add(rect4, rect4.ToString() + "3"); index.Add(rect4, rect4.ToString() + "4"); index.Add(rect5, rect5.ToString()); // some simple queries. var result = new HashSet <string>( index.Get(rect4)); Assert.AreEqual(4, result.Count); Assert.IsTrue(result.Contains(rect4.ToString() + "1")); Assert.IsTrue(result.Contains(rect4.ToString() + "2")); Assert.IsTrue(result.Contains(rect4.ToString() + "3")); Assert.IsTrue(result.Contains(rect4.ToString() + "4")); result = new HashSet <string>( index.Get(rect3)); Assert.AreEqual(4, result.Count); Assert.IsTrue(result.Contains(rect3.ToString() + "1")); Assert.IsTrue(result.Contains(rect3.ToString() + "2")); Assert.IsTrue(result.Contains(rect3.ToString() + "3")); Assert.IsTrue(result.Contains(rect3.ToString() + "4")); result = new HashSet <string>( index.Get(rect2)); Assert.AreEqual(4, result.Count); Assert.IsTrue(result.Contains(rect2.ToString() + "1")); Assert.IsTrue(result.Contains(rect2.ToString() + "2")); Assert.IsTrue(result.Contains(rect2.ToString() + "3")); Assert.IsTrue(result.Contains(rect2.ToString() + "4")); result = new HashSet <string>( index.Get(rect1)); Assert.AreEqual(5, result.Count); Assert.IsTrue(result.Contains(rect1.ToString() + "1")); Assert.IsTrue(result.Contains(rect1.ToString() + "2")); Assert.IsTrue(result.Contains(rect1.ToString() + "3")); Assert.IsTrue(result.Contains(rect1.ToString() + "4")); Assert.IsTrue(result.Contains(rect5.ToString())); }
public void RTreeMemoryIndexAddTests() { // build test-data. var testDataList = new List <KeyValuePair <BoxF2D, DataTestClass> >(); const int count = 10000; var randomGenerator = new RandomGenerator(66707770); // make this deterministic for (int idx = 0; idx < count; idx++) { double x1 = randomGenerator.Generate(1.0); double x2 = randomGenerator.Generate(1.0); double y1 = randomGenerator.Generate(1.0); double y2 = randomGenerator.Generate(1.0); var box = new BoxF2D(new PointF2D(x1, y1), new PointF2D(x2, y2)); var testData = new DataTestClass(); testData.Data = idx.ToString(System.Globalization.CultureInfo.InvariantCulture); testDataList.Add(new KeyValuePair <BoxF2D, DataTestClass>( box, testData)); } // create the index and reference index. var index = new RTreeMemoryIndex <DataTestClass>(); var reference = new ReferenceImplementation <DataTestClass>(); // add all the data. for (int idx = 0; idx < count; idx++) { var keyValuePair = testDataList[idx]; index.Add(keyValuePair.Key, keyValuePair.Value); reference.Add(keyValuePair.Key, keyValuePair.Value); //Assert.AreEqual(reference.Count(), index.Count()); } //Assert.AreEqual(count, index.Count()); // generate random boxes and compare results. for (int idx = 0; idx < 200; idx++) { double x1 = randomGenerator.Generate(1.0); double x2 = randomGenerator.Generate(1.0); double y1 = randomGenerator.Generate(1.0); double y2 = randomGenerator.Generate(1.0); var box = new BoxF2D(new PointF2D(x1, y1), new PointF2D(x2, y2)); var resultIndex = new HashSet <DataTestClass>(index.Get(box)); var resultReference = new HashSet <DataTestClass>(reference.Get(box)); foreach (var data in resultIndex) { Assert.IsTrue(resultReference.Contains(data)); } foreach (var data in resultReference) { Assert.IsTrue(resultIndex.Contains(data)); } } }
/// <summary> /// Serializes the given scene. /// </summary> /// <param name="stream"></param> /// <param name="scene"></param> /// <param name="compress"></param> public static void Serialize(Stream stream, TagsCollectionBase metaTags, Scene2D scene, bool compress) { RuntimeTypeModel typeModel = SceneSerializer.BuildRuntimeTypeModel(); // [MetaIndexLenght:4][Metadata][SeneIndexLength:4][SceneIndex][SceneLengths:4*zoomFactors.length][Scenes] // MetaIndexLenght: int The lenght of the meta index. // Metadata: a number of serialized tags. // SceneIndexLength: int The length of the sceneindex in bytes. // SceneIndex: the serialized scene index. // SceneLengths: int[] The lengths of the scenes per zoom level as in the zoomfactors array. // Scenes: The serialized scenes themselves. // serialize meta tags. (new TagsCollectionSerializer()).SerializeWithSize(metaTags, stream); // index index. SceneIndex sceneIndex = new SceneIndex(); sceneIndex.LineStyles = scene.GetStyleLines(); sceneIndex.PointStyles = scene.GetStylePoints(); sceneIndex.PolygonStyles = scene.GetStylePolygons(); sceneIndex.TextStyles = scene.GetStyleTexts(); sceneIndex.ZoomRanges = scene.GetZoomRanges(); sceneIndex.ZoomFactors = scene.GetZoomFactors(); sceneIndex.IconImage = scene.GetImages(); // write SceneIndex long positionAfterMeta = stream.Position; stream.Seek(positionAfterMeta + 4, SeekOrigin.Begin); long indexStart = stream.Position; typeModel.Serialize(stream, sceneIndex); // write SeneIndexLength int indexSize = (int)(stream.Position - indexStart); stream.Seek(positionAfterMeta + 0, SeekOrigin.Begin); stream.Write(BitConverter.GetBytes(indexSize), 0, 4); // write Scenes. stream.Seek(positionAfterMeta + 4 + indexSize + 4 * sceneIndex.ZoomFactors.Length, SeekOrigin.Begin); // index into r-trees and serialize. int[] lengths = new int[sceneIndex.ZoomFactors.Length]; for (int idx = 0; idx < lengths.Length; idx++) { long position = stream.Position; Dictionary<uint, SceneObject> sceneAtZoom = scene.GetObjectsAt(idx); RTreeMemoryIndex<SceneObject> memoryIndex = new RTreeMemoryIndex<SceneObject>(50, 100); float latestProgress = 0; int sceneObjectIdx = 0; foreach (KeyValuePair<uint, SceneObject> sceneObjectPair in sceneAtZoom) { // loop over all primitives in order. SceneObject sceneObject = sceneObjectPair.Value; uint id = sceneObjectPair.Key; switch (sceneObject.Enum) { case SceneObjectType.IconObject: case SceneObjectType.PointObject: case SceneObjectType.TextObject: OsmSharp.UI.Renderer.Scene.Scene2D.ScenePoint geo = scene.GetPoint(sceneObject.GeoId); PointF2D point = new PointF2D(geo.X, geo.Y); memoryIndex.Add(new BoxF2D(point), sceneObject); break; case SceneObjectType.LineObject: case SceneObjectType.LineTextObject: case SceneObjectType.PolygonObject: OsmSharp.UI.Renderer.Scene.Scene2D.ScenePoints geos = scene.GetPoints(sceneObject.GeoId); memoryIndex.Add(new BoxF2D(geos.X, geos.Y), sceneObject); break; } float progress = (float)System.Math.Round((((double)sceneObjectIdx / (double)sceneAtZoom.Count) * 100)); if (progress != latestProgress) { OsmSharp.Logging.Log.TraceEvent("SceneSerializer", OsmSharp.Logging.TraceEventType.Information, "Indexing scene objects at zoom {1} ({2}/{3})... {0}%", progress, sceneIndex.ZoomFactors[idx], sceneObjectIdx, sceneAtZoom.Count); latestProgress = progress; } sceneObjectIdx++; } // serialize the r-tree. OsmSharp.Logging.Log.TraceEvent("SceneSerializer", OsmSharp.Logging.TraceEventType.Information, "Serializing RTRee..."); SceneObjectRTreeSerializer memoryIndexSerializer = new SceneObjectRTreeSerializer( scene, compress, idx, SceneSerializer.CalculateScaleFactor(sceneIndex.ZoomFactors[idx])); memoryIndexSerializer.Serialize(new LimitedStream(stream), memoryIndex); lengths[idx] = (int)(stream.Position - position); } // write SceneLengths long end = stream.Position; stream.Seek(positionAfterMeta + 4 + indexSize, SeekOrigin.Begin); for (int idx = 0; idx < lengths.Length; idx++) { stream.Write(BitConverter.GetBytes(lengths[idx]), 0, 4); } stream.Seek(end, SeekOrigin.Begin); }
public void RTreeMemoryIndexSmall1Tests() { var rect1 = new BoxF2D(0, 0, 2, 2); var rect2 = new BoxF2D(4, 0, 6, 2); var rect3 = new BoxF2D(0, 4, 2, 6); var rect4 = new BoxF2D(4, 4, 6, 6); var rect5 = new BoxF2D(1, 1, 3, 3); // create the index and reference index. var index = new RTreeMemoryIndex<string>(4, 1); // add data. index.Add(rect1, rect1.ToString() + "1"); index.Add(rect1, rect1.ToString() + "2"); index.Add(rect1, rect1.ToString() + "3"); index.Add(rect1, rect1.ToString() + "4"); index.Add(rect2, rect2.ToString() + "1"); index.Add(rect2, rect2.ToString() + "2"); index.Add(rect2, rect2.ToString() + "3"); index.Add(rect2, rect2.ToString() + "4"); index.Add(rect3, rect3.ToString() + "1"); index.Add(rect3, rect3.ToString() + "2"); index.Add(rect3, rect3.ToString() + "3"); index.Add(rect3, rect3.ToString() + "4"); index.Add(rect4, rect4.ToString() + "1"); index.Add(rect4, rect4.ToString() + "2"); index.Add(rect4, rect4.ToString() + "3"); index.Add(rect4, rect4.ToString() + "4"); index.Add(rect5, rect5.ToString()); // some simple queries. var result = new HashSet<string>( index.Get(rect4)); Assert.AreEqual(4, result.Count); Assert.IsTrue(result.Contains(rect4.ToString() + "1")); Assert.IsTrue(result.Contains(rect4.ToString() + "2")); Assert.IsTrue(result.Contains(rect4.ToString() + "3")); Assert.IsTrue(result.Contains(rect4.ToString() + "4")); result = new HashSet<string>( index.Get(rect3)); Assert.AreEqual(4, result.Count); Assert.IsTrue(result.Contains(rect3.ToString() + "1")); Assert.IsTrue(result.Contains(rect3.ToString() + "2")); Assert.IsTrue(result.Contains(rect3.ToString() + "3")); Assert.IsTrue(result.Contains(rect3.ToString() + "4")); result = new HashSet<string>( index.Get(rect2)); Assert.AreEqual(4, result.Count); Assert.IsTrue(result.Contains(rect2.ToString() + "1")); Assert.IsTrue(result.Contains(rect2.ToString() + "2")); Assert.IsTrue(result.Contains(rect2.ToString() + "3")); Assert.IsTrue(result.Contains(rect2.ToString() + "4")); result = new HashSet<string>( index.Get(rect1)); Assert.AreEqual(5, result.Count); Assert.IsTrue(result.Contains(rect1.ToString() + "1")); Assert.IsTrue(result.Contains(rect1.ToString() + "2")); Assert.IsTrue(result.Contains(rect1.ToString() + "3")); Assert.IsTrue(result.Contains(rect1.ToString() + "4")); Assert.IsTrue(result.Contains(rect5.ToString())); }
public void RTreeMemoryIndexEnumerationTests() { // create the index. var index = new RTreeMemoryIndex<DataTestClass>(); // build test-data. var testDataList = new HashSet<DataTestClass>(); const int count = 10000; var randomGenerator = new RandomGenerator(66707770); // make this deterministic for (int idx = 0; idx < count; idx++) { double x1 = randomGenerator.Generate(1.0); double x2 = randomGenerator.Generate(1.0); double y1 = randomGenerator.Generate(1.0); double y2 = randomGenerator.Generate(1.0); var box = new BoxF2D(new PointF2D(x1, y1), new PointF2D(x2, y2)); var testData = new DataTestClass(); testData.Data = idx.ToString(System.Globalization.CultureInfo.InvariantCulture); testDataList.Add(testData); index.Add(box, testData); } // compare and check if all data gets enumerated. HashSet<DataTestClass> reference = new HashSet<DataTestClass>(); foreach (DataTestClass dataTestClass in index) { reference.Add(dataTestClass); Assert.IsTrue(testDataList.Contains(dataTestClass)); } Assert.AreEqual(testDataList.Count, reference.Count); Assert.AreEqual(testDataList.Count, index.Count); }
public void RTreeStreamSerializeSmallTest() { var rect1 = new BoxF2D(0, 0, 2, 2); var rect2 = new BoxF2D(4, 0, 6, 2); var rect3 = new BoxF2D(0, 4, 2, 6); var rect4 = new BoxF2D(4, 4, 6, 6); // create the index and reference index. var index = new RTreeMemoryIndex <string>(); // add data. index.Add(rect1, rect1.ToString() + "1"); index.Add(rect1, rect1.ToString() + "2"); index.Add(rect1, rect1.ToString() + "3"); index.Add(rect1, rect1.ToString() + "4"); index.Add(rect2, rect2.ToString() + "1"); index.Add(rect2, rect2.ToString() + "2"); index.Add(rect2, rect2.ToString() + "3"); index.Add(rect2, rect2.ToString() + "4"); index.Add(rect3, rect3.ToString() + "1"); index.Add(rect3, rect3.ToString() + "2"); index.Add(rect3, rect3.ToString() + "3"); index.Add(rect3, rect3.ToString() + "4"); index.Add(rect4, rect4.ToString() + "1"); index.Add(rect4, rect4.ToString() + "2"); index.Add(rect4, rect4.ToString() + "3"); index.Add(rect4, rect4.ToString() + "4"); var stream = new MemoryStream(); var serializer = new DataTestClassSerializer(); serializer.Serialize(stream, index); ISpatialIndexReadonly <string> deserialized = serializer.Deserialize(stream, true); // some simple queries. var result = new HashSet <string>( deserialized.Get(rect4)); Assert.AreEqual(4, result.Count); Assert.IsTrue(result.Contains(rect4.ToString() + "1")); Assert.IsTrue(result.Contains(rect4.ToString() + "2")); Assert.IsTrue(result.Contains(rect4.ToString() + "3")); Assert.IsTrue(result.Contains(rect4.ToString() + "4")); result = new HashSet <string>( deserialized.Get(rect3)); Assert.AreEqual(4, result.Count); Assert.IsTrue(result.Contains(rect3.ToString() + "1")); Assert.IsTrue(result.Contains(rect3.ToString() + "2")); Assert.IsTrue(result.Contains(rect3.ToString() + "3")); Assert.IsTrue(result.Contains(rect3.ToString() + "4")); result = new HashSet <string>( deserialized.Get(rect2)); Assert.AreEqual(4, result.Count); Assert.IsTrue(result.Contains(rect2.ToString() + "1")); Assert.IsTrue(result.Contains(rect2.ToString() + "2")); Assert.IsTrue(result.Contains(rect2.ToString() + "3")); Assert.IsTrue(result.Contains(rect2.ToString() + "4")); result = new HashSet <string>( deserialized.Get(rect1)); Assert.AreEqual(4, result.Count); Assert.IsTrue(result.Contains(rect1.ToString() + "1")); Assert.IsTrue(result.Contains(rect1.ToString() + "2")); Assert.IsTrue(result.Contains(rect1.ToString() + "3")); Assert.IsTrue(result.Contains(rect1.ToString() + "4")); }
public void RTreeStreamSerializeIndexAddTests() { // build test-data. var testDataList = new List <KeyValuePair <BoxF2D, string> >(); const int count = 1000; var randomGenerator = new RandomGenerator(66707770); // make this deterministic for (int idx = 0; idx < count; idx++) { double x1 = randomGenerator.Generate(1.0); double x2 = randomGenerator.Generate(1.0); double y1 = randomGenerator.Generate(1.0); double y2 = randomGenerator.Generate(1.0); var box = new BoxF2D(new PointF2D(x1, y1), new PointF2D(x2, y2)); testDataList.Add(new KeyValuePair <BoxF2D, string>( box, idx.ToString(System.Globalization.CultureInfo.InvariantCulture))); } // create the index and reference index. var index = new RTreeMemoryIndex <string>(); var reference = new ReferenceImplementation <string>(); // add all the data. for (int idx = 0; idx < count; idx++) { var keyValuePair = testDataList[idx]; index.Add(keyValuePair.Key, keyValuePair.Value); reference.Add(keyValuePair.Key, keyValuePair.Value); //Assert.AreEqual(reference.Count(), index.Count()); } //Assert.AreEqual(count, index.Count()); var stream = new MemoryStream(); var serializer = new DataTestClassSerializer(); serializer.Serialize(stream, index); ISpatialIndexReadonly <string> deserialized = serializer.Deserialize(stream, true); // query all. var totalBox = new BoxF2D(0, 0, 1, 1); var resultIndex = new HashSet <string>(deserialized.Get(totalBox)); var resultReference = new HashSet <string>(reference.Get(totalBox)); foreach (var data in resultIndex) { Assert.IsTrue(resultReference.Contains(data)); } foreach (var data in resultReference) { Assert.IsTrue(resultIndex.Contains(data)); } // generate random boxes and compare results. for (int idx = 0; idx < 20; idx++) { double x1 = randomGenerator.Generate(1.0); double x2 = randomGenerator.Generate(1.0); double y1 = randomGenerator.Generate(1.0); double y2 = randomGenerator.Generate(1.0); var box = new BoxF2D(new PointF2D(x1, y1), new PointF2D(x2, y2)); resultIndex = new HashSet <string>(deserialized.Get(box)); resultReference = new HashSet <string>(reference.Get(box)); foreach (var data in resultIndex) { Assert.IsTrue(resultReference.Contains(data)); } foreach (var data in resultReference) { Assert.IsTrue(resultIndex.Contains(data)); } } }
/// <summary> /// Serializes this scene2D to the given stream. /// </summary> /// <param name="stream"></param> /// <param name="compress"></param> public void SerializeStyled(Stream stream, bool compress) { // build the index. var index = new RTreeMemoryIndex<Scene2DEntry>(); foreach (var primitiveLayer in _primitives) { foreach (var primitive in primitiveLayer.Value) { index.Add(primitive.GetBox(), new Scene2DEntry() { Layer = primitiveLayer.Key, Id = 0, Scene2DPrimitive = primitive }); } } // create the serializer. var serializer = new OsmSharp.UI.Renderer.Scene.Storage.Styled.Scene2DStyledSerializer(); serializer.Serialize(stream, index); }
/// <summary> /// Serializes this scene2D to the given stream. /// </summary> /// <param name="stream"></param> /// <param name="compress"></param> public override void Serialize(Stream stream, bool compress) { // build the index. var index = new RTreeMemoryIndex<Scene2DEntry>(); foreach (var primitiveLayer in _primitives) { foreach (var primitive in primitiveLayer.Value) { index.Add(primitive.GetBox(), new Scene2DEntry() { Layer = primitiveLayer.Key, Id = 0, Scene2DPrimitive = primitive }); } } // create the serializer. var serializer = new Scene2DRTreeSerializer(compress); serializer.Serialize(stream, index); }