private IEnumerator RequestTerrainTile(string url, Vector3 tileId)
        {
            DownloadHandlerBuffer handler = new DownloadHandlerBuffer();
            TerrainTile           terrainTile;
            var www = new UnityWebRequest(url)
            {
                downloadHandler = handler
            };

            yield return(www.SendWebRequest());

            if (!www.isNetworkError && !www.isHttpError)
            {
                //get data
                var stream = new MemoryStream(www.downloadHandler.data);

                //parse into tile data structure
                terrainTile = TerrainTileParser.Parse(stream);

                //update tile with height data
                tileDb[tileId].GetComponent <MeshFilter>().sharedMesh = terrainTile.GetMesh(-44); //height offset is manually done to nicely align height data with place holder at 0
                tileDb[tileId].transform.localScale = new Vector3(ComputeScaleFactorX((int)tileId.z), 1, ComputeScaleFactorY((int)tileId.z));
            }
            else
            {
                Debug.Log("Tile: [" + tileId.x + " " + tileId.y + "] Error loading height data" + " url:  " + url);
            }

            pendingQueue.Remove(url);
        }
示例#2
0
        private IEnumerator requestQMTile(string url, Vector3 tileId)
        {
            DownloadHandlerBuffer handler = new DownloadHandlerBuffer();
            TerrainTile           terrainTile;
            UnityWebRequest       www = new UnityWebRequest(url);

            www.downloadHandler = handler;
            yield return(www.SendWebRequest());

            if (!www.isNetworkError && !www.isHttpError)
            {
                //get data
                MemoryStream stream = new MemoryStream(www.downloadHandler.data);

                //parse into tile data structure
                terrainTile = TerrainTileParser.Parse(stream);

                //update tile with height data
                tileDb[tileId].GetComponent <MeshFilter>().sharedMesh = terrainTile.GetMesh(-44); //height offset is manually done to nicely align height data with place holder at 0
                tileDb[tileId].transform.rotation   = Quaternion.Euler(new Vector3(180, 0, 0));
                tileDb[tileId].transform.localScale = new Vector3(ComputeScaleFactor((int)tileId.z), 1, ComputeScaleFactor((int)tileId.z) * 2);
            }
            else
            {
                UnityEngine.Debug.LogError("Tile: [" + tileId.x + " " + tileId.y + "] Error loading height data");
            }

            pendingQueue.Remove(url);
            processedTileDebugCounter++;

            if (pendingQueue.Count == 0)
            {
                UnityEngine.Debug.Log("finished: with max queue size " + maxParallelRequests + ". Time: " + sw.Elapsed.TotalMilliseconds + " miliseconds. Total requests: " + processedTileDebugCounter);
            }
        }
