Mercurial > gemma
annotate cmd/octreediff/main.go @ 2496:12ed6feefea5 octree-diff
Use octree clipping. Not working, yet!
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 04 Mar 2019 13:32:32 +0100 |
parents | cb55d7eaaa36 |
children | e0a7571ac13a |
rev | line source |
---|---|
2465
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 // without warranty, see README.md and license for details. |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 // |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 // SPDX-License-Identifier: AGPL-3.0-or-later |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 // License-Filename: LICENSES/AGPL-3.0.txt |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 // |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 // Copyright (C) 2018 by via donau |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 // – Österreichische Wasserstraßen-Gesellschaft mbH |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 // Software engineering by Intevation GmbH |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 // |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 // Author(s): |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 package main |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
16 import ( |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 "context" |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
18 "database/sql" |
2468
27cc04bbda46
Bail out if the EPSG codes of the datasets don't match.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2467
diff
changeset
|
19 "errors" |
2465
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
20 "flag" |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
21 "fmt" |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
22 "log" |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
23 "runtime" |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
24 "sync" |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
25 "time" |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
26 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 "gemma.intevation.de/gemma/pkg/common" |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
28 "gemma.intevation.de/gemma/pkg/octree" |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
29 ) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
31 var ( |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
32 bottleneck = flag.String("bottleneck", "", "name of the bottleneck") |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
33 first = flag.String("first", "", "date of the first sounding result") |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
34 second = flag.String("second", "", "date of the second sounding result") |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
35 ) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
36 |
2479
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
37 const contourTolerance = 0.1 |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
38 |
2465
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
39 const ( |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
40 loadOctreeSQL = ` |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
41 SELECT sr.octree_index |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
42 FROM waterway.sounding_results sr JOIN waterway.bottlenecks bn |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
43 ON sr.bottleneck_id = bn.id |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 WHERE bn.bottleneck_id = $1 AND sr.date_info = $2::date |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 AND sr.octree_index IS NOT NULL` |
2473
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
46 |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
47 insertContourSQL = ` |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
48 INSERT INTO diff_contour_lines ( |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
49 height, |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
50 lines |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
51 ) |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
52 SELECT |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
53 $4, |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
54 ST_Transform( |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
55 ST_Multi( |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
56 ST_CollectionExtract( |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
57 ST_SimplifyPreserveTopology( |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
58 ST_Multi(ST_Collectionextract( |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
59 ST_MakeValid(ST_GeomFromWKB($1, $2::integer)), 2)), |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
60 $3 |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
61 ), |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
62 2 |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
63 ) |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
64 ), |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
65 4326 |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
66 ) |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
67 ` |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
68 clippingPolygonSQL = ` |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
69 WITH joined AS ( |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
70 SELECT |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
71 sr.area AS area, |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
72 sr.date_info AS date_info |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
73 FROM waterway.sounding_results sr JOIN |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
74 waterway.bottlenecks bn ON sr.bottleneck_id = bn.id |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
75 WHERE bn.bottleneck_id = $1 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
76 ) |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
77 SELECT ST_AsBinary( |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
78 ST_Buffer( |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
79 ST_intersection( |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
80 (SELECT ST_Transform(area::geometry, $2::int) FROM joined WHERE date_info = $3::date), |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
81 (SELECT ST_Transform(area::geometry, $2::int) FROM joined WHERE date_info = $4::date) |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
82 ), |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
83 0.001)) AS area |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
84 ` |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
85 insertContourSQLClipped = ` |
2479
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
86 WITH joined AS ( |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
87 SELECT |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
88 sr.area AS area, |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
89 sr.date_info AS date_info |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
90 FROM waterway.sounding_results sr JOIN |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
91 waterway.bottlenecks bn ON sr.bottleneck_id = bn.id |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
92 WHERE bn.bottleneck_id = $1 |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
93 ), |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
94 inter AS ( |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
95 SELECT |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
96 ST_Buffer( |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
97 ST_intersection( |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
98 (SELECT ST_Transform(area::geometry, $2::int) FROM joined WHERE date_info = $3::date), |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
99 (SELECT ST_Transform(area::geometry, $2::int) FROM joined WHERE date_info = $4::date) |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
100 ), |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
101 0.001) AS area |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
102 ) |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
103 INSERT INTO diff_contour_lines ( |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
104 height, |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
105 lines |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
106 ) |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
107 SELECT |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
108 $5, |
2479
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
109 ST_Transform( |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
110 ST_Multi( |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
111 ST_intersection( |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
112 ST_CollectionExtract( |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
113 ST_SimplifyPreserveTopology( |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
114 ST_Multi(ST_Collectionextract( |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
115 ST_MakeValid(ST_GeomFromWKB($6, $2::integer)), 2)), |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
116 $7 |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
117 ), |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
118 2 |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
119 ), |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
120 area |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
121 ) |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
122 ), |
2479
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
123 4326 |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
124 ) |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
125 FROM inter` |
2465
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
126 ) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
127 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
128 func check(err error) { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
129 if err != nil { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
130 log.Fatalf("error: %v\n", err) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
131 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
132 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
133 |
2470
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
134 type point struct { |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
135 x float64 |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
136 y float64 |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
137 } |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
138 |
2472
db0e4ab57977
Turn new point cloud into WKB form of MultiPointZ.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2470
diff
changeset
|
139 type pointMap map[point]float64 |
db0e4ab57977
Turn new point cloud into WKB form of MultiPointZ.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2470
diff
changeset
|
140 |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
141 func (pm pointMap) triangulate() (*octree.Triangulation, error) { |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
142 vertices := make([]octree.Vertex, len(pm)) |
2483
620038ade708
Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2480
diff
changeset
|
143 var i int |
620038ade708
Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2480
diff
changeset
|
144 for p, z := range pm { |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
145 vertices[i] = octree.Vertex{X: p.x, Y: p.y, Z: z} |
2483
620038ade708
Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2480
diff
changeset
|
146 i++ |
620038ade708
Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2480
diff
changeset
|
147 } |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
148 return octree.Triangulate(vertices) |
2472
db0e4ab57977
Turn new point cloud into WKB form of MultiPointZ.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2470
diff
changeset
|
149 } |
db0e4ab57977
Turn new point cloud into WKB form of MultiPointZ.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2470
diff
changeset
|
150 |
2469
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
151 func sliceWork( |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
152 vs []octree.Vertex, |
2472
db0e4ab57977
Turn new point cloud into WKB form of MultiPointZ.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2470
diff
changeset
|
153 dst pointMap, |
2469
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
154 fn func([]octree.Vertex, func([]octree.Vertex) []octree.Vertex), |
2470
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
155 ) { |
2469
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
156 n := runtime.NumCPU() |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
157 |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
158 wg := new(sync.WaitGroup) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
159 |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
160 slices := make(chan []octree.Vertex) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
161 out := make(chan []octree.Vertex) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
162 |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
163 pool := make(chan []octree.Vertex, n) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
164 |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
165 const pageSize = 2048 |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
166 |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
167 turn := func(p []octree.Vertex) []octree.Vertex { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
168 if p != nil { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
169 out <- p |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
170 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
171 select { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
172 case p = <-pool: |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
173 default: |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
174 p = make([]octree.Vertex, 0, pageSize) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
175 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
176 return p |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
177 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
178 |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
179 for i := 0; i < n; i++ { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
180 wg.Add(1) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
181 go func() { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
182 defer wg.Done() |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
183 for slice := range slices { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
184 fn(slice, turn) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
185 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
186 }() |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
187 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
188 done := make(chan struct{}) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
189 go func() { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
190 defer close(done) |
2470
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
191 for s := range out { |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
192 for i := range s { |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
193 v := &s[i] |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
194 key := point{x: v.X, y: v.Y} |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
195 if z, found := dst[key]; found { |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
196 dst[key] = (z + v.Z) * 0.5 |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
197 } else { |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
198 dst[key] = v.Z |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
199 } |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
200 } |
2469
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
201 select { |
2470
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
202 case pool <- s[:0:pageSize]: |
2469
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
203 default: |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
204 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
205 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
206 }() |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
207 |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
208 size := len(vs)/n + 1 |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
209 for len(vs) > 0 { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
210 var l int |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
211 if len(vs) < size { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
212 l = len(vs) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
213 } else { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
214 l = size |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
215 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
216 slices <- vs[:l] |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
217 vs = vs[l:] |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
218 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
219 close(slices) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
220 wg.Wait() |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
221 close(out) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
222 <-done |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
223 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
224 |
2465
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
225 func process(bottleneck string, firstDate, secondDate time.Time) error { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
226 start := time.Now() |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
227 defer func() { log.Printf("processing took %v\n", time.Since(start)) }() |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
228 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
229 ctx := context.Background() |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
230 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
231 return run(func(db *sql.DB) error { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
232 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
233 conn, err := db.Conn(ctx) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
234 if err != nil { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
235 return err |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
236 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
237 defer conn.Close() |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
238 |
2480
242104c338ff
Wrap writing of iso-lines of differences into a transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2479
diff
changeset
|
239 tx, err := conn.BeginTx(ctx, nil) |
242104c338ff
Wrap writing of iso-lines of differences into a transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2479
diff
changeset
|
240 if err != nil { |
242104c338ff
Wrap writing of iso-lines of differences into a transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2479
diff
changeset
|
241 return err |
242104c338ff
Wrap writing of iso-lines of differences into a transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2479
diff
changeset
|
242 } |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
243 defer tx.Rollback() |
2480
242104c338ff
Wrap writing of iso-lines of differences into a transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2479
diff
changeset
|
244 |
2465
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
245 type load struct { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
246 date time.Time |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
247 data []byte |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
248 err *error |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
249 dst **octree.Tree |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
250 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
251 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
252 out := make(chan *load) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
253 wg := new(sync.WaitGroup) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
254 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
255 n := runtime.NumCPU() |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
256 if n > 2 { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
257 n = 2 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
258 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
259 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
260 for i := 0; i < n; i++ { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
261 wg.Add(1) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
262 go func() { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
263 defer wg.Done() |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
264 for l := range out { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
265 if *l.err == nil { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
266 *l.dst, *l.err = octree.Deserialize(l.data) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
267 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
268 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
269 }() |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
270 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
271 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
272 var firstErr, secondErr error |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
273 var first, second *octree.Tree |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
274 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
275 for _, l := range []*load{ |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
276 {date: firstDate, dst: &first, err: &firstErr}, |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
277 {date: secondDate, dst: &second, err: &secondErr}, |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
278 } { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
279 var data []byte |
2480
242104c338ff
Wrap writing of iso-lines of differences into a transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2479
diff
changeset
|
280 if err := tx.QueryRowContext( |
2465
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
281 ctx, |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
282 loadOctreeSQL, |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
283 bottleneck, |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
284 l.date, |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
285 ).Scan(&data); err != nil { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
286 *l.err = err |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
287 } else { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
288 l.data = data |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
289 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
290 out <- l |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
291 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
292 close(out) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
293 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
294 wg.Wait() |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
295 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
296 if firstErr != nil || secondErr != nil { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
297 if firstErr != nil && secondErr != nil { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
298 return fmt.Errorf("%v, %v", firstErr, secondErr) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
299 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
300 if firstErr != nil { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
301 return firstErr |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
302 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
303 return secondErr |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
304 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
305 |
2468
27cc04bbda46
Bail out if the EPSG codes of the datasets don't match.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2467
diff
changeset
|
306 if first.EPSG != second.EPSG { |
27cc04bbda46
Bail out if the EPSG codes of the datasets don't match.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2467
diff
changeset
|
307 return errors.New("EPSG codes mismatch. Needs transformation slow pass.") |
27cc04bbda46
Bail out if the EPSG codes of the datasets don't match.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2467
diff
changeset
|
308 } |
27cc04bbda46
Bail out if the EPSG codes of the datasets don't match.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2467
diff
changeset
|
309 |
2470
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
310 now := time.Now() |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
311 log.Printf("loading took %v\n", now.Sub(start)) |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
312 last := now |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
313 |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
314 firstVs, secondVs := first.Vertices(), second.Vertices() |
2465
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
315 |
2472
db0e4ab57977
Turn new point cloud into WKB form of MultiPointZ.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2470
diff
changeset
|
316 result := make(pointMap, len(firstVs)+len(secondVs)) |
2466
a1e751c08c56
Calculate difference on single core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2465
diff
changeset
|
317 |
2470
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
318 sliceWork( |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
319 firstVs, |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
320 result, |
2469
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
321 func( |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
322 slice []octree.Vertex, |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
323 turn func([]octree.Vertex) []octree.Vertex, |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
324 ) { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
325 p := turn(nil) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
326 for i := range slice { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
327 v := &slice[i] |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
328 if z, found := second.Value(v.X, v.Y); found { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
329 p = append(p, octree.Vertex{v.X, v.Y, v.Z - z}) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
330 if len(p) == cap(p) { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
331 p = turn(p) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
332 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
333 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
334 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
335 if len(p) > 0 { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
336 turn(p) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
337 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
338 }) |
2466
a1e751c08c56
Calculate difference on single core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2465
diff
changeset
|
339 |
2470
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
340 sliceWork( |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
341 secondVs, |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
342 result, |
2469
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
343 func( |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
344 slice []octree.Vertex, |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
345 turn func([]octree.Vertex) []octree.Vertex, |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
346 ) { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
347 p := turn(nil) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
348 for i := range slice { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
349 v := &slice[i] |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
350 if z, found := first.Value(v.X, v.Y); found { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
351 p = append(p, octree.Vertex{v.X, v.Y, z - v.Z}) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
352 if len(p) == cap(p) { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
353 p = turn(p) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
354 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
355 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
356 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
357 if len(p) > 0 { |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
358 turn(p) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
359 } |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
360 }) |
1312953defab
Do difference calculation multi-core.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2468
diff
changeset
|
361 |
2470
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
362 now = time.Now() |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
363 log.Printf("setting in took %v\n", now.Sub(last)) |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
364 last = now |
5bd3236f2b1f
Integrate deduplication with setting in. Even if there is more contention in total it seems to be cheaper.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2469
diff
changeset
|
365 log.Printf("num points: %d\n", len(result)) |
2465
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
366 |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
367 var clip []byte |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
368 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
369 if err := tx.QueryRowContext( |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
370 ctx, clippingPolygonSQL, |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
371 bottleneck, |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
372 first.EPSG, |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
373 firstDate, secondDate, |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
374 ).Scan(&clip); err != nil { |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
375 return err |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
376 } |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
377 |
2496
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
378 var clippingPolygon octree.Polygon |
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
379 if err := clippingPolygon.FromWKB(clip); err != nil { |
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
380 return err |
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
381 } |
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
382 clippingPolygon.Indexify() |
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
383 |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
384 now = time.Now() |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
385 log.Printf("loading clipping polygon took %v\n", now.Sub(last)) |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
386 last = now |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2484
diff
changeset
|
387 |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
388 tri, err := result.triangulate() |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
389 if err != nil { |
2473
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
390 return err |
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
391 } |
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
392 |
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
393 now = time.Now() |
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
394 log.Printf("triangulation took %v\n", now.Sub(last)) |
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
395 last = now |
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
396 |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
397 builder := octree.NewBuilder(tri.Tin()) |
2473
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
398 builder.Build() |
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
399 |
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
400 now = time.Now() |
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
401 log.Printf("building octree took %v\n", now.Sub(last)) |
19beb7d17337
Triangulate and build octree index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2472
diff
changeset
|
402 last = now |
2476
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
403 |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
404 tree := builder.Tree() |
2496
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
405 tree.Clip(&clippingPolygon) |
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
406 |
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
407 now = time.Now() |
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
408 log.Printf("clipping octree took %v\n", now.Sub(last)) |
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
409 last = now |
2476
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
410 |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
411 log.Printf("min/max: %f %f\n", tree.Min.Z, tree.Max.Z) |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
412 |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
413 var heights []float64 |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
414 |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
415 switch { |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
416 case tree.Min.Z >= 0: // All values positive. |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
417 for v := 0.0; v <= tree.Max.Z; v += 0.1 { |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
418 if v >= tree.Min.Z { |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
419 heights = append(heights, v) |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
420 } |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
421 } |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
422 case tree.Max.Z <= 0: // All values negative. |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
423 for v := 0.0; v >= tree.Min.Z; v -= 0.1 { |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
424 if v <= tree.Max.Z { |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
425 heights = append(heights, v) |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
426 } |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
427 } |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
428 default: // Positive and negative. |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
429 for v := 0.1; v <= tree.Max.Z; v += 0.1 { |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
430 heights = append(heights, v) |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
431 } |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
432 for i, j := 0, len(heights)-1; i < j; i, j = i+1, j-1 { |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
433 heights[i], heights[j] = heights[j], heights[i] |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
434 } |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
435 for v := 0.0; v >= tree.Min.Z; v -= 0.1 { |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
436 heights = append(heights, v) |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
437 } |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
438 } |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
439 |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
440 log.Printf("num heights: %d\n", len(heights)) |
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
441 |
2476
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
442 var dataSize int |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
443 |
2496
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
444 stmt, err := tx.PrepareContext(ctx, insertContourSQL) |
2479
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
445 if err != nil { |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
446 return err |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
447 } |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
448 defer stmt.Close() |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
449 |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
450 log.Println("do contours") |
2476
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
451 octree.DoContours(tree, heights, func(res *octree.ContourResult) { |
2479
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
452 if err == nil && len(res.Lines) > 0 { |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
453 log.Printf("%.2f: lines: %d\n", res.Height, len(res.Lines)) |
2479
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
454 wkb := res.Lines.AsWKB2D() |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
455 dataSize += len(wkb) |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
456 _, err = stmt.ExecContext( |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
457 ctx, |
2496
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
458 wkb, |
2484
4fa92d468164
Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2483
diff
changeset
|
459 first.EPSG, |
2496
12ed6feefea5
Use octree clipping. Not working, yet!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2488
diff
changeset
|
460 contourTolerance, |
2479
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
461 res.Height, |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
462 ) |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
463 } |
2476
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
464 }) |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
465 |
2479
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
466 if err != nil { |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
467 return err |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
468 } |
c85b16db8a02
Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2476
diff
changeset
|
469 |
2476
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
470 now = time.Now() |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
471 log.Printf("Number of iso lines: %d\n", len(heights)) |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
472 log.Printf("Total WKB size: %.2fMB\n", float64(dataSize)/(1024*1024)) |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
473 log.Printf("generating iso lines took %v\n", now.Sub(last)) |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
474 last = now |
efe332e985b9
Calculate the iso lines of the difference.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2473
diff
changeset
|
475 |
2480
242104c338ff
Wrap writing of iso-lines of differences into a transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2479
diff
changeset
|
476 return tx.Commit() |
2465
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
477 }) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
478 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
479 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
480 func main() { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
481 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
482 flag.Parse() |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
483 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
484 firstDate, err := time.Parse(common.DateFormat, *first) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
485 check(err) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
486 secondDate, err := time.Parse(common.DateFormat, *second) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
487 check(err) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
488 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
489 if *bottleneck == "" { |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
490 log.Fatalln("Missing bottleneck name") |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
491 } |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
492 |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
493 check(process(*bottleneck, firstDate, secondDate)) |
86c7a023400e
Started experimental octree diff branch.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
494 } |