Mercurial > gemma
comparison cmd/octree2contour/store.go @ 727:41c8dc61f38f
Moved octree loading stuff to octree package.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Sat, 22 Sep 2018 21:57:30 +0200 |
parents | 5af9ab39e715 |
children | 39b5cf9a6b8f |
comparison
equal
deleted
inserted
replaced
726:5af9ab39e715 | 727:41c8dc61f38f |
---|---|
1 package main | 1 package main |
2 | 2 |
3 import ( | 3 import ( |
4 "bytes" | |
5 "database/sql" | 4 "database/sql" |
6 "encoding/binary" | |
7 "math" | |
8 ) | |
9 | 5 |
10 const ( | 6 "gemma.intevation.de/gemma/pkg/octree" |
11 wkbNDR byte = 1 | |
12 wkbPointZ uint32 = 1000 + 1 | |
13 wkbLineStringZ uint32 = 1000 + 2 | |
14 wkbMultiLineStringZ uint32 = 1000 + 5 | |
15 ) | 7 ) |
16 | 8 |
17 type result struct { | 9 type result struct { |
18 h float64 | 10 h float64 |
19 lines MultiLineStringZ | 11 lines octree.MultiLineStringZ |
20 } | 12 } |
21 | 13 |
22 const insertSQL = ` | 14 const insertSQL = ` |
23 INSERT INTO waterway.contour_lines (height, geom) | 15 INSERT INTO waterway.contour_lines (height, geom) |
24 VALUES ($1, ST_Transform( | 16 VALUES ($1, ST_Transform( |
39 if err != nil { | 31 if err != nil { |
40 return err | 32 return err |
41 } | 33 } |
42 | 34 |
43 for _, r := range all { | 35 for _, r := range all { |
44 if _, err := stmt.Exec(r.h, r.lines.asWKB(), epsg); err != nil { | 36 if _, err := stmt.Exec(r.h, r.lines.AsWKB(), epsg); err != nil { |
45 return err | 37 return err |
46 } | 38 } |
47 } | 39 } |
48 | 40 |
49 return tx.Commit() | 41 return tx.Commit() |
50 }) | 42 }) |
51 } | 43 } |
52 | |
53 func (mls MultiLineStringZ) asWKB() []byte { | |
54 | |
55 var buf bytes.Buffer | |
56 | |
57 binary.Write(&buf, binary.LittleEndian, wkbNDR) | |
58 binary.Write(&buf, binary.LittleEndian, wkbMultiLineStringZ) | |
59 binary.Write(&buf, binary.LittleEndian, uint32(len(mls))) | |
60 | |
61 for _, ml := range mls { | |
62 binary.Write(&buf, binary.LittleEndian, wkbNDR) | |
63 binary.Write(&buf, binary.LittleEndian, wkbLineStringZ) | |
64 binary.Write(&buf, binary.LittleEndian, uint32(len(ml))) | |
65 for _, p := range ml { | |
66 binary.Write(&buf, binary.LittleEndian, math.Float64bits(p.x)) | |
67 binary.Write(&buf, binary.LittleEndian, math.Float64bits(p.y)) | |
68 binary.Write(&buf, binary.LittleEndian, math.Float64bits(p.z)) | |
69 } | |
70 } | |
71 | |
72 return buf.Bytes() | |
73 } |