示例#3
0
 private void btnView_Click(object sender, EventArgs e)
 {
     listBox1.Items.Clear();
     if (txtView.Text != String.Empty)
     {
         // reader terrain from disk
         if (chkGzip.Checked)
         {
             FileInfo myFile     = new FileInfo(txtView.Text);
             var      tileStream = Decompress(myFile);
             tileStream.Position = 0;
             var     terrainTile = TerrainTileParser.Parse(tileStream);
             Vector3 vECEF       = new Vector3(terrainTile.Header.CenterX, terrainTile.Header.CenterY, terrainTile.Header.CenterZ);
             var     v3          = Coord.ecef_to_geo(vECEF);
             ToDisplay($"Tile Center XY ({MapUtil.Rad2Deg(v3.X)} , {MapUtil.Rad2Deg(v3.Y)} ,{v3.Z})");
             DisplayTile(terrainTile);
         }
         else
         {
             using (FileStream fileToDecompressAsStream = new FileStream(txtView.Text, FileMode.Open, FileAccess.Read))
             {
                 byte[] bytesDisk = new byte[fileToDecompressAsStream.Length];
                 fileToDecompressAsStream.Read(bytesDisk, 0, (int)fileToDecompressAsStream.Length);
                 var     tileStream  = new MemoryStream(bytesDisk);
                 var     terrainTile = TerrainTileParser.Parse(tileStream);
                 Vector3 vECEF       = new Vector3(terrainTile.Header.CenterX, terrainTile.Header.CenterY, terrainTile.Header.CenterZ);
                 var     v3          = Coord.ecef_to_geo(vECEF);
                 ToDisplay($"Tile Center XY ({MapUtil.Rad2Deg(v3.X)} , {MapUtil.Rad2Deg(v3.Y)} ,{v3.Z})");
                 DisplayTile(terrainTile);
             }
         }
     }
 }
        public void TestFirstTileParsing()
        {
            // arrange
            const string firstTerrainFile = "Terrain.Tiles.Tests.data.9_533_383.terrain";

            // act
            var pbfStream   = Assembly.GetExecutingAssembly().GetManifestResourceStream(firstTerrainFile);
            var terrainTile = TerrainTileParser.Parse(pbfStream);

            // assert
            Assert.IsTrue(terrainTile != null);

            // check headers
            Assert.IsTrue(terrainTile.Header.CenterX == 4492197.38443436);
            Assert.IsTrue(terrainTile.Header.CenterY == 596134.0874495716);
            Assert.IsTrue(terrainTile.Header.CenterZ == 4473851.280340988);
            Assert.IsTrue(terrainTile.Header.MinimumHeight == 206.3408660888672);
            Assert.IsTrue(terrainTile.Header.MaximumHeight == 787.9429931640625);
            Assert.IsTrue(terrainTile.Header.BoundingSphereCenterX == 4492197.38443436);
            Assert.IsTrue(terrainTile.Header.BoundingSphereCenterY == 596134.0874495716);
            Assert.IsTrue(terrainTile.Header.BoundingSphereCenterZ == 4473851.280340988);
            Assert.IsTrue(terrainTile.Header.BoundingSphereRadius == 24100.511082898243);
            Assert.IsTrue(terrainTile.Header.HorizonOcclusionPointX == 0.5);
            Assert.IsTrue(terrainTile.Header.HorizonOcclusionPointY == 0.5);
            Assert.IsTrue(terrainTile.Header.HorizonOcclusionPointZ == 0.5);

            // check vertexdata
            Assert.IsTrue(terrainTile.VertexData.vertexCount == 103);
            Assert.IsTrue(terrainTile.VertexData.u[0] == 21075);
            Assert.IsTrue(terrainTile.VertexData.v[0] == 26684);
            Assert.IsTrue(terrainTile.VertexData.height[0] == 543);

            // check IndexData
            Assert.IsTrue(terrainTile.IndexData16.triangleCount == 127);
            Assert.IsTrue(terrainTile.IndexData16.indices.Length == 381);
            Assert.IsTrue(terrainTile.IndexData16.indices[0] == 0);
            Assert.IsTrue(terrainTile.IndexData16.indices[terrainTile.IndexData16.indices.Length - 1] == 100);
            Assert.IsTrue(terrainTile.IndexData16.indices.Length / 3 == terrainTile.IndexData16.triangleCount);

            // check EdgeIndices16
            Assert.IsTrue(terrainTile.EdgeIndices16.eastIndices.Length == 10);
            Assert.IsTrue(terrainTile.EdgeIndices16.eastIndices[0] == 13);
            Assert.IsTrue(terrainTile.EdgeIndices16.eastIndices[9] == 102);
            Assert.IsTrue(terrainTile.EdgeIndices16.westIndices.Length == 30);
            Assert.IsTrue(terrainTile.EdgeIndices16.westIndices[0] == 19);
            Assert.IsTrue(terrainTile.EdgeIndices16.westIndices[29] == 96);
            Assert.IsTrue(terrainTile.EdgeIndices16.northIndices.Length == 25);
            Assert.IsTrue(terrainTile.EdgeIndices16.northIndices[0] == 1);
            Assert.IsTrue(terrainTile.EdgeIndices16.northIndices[24] == 102);
            Assert.IsTrue(terrainTile.EdgeIndices16.southIndices.Length == 14);
            Assert.IsTrue(terrainTile.EdgeIndices16.southIndices[0] == 47);
            Assert.IsTrue(terrainTile.EdgeIndices16.southIndices[13] == 85);
        }
        public void TestTomTileParsing()
        {
            // arrange
            const string firstTerrainFile = "Terrain.Tiles.Tests.data.86.terrain";

            // act
            var pbfStream   = Assembly.GetExecutingAssembly().GetManifestResourceStream(firstTerrainFile);
            var terrainTile = TerrainTileParser.Parse(pbfStream);

            // assert
            Assert.IsTrue(terrainTile != null);
            Assert.IsTrue(terrainTile.VertexData.vertexCount > 0);
        }
        public void TestAnotherTileParsing1()
        {
            // arrange
            const string firstTerrainFile = "Terrain.Tiles.Tests.data.test_0_0_0.terrain";

            // act
            var pbfStream   = Assembly.GetExecutingAssembly().GetManifestResourceStream(firstTerrainFile);
            var terrainTile = TerrainTileParser.Parse(pbfStream);

            Assert.IsTrue(terrainTile != null);

            // todo: check extensions
        }
