@@ -3,6 +3,7 @@ package srtm
3
3
import (
4
4
geojson "github.com/paulmach/go.geojson"
5
5
"github.com/rs/zerolog/log"
6
+ "sync"
6
7
)
7
8
8
9
// AddElevation returns point with 3 coordinates: [longitude, latitude, elevation]
@@ -26,11 +27,26 @@ func AddElevation(point []float64) ([]float64, error) {
26
27
return append (point [:2 ], float64 (elevation )), nil
27
28
}
28
29
30
+ func processorLineString (wg * sync.WaitGroup , geoJson * geojson.Geometry , i int , skipErrors bool ) {
31
+ point , err := AddElevation (geoJson .LineString [i ])
32
+ if err != nil && ! skipErrors {
33
+ log .Error ().Caller ().Err (err ).Msg ("" )
34
+ }
35
+ geoJson .LineString [i ] = point
36
+ if wg != nil {
37
+ wg .Done ()
38
+ }
39
+ }
40
+
29
41
// AddElevations returns geojson with added third coordinate (elevation)
30
42
// Param tileDir - directory of hgt-tiles
31
43
// Param geoJson - geojson for processing
32
44
// Param skipErrors - if false AddElevations use premature exit (on first bad point in geojson). if true all points will be process but bad point will not to be contains elevation coordinate
33
45
func AddElevations (geoJson * geojson.Geometry , skipErrors bool ) (* geojson.Geometry , error ) {
46
+ var wg * sync.WaitGroup
47
+ if parallel {
48
+ wg = & sync.WaitGroup {}
49
+ }
34
50
switch geoJson .Type {
35
51
case geojson .GeometryPoint :
36
52
point , err := AddElevation (geoJson .Point )
@@ -40,14 +56,16 @@ func AddElevations(geoJson *geojson.Geometry, skipErrors bool) (*geojson.Geometr
40
56
geoJson .Point = point
41
57
return geoJson , nil
42
58
case geojson .GeometryLineString :
59
+ if parallel {
60
+ wg .Add (len (geoJson .LineString ))
61
+ }
43
62
for i := range geoJson .LineString {
44
- point , err := AddElevation (geoJson .LineString [i ])
45
- if err != nil && ! skipErrors {
46
- log .Error ().Caller ().Err (err ).Msg ("" )
63
+ if parallel {
64
+ go processorLineString (wg , geoJson , i , skipErrors )
65
+ } else {
66
+ processorLineString (nil , geoJson , i , skipErrors )
47
67
}
48
- geoJson .LineString [i ] = point
49
68
}
50
- return geoJson , nil
51
69
case geojson .GeometryMultiPoint :
52
70
for i := range geoJson .MultiPoint {
53
71
point , err := AddElevation (geoJson .MultiPoint [i ])
@@ -56,7 +74,6 @@ func AddElevations(geoJson *geojson.Geometry, skipErrors bool) (*geojson.Geometr
56
74
}
57
75
geoJson .MultiPoint [i ] = point
58
76
}
59
- return geoJson , nil
60
77
case geojson .GeometryPolygon :
61
78
for i := range geoJson .Polygon {
62
79
for j := range geoJson .Polygon [i ] {
@@ -67,7 +84,6 @@ func AddElevations(geoJson *geojson.Geometry, skipErrors bool) (*geojson.Geometr
67
84
geoJson.Polygon [i ][j ] = point
68
85
}
69
86
}
70
- return geoJson , nil
71
87
case geojson .GeometryMultiLineString :
72
88
for i := range geoJson .MultiLineString {
73
89
for j := range geoJson .MultiLineString [i ] {
@@ -78,8 +94,9 @@ func AddElevations(geoJson *geojson.Geometry, skipErrors bool) (*geojson.Geometr
78
94
geoJson.MultiLineString [i ][j ] = point
79
95
}
80
96
}
81
- return geoJson , nil
82
- default :
83
- return geoJson , nil
84
97
}
98
+ if parallel {
99
+ wg .Wait ()
100
+ }
101
+ return geoJson , nil
85
102
}
0 commit comments