コード例 #1
0
        /// <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();
        }
コード例 #2
0
        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));
                }
            }
        }
コード例 #3
0
ファイル: SceneSerializer.cs プロジェクト: JoeCooper/ui
        /// <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);
        }
コード例 #4
0
        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()));
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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));
                }
            }
        }
コード例 #7
0
        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()));
        }
コード例 #8
0
        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));
                }
            }
        }
コード例 #9
0
        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"));
        }
コード例 #10
0
        /// <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);
        }
コード例 #11
0
        /// <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);
        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
 /// <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);
コード例 #14
0
        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);
        }