示例#7
0
        static void Main(string[] args)
        {
            const string terrainTileUrl = @"https://maps.tilehosting.com/data/terrain-quantized-mesh/9/536/391.terrain?key=wYrAjVu6bV6ycoXliAPl";

            var client = new HttpClient();
            var bytes  = client.GetByteArrayAsync(terrainTileUrl).Result;
            var stream = new MemoryStream(bytes);

            var terrainTile = TerrainTileParser.Parse(stream);

            Console.WriteLine("Number of vertices: " + terrainTile.VertexData.vertexCount);
            Console.ReadLine();
            Console.WriteLine("Press any key to continue...");
        }
        public void GetTomTileFromWeb()
        {
            // arrange
            var url    = "https://saturnus.geodan.nl/tomt/data/tiles/15/33823/26068.terrain?v=1.0.0";
            var client = new HttpClient();
            var bytes  = client.GetByteArrayAsync(url).Result;
            var stream = new MemoryStream(bytes);

            // act
            var terrainTile = TerrainTileParser.Parse(stream);

            // assert
            Assert.IsTrue(terrainTile.VertexData.vertexCount > 0);
        }
        public void TestSampleTerrainTileParsing()
        {
            // arrange
            const string terrainTileUrl = "https://maps.tilehosting.com/data/terrain-quantized-mesh/9/536/391.terrain?key=wYrAjVu6bV6ycoXliAPl";

            var client = new HttpClient();
            var bytes  = client.GetByteArrayAsync(terrainTileUrl).Result;
            var stream = new MemoryStream(bytes);

            // act
            var terrainTile = TerrainTileParser.Parse(stream);

            // assert
            Assert.IsTrue(terrainTile != null);
            Assert.IsTrue(terrainTile.VertexData.vertexCount > 0);
        }
        public void TestWatermarkTileParsing()
        {
            // arrange
            const string firstTerrainFile = "Terrain.Tiles.Tests.data.9_769_319_watermask.terrain";

            // act
            var pbfStream   = Assembly.GetExecutingAssembly().GetManifestResourceStream(firstTerrainFile);
            var terrainTile = TerrainTileParser.Parse(pbfStream);

            Assert.IsTrue(terrainTile != null);

            // todo: check extensions
            //Assert.IsTrue(qmt.NormalExtensionData.vertexCount == 4);
            //Assert.IsTrue(qmt.NormalExtensionData.xy.Length == 8);
            //Assert.IsTrue(qmt.NormalExtensionData.xy[0] == 0);
            //Assert.IsTrue(qmt.NormalExtensionData.xy[7] == 203);
        }
示例#11
0
        private void btnURLView_Click(object sender, EventArgs e)
        {
            var client = new HttpClient();
            var bytes  = client.GetByteArrayAsync(txtURL.Text).Result;
            var stream = new MemoryStream(bytes);

            // save to disk
            using (FileStream file = new FileStream("c:\\temp\\url.terrain", FileMode.Create, FileAccess.Write))
            {
                stream.WriteTo(file);
            }

            FileInfo myFile     = new FileInfo("c:\\temp\\url.terrain");
            var      tileStream = Decompress(myFile);

            tileStream.Position = 0;
            var     terrainTile = TerrainTileParser.Parse(tileStream);
            Vector3 vECEF       = new Vector3(terrainTile.Header.CenterX, terrainTile.Header.CenterY, terrainTile.Header.CenterZ);
            var     v3          = Coord.ecef_to_geo(vECEF);

            ToDisplay($"Tile Center XY ({MapUtil.Rad2Deg(v3.X)} , {MapUtil.Rad2Deg(v3.Y)} ,{v3.Z})");
            DisplayTile(terrainTile);
        }
示例#12
0
    private IEnumerator requestQMTile(int x, int y, int z, Vector2 location, Vector2 tilescale, Vector2 TileOriginWGS84, Vector2 TileSizeWGS)
    {
        string url = $"https://saturnus.geodan.nl/tomt/data/tiles/{z}/{x}/{y}.terrain?v=1.0.0";

        DownloadHandlerBuffer handler = new DownloadHandlerBuffer();
        TerrainTile           terrainTile;
        UnityWebRequest       http = new UnityWebRequest(url);

        http.downloadHandler = handler;
        yield return(http.SendWebRequest());

        if (!http.isNetworkError)
        {
            //get data
            MemoryStream stream = new MemoryStream(http.downloadHandler.data);

            //parse into tile data structure
            terrainTile = TerrainTileParser.Parse(stream);

            //create unity tile with tile data structure

            tile = new GameObject("tile x:" + x + " y:" + y + " z:" + z);
            tile.transform.parent = maaiveldgroep.transform;
            tile.AddComponent <MeshFilter>().mesh = terrainTile.GetMesh();
            tile.AddComponent <MeshCollider>();
            //scale
            tile.transform.localScale = new Vector3(-1 * tilescale.x / 2, -1, -1 * tilescale.y);

            tile.transform.position = new Vector3((location.x), 0, (location.y));
            StartCoroutine(requestWMSTile(location.x, location.y, tile, TileOriginWGS84, TileSizeWGS));
        }
        else
        {
            Debug.Log("Error loading tile");
        }
    }
        public TerrainTile ParseVectorTileFromStream()
        {
            var stream = File.OpenRead(@"data/9_533_383.terrain");

            return(TerrainTileParser.Parse(stream));
        }
