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); }
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); } }
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 }
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); }
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); }
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)); }
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"); } }