annotate cmd/tin2octree/main.go @ 720:aeaa2adf5a8b octree

octree: write SQL insert statements for octree indices.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 21 Sep 2018 17:36:00 +0200
parents 5fa2eaffac84
children a4fe07a21ba7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }