public void MakePolyHedralTest()
        {
            var bs = new BuildingStyle()
            {
                FloorColor = "#D3D3D3", RoofColor = "#ff0000", WallsColor = "#00ff00"
            };
            var res = TesselateBuilding.MakePolyHedral(footprint, 0, height, bs);
            var wkt = res.polyhedral.SerializeString <WktSerializer>();

            Assert.IsTrue(wkt != null);
        }
        public void TestId12()
        {
            var wktFootprint = "POLYGON((-75.554412769 39.1634003080001, -75.554480102 39.163362636, -75.554508552 39.1633934610001, -75.554552455 39.163368898, -75.554609356 39.1634305470001, -75.554505101 39.163488876, -75.554412769 39.1634003080001))";

            footprint = (Polygon)Geometry.Deserialize <WktSerializer>(wktFootprint);
            var height = 9.92000000000;
            var bs     = new BuildingStyle()
            {
                FloorColor = "#D3D3D3", RoofColor = "#ff0000", WallsColor = "#00ff00"
            };

            var res = TesselateBuilding.MakePolyHedral(footprint, 0, height, bs);

            Assert.IsTrue(res.polyhedral.Geometries.Count == 20);
            Assert.IsTrue(res.colors.Count == 20);
        }
Пример #3
0
        static void Main(string[] args)
        {
            var version = Assembly.GetEntryAssembly().GetName().Version;

            Console.WriteLine($"Tool: Tesselate buildings {version}");
            var stopWatch = new Stopwatch();

            stopWatch.Start();

            Parser.Default.ParseArguments <Options>(args).WithParsed(o =>
            {
                o.User     = string.IsNullOrEmpty(o.User) ? Environment.UserName : o.User;
                o.Database = string.IsNullOrEmpty(o.Database) ? Environment.UserName : o.Database;

                var connectionString = $"Host={o.Host};Username={o.User};Database={o.Database};Port={o.Port}";

                var istrusted = TrustedConnectionChecker.HasTrustedConnection(connectionString);

                if (!istrusted)
                {
                    Console.Write($"Password for user {o.User}: ");
                    password          = PasswordAsker.GetPassword();
                    connectionString += $";password={password}";
                    Console.WriteLine();
                }
                var conn = new NpgsqlConnection(connectionString);
                SqlMapper.AddTypeHandler(new GeometryTypeHandler());
                conn.Open();


                var select = $"select ST_AsBinary({o.InputGeometryColumn}) as geometry, {o.HeightColumn} as height, style, {o.IdColumn} as id";
                var sql    = $"{select} from {o.Table}";

                var buildings = conn.Query <Building>(sql);

                var i = 1;
                foreach (var building in buildings)
                {
                    var polygon      = (Polygon)building.Geometry;
                    var wktFootprint = polygon.SerializeString <WktSerializer>();
                    var height       = building.Height;
                    var points       = polygon.ExteriorRing.Points;

                    var buildingZ = 0; //put everything on the ground
                    var res       = TesselateBuilding.MakePolyHedral(polygon, buildingZ, height, building.BuildingStyle);
                    var wkt       = res.polyhedral.SerializeString <WktSerializer>();

                    var colors    = "{" + string.Join(',', res.colors) + "}";
                    var updateSql = $"update {o.Table} set {o.OutputGeometryColumn} = ST_Force3D(St_SetSrid(ST_GeomFromText('{wkt}'), 3857)) " +
                                    $", {o.ColorsColumn} = '{colors}' where {o.IdColumn}={building.Id}";
                    conn.Execute(updateSql);
                    var perc = Math.Round((double)i / buildings.AsList().Count * 100, 2);
                    Console.Write($"\rProgress: {perc.ToString("F")}%");
                    i++;
                }

                conn.Close();

                stopWatch.Stop();
                Console.WriteLine();
                Console.WriteLine($"Elapsed: {stopWatch.ElapsedMilliseconds / 1000} seconds");
                Console.WriteLine("Program finished.");
            });
        }