Mercurial > gemma
annotate cmd/tin2octree/main.go @ 742:fb9faf2c4f60
Clip contour lines against bounding area of sounding result.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 24 Sep 2018 13:14:49 +0200 |
parents | aeaa2adf5a8b |
children | a4fe07a21ba7 |
rev | line source |
---|---|
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 package main |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 import ( |
720
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
4 "bytes" |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
5 "crypto/sha1" |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 "database/sql" |
720
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
7 "encoding/base64" |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 "flag" |
720
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
9 "fmt" |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
10 "io" |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 "log" |
664
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
12 "math" |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 "os" |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 "time" |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
16 "github.com/golang/snappy" |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 "github.com/jackc/pgx" |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
18 "github.com/jackc/pgx/stdlib" |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
19 ) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
20 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
21 var ( |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
22 bottleneck = flag.String("bottleneck", "", "bottleneck id") |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
23 date = flag.String("date", "", "date info") |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
24 file = flag.String("file", "", "save to file") |
720
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
25 insert = flag.Bool("insert", false, "write as SQL insert statement") |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
26 utm = flag.Bool("utm", true, "fetch in matchin UTM zone") |
664
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
27 |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
28 dbhost = flag.String("dbhost", "localhost", "database host") |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
29 dbport = flag.Uint("dbport", 5432, "database port") |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 dbname = flag.String("dbname", "gemma", "database user") |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
31 dbuser = flag.String("dbuser", "scott", "database user") |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
32 dbpassword = flag.String("dbpw", "tiger", "database password") |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
33 dbssl = flag.String("dbssl", "prefer", "database SSL mode") |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
34 ) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
35 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
36 func run(fn func(*sql.DB) error) error { |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
37 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
38 // To ease SSL config ride a bit on parsing. |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
39 cc, err := pgx.ParseConnectionString("sslmode=" + *dbssl) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
40 if err != nil { |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
41 return err |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
42 } |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
43 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 // Do the rest manually to allow whitespace in user/password. |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 cc.Host = *dbhost |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
46 cc.Port = uint16(*dbport) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
47 cc.User = *dbuser |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
48 cc.Password = *dbpassword |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
49 cc.Database = *dbname |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
50 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
51 db := stdlib.OpenDB(cc) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
52 defer db.Close() |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
53 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
54 return fn(db) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
55 } |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
56 |
664
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
57 const ( |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
58 tinSQL = ` |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 SELECT ST_AsBinary(ST_DelaunayTriangles(point_cloud::geometry, 0, 2)) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
60 FROM waterway.sounding_results |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
61 WHERE bottleneck_id = $1 AND date_info = $2 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
62 ` |
664
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
63 tinUTMSQL = ` |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
64 SELECT ST_AsBinary( |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
65 ST_DelaunayTriangles( |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
66 ST_Transform(point_cloud::geometry, $3::int), 0, 2)) |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
67 FROM waterway.sounding_results |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
68 WHERE bottleneck_id = $1 AND date_info = $2 |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
69 ` |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
70 centroidSQL = ` |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
71 SELECT ST_X(ST_Centroid(point_cloud::geometry)), ST_Y(ST_Centroid(point_cloud::geometry)) |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
72 FROM waterway.sounding_results |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
73 WHERE bottleneck_id = $1 AND date_info = $2 |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
74 ` |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
75 ) |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
76 |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
77 func utmZone(x, y float64) int { |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
78 var pref int |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
79 if y > 0 { |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
80 pref = 32600 |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
81 } else { |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
82 pref = 32700 |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
83 } |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
84 zone := int(math.Floor((x+180)/6)) + 1 |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
85 return zone + pref |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
86 } |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
87 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
88 func main() { |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
89 flag.Parse() |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
90 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
91 if *bottleneck == "" || *date == "" { |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
92 log.Fatalln("missing bottleneck or date option.") |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
93 } |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
94 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
95 dateInfo, err := time.Parse("2006-01-02", *date) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
96 if err != nil { |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
97 log.Fatalf("error: %v\n", err) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
98 } |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
99 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
100 var t tin |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
101 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
102 if err := run(func(db *sql.DB) error { |
664
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
103 var utmZ int |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
104 |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
105 if *utm { |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
106 var cx, cy float64 |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
107 err := db.QueryRow(centroidSQL, *bottleneck, dateInfo).Scan(&cx, &cy) |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
108 switch { |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
109 case err == sql.ErrNoRows: |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
110 return nil |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
111 case err != nil: |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
112 return err |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
113 } |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
114 log.Printf("lat/lon: [%f, %f]\n", cx, cy) |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
115 utmZ = utmZone(cx, cy) |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
116 log.Printf("UTM zone: %d\n", utmZ) |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
117 } |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
118 |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
119 start := time.Now() |
664
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
120 var err error |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
121 if *utm { |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
122 err = db.QueryRow(tinUTMSQL, *bottleneck, dateInfo, utmZ).Scan(&t) |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
123 } else { |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
124 err = db.QueryRow(tinSQL, *bottleneck, dateInfo).Scan(&t) |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
125 } |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
126 switch { |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
127 case err == sql.ErrNoRows: |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
128 return nil |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
129 case err != nil: |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
130 return err |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
131 } |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
132 log.Printf("query took: %s\n", time.Since(start)) |
664
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
133 |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
134 if *utm { |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
135 t.epsg = uint32(utmZ) |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
136 } |
a3d722e1f593
octree: Load point cloud data projected in a suited UTM zone.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
661
diff
changeset
|
137 |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
138 return nil |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
139 }); err != nil { |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
140 log.Fatalf("error: %v\n", err) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
141 } |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
142 |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
143 tb := &treeBuilder{t: &t} |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
144 tb.build() |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
145 |
720
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
146 if *insert { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
147 var w io.Writer |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
148 var f *os.File |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
149 |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
150 if *file != "" { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
151 if f, err = os.Create(*file); err != nil { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
152 log.Fatalf("error: %v\n", err) |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
153 } |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
154 w = f |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
155 } else { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
156 w = os.Stdout |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
157 } |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
158 |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
159 var buf bytes.Buffer |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
160 if err := write(&buf, tb); err != nil { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
161 log.Fatalf("error: %v\n", err) |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
162 } |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
163 data := buf.String() |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
164 h := sha1.New() |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
165 buf.WriteTo(h) |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
166 fmt.Fprintln(w, "BEGIN;") |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
167 fmt.Fprintln(w, "INSERT INTO waterway.octrees") |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
168 fmt.Fprintf(w, "SELECT sr.id, '%x',\n", h.Sum(nil)) |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
169 fmt.Fprint(w, "decode('") |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
170 fmt.Fprintf(w, "%s", base64.StdEncoding.EncodeToString([]byte(data))) |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
171 fmt.Fprintln(w, "', 'base64')") |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
172 fmt.Fprintln(w, "FROM waterway.sounding_results sr") |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
173 fmt.Fprintf(w, |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
174 "WHERE sr.bottleneck_id = '%s' AND sr.date_info = '%s'::date;\n", |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
175 *bottleneck, *date) |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
176 fmt.Fprintln(w, "END;") |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
177 |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
178 if f != nil { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
179 if err := f.Close(); err != nil { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
180 log.Fatalf("error: %v\n", err) |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
181 } |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
182 } |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
183 return |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
184 } |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
185 |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
186 if *file != "" { |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
187 f, err := os.Create(*file) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
188 if err != nil { |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
189 log.Printf("error: %v\n", err) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
190 } |
720
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
191 err = write(f, tb) |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
192 if err2 := f.Close(); err == nil { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
193 if err != nil { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
194 err = err2 |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
195 } |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
196 } |
720
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
197 if err != nil { |
661
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
198 log.Fatalf("error: %v\n", err) |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
199 } |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
200 } |
af1d4d44a88a
Experimental tin octree indexer.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
201 } |
720
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
202 |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
203 func write(w io.Writer, tb *treeBuilder) error { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
204 out := snappy.NewBufferedWriter(w) |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
205 if err := tb.t.Serialize(out); err != nil { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
206 return err |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
207 } |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
208 if err := tb.Serialize(out); err != nil { |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
209 return err |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
210 } |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
211 return out.Flush() |
aeaa2adf5a8b
octree: write SQL insert statements for octree indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
672
diff
changeset
|
212 } |