Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
 }