/// <summary> /// Serializes a stream with a style index. /// </summary> /// <param name="stream"></param> /// <param name="index"></param> public void Serialize(Stream stream, RTreeMemoryIndex<Scene2DEntry> index) { Scene2DStyledIndex styleIndex = new Scene2DStyledIndex(); Scene2DRTreeSerializer serializer = new Scene2DRTreeSerializer(true, styleIndex); // serialize the tree and fill the styleindex. MemoryStream rTreeStream = new MemoryStream(); serializer.Serialize(rTreeStream, index); // serialize the index. MemoryStream indexStream = new MemoryStream(); RuntimeTypeModel typeModel = TypeModel.Create(); typeModel.Add(typeof(Scene2DStyledIndex), true); typeModel.Add(typeof(Icon2DStyle), true); typeModel.Add(typeof(Image2DStyle), true); typeModel.Add(typeof(Line2DStyle), true); typeModel.Add(typeof(Point2DStyle), true); typeModel.Add(typeof(Polygon2DStyle), true); typeModel.Add(typeof(Text2DStyle), true); typeModel.Add(typeof(LineText2DStyle), true); typeModel.Serialize(indexStream, styleIndex); // write to the final stream. byte[] indexSizeBytes = BitConverter.GetBytes((int)indexStream.Length); stream.Write(indexSizeBytes, 0, indexSizeBytes.Length); indexStream.Seek(0, SeekOrigin.Begin); indexStream.WriteTo(stream); rTreeStream.WriteTo(stream); indexStream.Dispose(); rTreeStream.Dispose(); }
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 RTreeMemoryIndexAddTests() { // build test-data. var testDataList = new List <KeyValuePair <BoxF2D, DataTestClass> >(); 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)); 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 < 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)); 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)); } } }
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 RTreeStreamSerializeIndexAddTests() { // build test-data. var testDataList = new List <KeyValuePair <BoxF2D, string> >(); 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)); 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 < 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)); 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)); } } }
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")); }
/// <summary> /// Serializes all children of the given node. /// </summary> /// <param name="typeModel"></param> /// <param name="nodeBase"></param> /// <returns></returns> private Stream Serialize(RuntimeTypeModel typeModel, RTreeMemoryIndex <T> .Node nodeBase) { var stream = _streamCache.CreateNew(); if (nodeBase.Children is List <RTreeMemoryIndex <T> .Node> ) { // the node is not a leaf. long position = 0; var node = (nodeBase as RTreeMemoryIndex <T> .Node); var childrenIndex = new ChildrenIndex(); childrenIndex.IsLeaf = new bool[nodeBase.Children.Count]; childrenIndex.MinX = new float[nodeBase.Children.Count]; childrenIndex.MinY = new float[nodeBase.Children.Count]; childrenIndex.MaxX = new float[nodeBase.Children.Count]; childrenIndex.MaxY = new float[nodeBase.Children.Count]; childrenIndex.Starts = new int[nodeBase.Children.Count]; var serializedChildren = new List <Stream>(); for (int idx = 0; idx < nodeBase.Children.Count; idx++) { var child = (node.Children[idx] as RTreeMemoryIndex <T> .Node); BoxF2D box = node.Boxes[idx]; childrenIndex.MinX[idx] = (float)box.Min[0]; childrenIndex.MinY[idx] = (float)box.Min[1]; childrenIndex.MaxX[idx] = (float)box.Max[0]; childrenIndex.MaxY[idx] = (float)box.Max[1]; childrenIndex.IsLeaf[idx] = ( child.Children is List <T>); Stream childSerialized = this.Serialize(typeModel, child); serializedChildren.Add(childSerialized); childrenIndex.Starts[idx] = (int)position; position = position + childSerialized.Length; } childrenIndex.End = (int)position; // serialize this index object. var indexStream = new MemoryStream(); typeModel.Serialize(indexStream, childrenIndex); byte[] indexBytes = indexStream.ToArray(); // START WRITING THE DATA TO THE TARGET STREAM HERE! // 1: write the type of data. byte[] leafFlag = new[] { (byte)0 }; stream.Write(leafFlag, 0, 1); // 2: Write the length of the meta data. byte[] indexLength = BitConverter.GetBytes(indexBytes.Length); stream.Write(indexLength, 0, indexLength.Length); // 3: write the meta data or the node-index. stream.Write(indexBytes, 0, indexBytes.Length); // 4: write the actual children. for (int idx = 0; idx < serializedChildren.Count; idx++) { serializedChildren[idx].Seek(0, SeekOrigin.Begin); serializedChildren[idx].CopyTo(stream); _streamCache.Dispose(serializedChildren[idx]); serializedChildren[idx] = null; } } else if (nodeBase.Children is List <T> ) { // the node is a leaf node. // START WRITING THE DATA TO THE TARGET STREAM HERE! // 1: write the type of data. byte[] leafFlag = new[] { (byte)1 }; stream.Write(leafFlag, 0, 1); // 2: write the leaf data. byte[] data = this.Serialize(typeModel, nodeBase.Children as List <T>, nodeBase.Boxes); stream.Write(data, 0, data.Length); } else { throw new Exception("Unknown node type!"); } return(stream); }
/// <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); }
/// <summary> /// Serializes the given index to the given stream. /// </summary> /// <param name="stream"></param> /// <param name="index"></param> protected abstract void DoSerialize(SpatialIndexSerializerStream stream, RTreeMemoryIndex <T> index);
private Stream Serialize(RuntimeTypeModel typeModel, RTreeMemoryIndex <T> .Node nodeBase) { Stream destination = this._streamCache.CreateNew(); if (nodeBase.Children is List <RTreeMemoryIndex <T> .Node> ) { long num = 0; RTreeMemoryIndex <T> .Node node = nodeBase; ChildrenIndex childrenIndex = new ChildrenIndex(); childrenIndex.IsLeaf = new bool[nodeBase.Children.Count]; childrenIndex.MinX = new float[nodeBase.Children.Count]; childrenIndex.MinY = new float[nodeBase.Children.Count]; childrenIndex.MaxX = new float[nodeBase.Children.Count]; childrenIndex.MaxY = new float[nodeBase.Children.Count]; childrenIndex.Starts = new int[nodeBase.Children.Count]; List <Stream> streamList = new List <Stream>(); for (int index = 0; index < nodeBase.Children.Count; ++index) { RTreeMemoryIndex <T> .Node child = node.Children[index] as RTreeMemoryIndex <T> .Node; BoxF2D box = node.Boxes[index]; childrenIndex.MinX[index] = (float)box.Min[0]; childrenIndex.MinY[index] = (float)box.Min[1]; childrenIndex.MaxX[index] = (float)box.Max[0]; childrenIndex.MaxY[index] = (float)box.Max[1]; childrenIndex.IsLeaf[index] = child.Children is List <T>; Stream stream = this.Serialize(typeModel, child); streamList.Add(stream); childrenIndex.Starts[index] = (int)num; num += stream.Length; } childrenIndex.End = (int)num; MemoryStream memoryStream = new MemoryStream(); ((TypeModel)typeModel).Serialize((Stream)memoryStream, (object)childrenIndex); byte[] array = memoryStream.ToArray(); byte[] buffer = new byte[1]; destination.Write(buffer, 0, 1); byte[] bytes = BitConverter.GetBytes(array.Length); destination.Write(bytes, 0, bytes.Length); destination.Write(array, 0, array.Length); for (int index = 0; index < streamList.Count; ++index) { streamList[index].Seek(0L, SeekOrigin.Begin); streamList[index].CopyTo(destination); this._streamCache.Dispose(streamList[index]); streamList[index] = (Stream)null; } } else { if (!(nodeBase.Children is List <T>)) { throw new Exception("Unknown node type!"); } byte[] buffer1 = new byte[1] { (byte)1 }; destination.Write(buffer1, 0, 1); byte[] buffer2 = this.Serialize(typeModel, nodeBase.Children as List <T>, nodeBase.Boxes); destination.Write(buffer2, 0, buffer2.Length); } return(destination); }