示例#14
0
        static void Main(string[] args)
        {
            // input tile
            var    x              = 1066;
            var    y              = 776;
            var    level          = 10;
            string terrainTileUrl = $"https://maps.tilehosting.com/data/terrain-quantized-mesh/{level}/{x}/{y}.terrain?key=rmDrA8qf6zp3pasxyYRn";

            var client      = new HttpClient();
            var bytes       = client.GetByteArrayAsync(terrainTileUrl).Result;
            var stream      = new MemoryStream(bytes);
            var terrainTile = TerrainTileParser.Parse(stream);

            var bounds = GlobalGeodetic.GlobalGeodetic.TileBounds(x, y, level);
            //var minimumHeight = terrainTile.Header.MinimumHeight; // 934
            //var maximumHeight = terrainTile.Header.MaximumHeight; //3167
            //var triangleCount = terrainTile.IndexData16.triangleCount; // 2873
            //var vertexCount = terrainTile.VertexData.vertexCount; // 959

            var vertices = new List <Wkx.Point>();

            for (var n = 0; n < terrainTile.VertexData.vertexCount; n++)
            {
                var u  = terrainTile.VertexData.u[n];      //32767
                var v  = terrainTile.VertexData.v[n];      // 0
                var h  = terrainTile.VertexData.height[n]; //26707
                var x1 = Mathf.Lerp(bounds[0], bounds[2], (double)(u) / MAX);
                var y1 = Mathf.Lerp(bounds[1], bounds[3], (double)(v) / MAX);
                var h1 = Mathf.Lerp(terrainTile.Header.MinimumHeight, terrainTile.Header.MaximumHeight, (double)h / MAX); //2754
                var p  = new Wkx.Point(x1, y1, h1);
                vertices.Add(p);
            }

            var triangles = new List <Triangle>();

            for (var i = 0; i < terrainTile.IndexData16.indices.Length; i += 3)
            {
                var firstIndex  = terrainTile.IndexData16.indices[i];
                var secondIndex = terrainTile.IndexData16.indices[i + 1];
                var thirdIndex  = terrainTile.IndexData16.indices[i + 2];

                var p0 = vertices[firstIndex];
                var p1 = vertices[secondIndex];
                var p2 = vertices[thirdIndex];

                var t = new Triangle(p0, p1, p2);
                triangles.Add(t);
            }

            var features = new List <Feature>();

            foreach (var t in triangles)
            {
                features.Add(GetFeature(t));
            }

            var    fc   = new FeatureCollection(features);
            string json = JsonConvert.SerializeObject(fc);

            File.WriteAllText("triangles.geojson", json);
        }
    private IEnumerator requestTile(int x, int y, int z)
    {
        // todo: must be z/x/y in request, two top tiles are 0/0/0 (z/x/y) and 0/1/0 (z/y/y)
        string url = $"http://assets.agi.com/stk-terrain/v1/tilesets/world/tiles/{x}/{y}/{z}.terrain";

        DownloadHandlerBuffer handler = new DownloadHandlerBuffer();
        TerrainTile           terrainTile;
        UnityWebRequest       http = new UnityWebRequest(url);

        http.downloadHandler = handler;
        yield return(http.Send());

        if (!http.isError)
        {
            //get data
            MemoryStream stream = new MemoryStream(http.downloadHandler.data);

            //unzip
            var deflateStream = new GZipStream(stream, CompressionMode.Decompress);

            //parse into tile
            terrainTile = TerrainTileParser.Parse(deflateStream);

            //create tile
            var tile = new GameObject("tile x:" + x + " y:" + y + " z:" + z);
            tile.AddComponent <MeshFilter>().mesh = terrainTile.GetMesh(x, y, z);


            if (y == 0)
            {
                tile.AddComponent <MeshRenderer>().material = mat1;
            }
            else
            {
                tile.AddComponent <MeshRenderer>().material = mat2;
            }


            tile.transform.localScale = new Vector3(0.5f, -0.003f, 1);
            tile.transform.position   = new Vector3(x - (y * 180), 0, 0);
            tiles.Add(tile);

            ////create vertices (if needed)
            //if (showVertices)
            //{
            //    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
            //    Mesh cubeMesh = cube.GetComponent<MeshFilter>().mesh;
            //    cube.SetActive(false);

            //    var vert = tile.GetComponent<MeshFilter>().mesh.vertices;

            //    for (int i = 0; i < vert.Length; i++)
            //    {
            //        GameObject computePoint = new GameObject(name) { hideFlags = HideFlags.HideInHierarchy };
            //        computePoint.transform.parent = tile.transform;
            //        computePoint.transform.position = new Vector3(vert[i].x, vert[i].y, vert[i].z);
            //        computePoint.AddComponent<MeshFilter>().mesh = cubeMesh;
            //        computePoint.AddComponent<MeshRenderer>().material = mat2;
            //        computePoint.AddComponent<MeshCollider>();
            //    }
            //}
        }
        else
        {
            Debug.Log("Error loading tile");
        }
    }