comparison cmd/tin2octree/main.go @ 664:a3d722e1f593 octree

octree: Load point cloud data projected in a suited UTM zone.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 18 Sep 2018 13:41:04 +0200
parents af1d4d44a88a
children 5fa2eaffac84
comparison
equal deleted inserted replaced
662:d856e458dd64 664:a3d722e1f593
4 "bufio" 4 "bufio"
5 "database/sql" 5 "database/sql"
6 "flag" 6 "flag"
7 "io" 7 "io"
8 "log" 8 "log"
9 "math"
9 "os" 10 "os"
10 "time" 11 "time"
11 12
12 "github.com/golang/snappy" 13 "github.com/golang/snappy"
13 "github.com/jackc/pgx" 14 "github.com/jackc/pgx"
17 var ( 18 var (
18 bottleneck = flag.String("bottleneck", "", "bottleneck id") 19 bottleneck = flag.String("bottleneck", "", "bottleneck id")
19 date = flag.String("date", "", "date info") 20 date = flag.String("date", "", "date info")
20 file = flag.String("file", "", "save to file") 21 file = flag.String("file", "", "save to file")
21 22
22 snap = flag.Bool("snappy", false, "use snappy compression") 23 utm = flag.Bool("utm", false, "fetch in matchin UTM zone")
24 snap = flag.Bool("snappy", false, "use snappy compression")
25
23 dbhost = flag.String("dbhost", "localhost", "database host") 26 dbhost = flag.String("dbhost", "localhost", "database host")
24 dbport = flag.Uint("dbport", 5432, "database port") 27 dbport = flag.Uint("dbport", 5432, "database port")
25 dbname = flag.String("dbname", "gemma", "database user") 28 dbname = flag.String("dbname", "gemma", "database user")
26 dbuser = flag.String("dbuser", "scott", "database user") 29 dbuser = flag.String("dbuser", "scott", "database user")
27 dbpassword = flag.String("dbpw", "tiger", "database password") 30 dbpassword = flag.String("dbpw", "tiger", "database password")
47 defer db.Close() 50 defer db.Close()
48 51
49 return fn(db) 52 return fn(db)
50 } 53 }
51 54
52 const tinSQL = ` 55 const (
56 tinSQL = `
53 SELECT ST_AsBinary(ST_DelaunayTriangles(point_cloud::geometry, 0, 2)) 57 SELECT ST_AsBinary(ST_DelaunayTriangles(point_cloud::geometry, 0, 2))
54 FROM waterway.sounding_results 58 FROM waterway.sounding_results
55 WHERE bottleneck_id = $1 AND date_info = $2 59 WHERE bottleneck_id = $1 AND date_info = $2
56 ` 60 `
61 tinUTMSQL = `
62 SELECT ST_AsBinary(
63 ST_DelaunayTriangles(
64 ST_Transform(point_cloud::geometry, $3::int), 0, 2))
65 FROM waterway.sounding_results
66 WHERE bottleneck_id = $1 AND date_info = $2
67 `
68 centroidSQL = `
69 SELECT ST_X(ST_Centroid(point_cloud::geometry)), ST_Y(ST_Centroid(point_cloud::geometry))
70 FROM waterway.sounding_results
71 WHERE bottleneck_id = $1 AND date_info = $2
72 `
73 )
74
75 func utmZone(x, y float64) int {
76 var pref int
77 if y > 0 {
78 pref = 32600
79 } else {
80 pref = 32700
81 }
82 zone := int(math.Floor((x+180)/6)) + 1
83 return zone + pref
84 }
57 85
58 func main() { 86 func main() {
59 flag.Parse() 87 flag.Parse()
60 88
61 if *bottleneck == "" || *date == "" { 89 if *bottleneck == "" || *date == "" {
68 } 96 }
69 97
70 var t tin 98 var t tin
71 99
72 if err := run(func(db *sql.DB) error { 100 if err := run(func(db *sql.DB) error {
101 var utmZ int
102
103 if *utm {
104 var cx, cy float64
105 err := db.QueryRow(centroidSQL, *bottleneck, dateInfo).Scan(&cx, &cy)
106 switch {
107 case err == sql.ErrNoRows:
108 return nil
109 case err != nil:
110 return err
111 }
112 log.Printf("lat/lon: [%f, %f]\n", cx, cy)
113 utmZ = utmZone(cx, cy)
114 log.Printf("UTM zone: %d\n", utmZ)
115 }
116
73 start := time.Now() 117 start := time.Now()
74 err := db.QueryRow(tinSQL, *bottleneck, dateInfo).Scan(&t) 118 var err error
119 if *utm {
120 err = db.QueryRow(tinUTMSQL, *bottleneck, dateInfo, utmZ).Scan(&t)
121 } else {
122 err = db.QueryRow(tinSQL, *bottleneck, dateInfo).Scan(&t)
123 }
75 switch { 124 switch {
76 case err == sql.ErrNoRows: 125 case err == sql.ErrNoRows:
77 return nil 126 return nil
78 case err != nil: 127 case err != nil:
79 return err 128 return err
80 } 129 }
81 log.Printf("query took: %s\n", time.Since(start)) 130 log.Printf("query took: %s\n", time.Since(start))
131
132 if *utm {
133 t.epsg = uint32(utmZ)
134 }
135
82 return nil 136 return nil
83 }); err != nil { 137 }); err != nil {
84 log.Fatalf("error: %v\n", err) 138 log.Fatalf("error: %v\n", err)
85 } 139 }
86 140