Mercurial > gemma
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 |