public BoundingBox3D GetBounds(double extent, int x, int y) { var from = new Wkx.Point(XMin + extent * x, YMin + extent * y); var to = new Wkx.Point(XMin + extent * (x + 1), YMin + extent * (y + 1)); var bb = new BoundingBox3D((float)from.X, (float)from.Y, 0, (float)to.X, (float)to.Y, 0); return(bb); }
public void CalculateNormal() { var p0 = new Wkx.Point(-4809.9107400178909, 1112.3783205118962, -692.219980129972); var p1 = new Wkx.Point(-4822.8970195085276, 1111.9907626458444, -688.55403241701413); var p2 = new Wkx.Point(-4821.631989160087, 1106.6135776401497, -684.35551724396635); var t = new Triangle(p0, p1, p2, 0); var expected = new Vector3(0.193098128f, 0.6316621f, 0.750810444f); var normal = t.GetNormal(); Assert.IsTrue(normal.Equals(expected)); }
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); }
public static Position ToGeoJsonPoint(this Wkx.Point p) { return(new Position((double)p.Y, (double)p.X, p.Z)); }