Mercurial > gemma
comparison pkg/imports/sr.go @ 1239:d842d9d10872
Sounding result import: Added the feature to override bottleneck, EPSG, depth reference and date in meta.json by POST arguments.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 20 Nov 2018 17:04:06 +0100 |
parents | 4d7c44f7044e |
children | 5aeda02c51b9 |
comparison
equal
deleted
inserted
replaced
1238:442399fc1b71 | 1239:d842d9d10872 |
---|---|
18 "bufio" | 18 "bufio" |
19 "context" | 19 "context" |
20 "crypto/sha1" | 20 "crypto/sha1" |
21 "database/sql" | 21 "database/sql" |
22 "encoding/hex" | 22 "encoding/hex" |
23 "encoding/json" | |
23 "errors" | 24 "errors" |
24 "fmt" | 25 "fmt" |
25 "io" | 26 "io" |
26 "math" | 27 "math" |
27 "os" | 28 "os" |
36 "gemma.intevation.de/gemma/pkg/common" | 37 "gemma.intevation.de/gemma/pkg/common" |
37 "gemma.intevation.de/gemma/pkg/models" | 38 "gemma.intevation.de/gemma/pkg/models" |
38 "gemma.intevation.de/gemma/pkg/octree" | 39 "gemma.intevation.de/gemma/pkg/octree" |
39 ) | 40 ) |
40 | 41 |
41 type SoundingResult string | 42 type SoundingResult struct { |
43 Dir string `json:"dir"` | |
44 | |
45 // Override data | |
46 Date *models.SoundingResultDate `json:"date,omitempty"` | |
47 Bottleneck *string `json:"bottleneck,omitempty"` | |
48 EPSG *uint `json:"epsg,omitempty"` | |
49 DepthReference *string `json:"depth-reference,omitempty"` | |
50 } | |
42 | 51 |
43 const ( | 52 const ( |
44 contourStepWidth = 0.1 | 53 contourStepWidth = 0.1 |
45 contourTolerance = 0.1 | 54 contourTolerance = 0.1 |
46 ) | 55 ) |
52 func init() { | 61 func init() { |
53 RegisterJobCreator(SRJobKind, srJobCreator{}) | 62 RegisterJobCreator(SRJobKind, srJobCreator{}) |
54 } | 63 } |
55 | 64 |
56 func (srJobCreator) Create(_ JobKind, data string) (Job, error) { | 65 func (srJobCreator) Create(_ JobKind, data string) (Job, error) { |
57 return SoundingResult(data), nil | 66 sr := new(SoundingResult) |
67 if err := sr.FromString(data); err != nil { | |
68 return nil, err | |
69 } | |
70 return sr, nil | |
58 } | 71 } |
59 | 72 |
60 func (srJobCreator) Depends() []string { | 73 func (srJobCreator) Depends() []string { |
61 return []string{ | 74 return []string{ |
62 "waterway.sounding_results", | 75 "waterway.sounding_results", |
136 FROM waterway.sounding_results sr | 149 FROM waterway.sounding_results sr |
137 WHERE id = $1 | 150 WHERE id = $1 |
138 ` | 151 ` |
139 ) | 152 ) |
140 | 153 |
141 func (sr SoundingResult) Do( | 154 func (sr *SoundingResult) FromString(data string) error { |
155 return json.NewDecoder(strings.NewReader(data)).Decode(sr) | |
156 } | |
157 | |
158 func (sr *SoundingResult) ToString() (string, error) { | |
159 var b strings.Builder | |
160 if err := json.NewEncoder(&b).Encode(sr); err != nil { | |
161 return "", err | |
162 } | |
163 return b.String(), nil | |
164 } | |
165 | |
166 func (sr *SoundingResult) Do( | |
142 importID int64, | 167 importID int64, |
143 ctx context.Context, | 168 ctx context.Context, |
144 conn *sql.Conn, | 169 conn *sql.Conn, |
145 feedback Feedback, | 170 feedback Feedback, |
146 ) error { | 171 ) error { |
147 | 172 |
148 z, err := zip.OpenReader(filepath.Join(string(sr), "sr.zip")) | 173 z, err := zip.OpenReader(filepath.Join(sr.Dir, "sr.zip")) |
149 if err != nil { | 174 if err != nil { |
150 return err | 175 return err |
151 } | 176 } |
152 defer z.Close() | 177 defer z.Close() |
153 | 178 |
155 mf := common.FindInZIP(z, "meta.json") | 180 mf := common.FindInZIP(z, "meta.json") |
156 if mf == nil { | 181 if mf == nil { |
157 return errors.New("Cannot find 'meta.json'") | 182 return errors.New("Cannot find 'meta.json'") |
158 } | 183 } |
159 | 184 |
160 m, err := loadMeta(mf) | 185 m, err := sr.loadMeta(mf) |
161 if err != nil { | 186 if err != nil { |
162 return err | 187 return err |
163 } | 188 } |
164 | 189 |
165 if err := m.Validate(conn, ctx); err != nil { | 190 if err := m.Validate(conn, ctx); err != nil { |
267 feedback.Info("Storing sounding result was successful.") | 292 feedback.Info("Storing sounding result was successful.") |
268 } | 293 } |
269 return err | 294 return err |
270 } | 295 } |
271 | 296 |
272 func (sr SoundingResult) CleanUp() error { | 297 func (sr *SoundingResult) CleanUp() error { |
273 return os.RemoveAll(string(sr)) | 298 return os.RemoveAll(sr.Dir) |
274 } | 299 } |
275 | 300 |
276 func loadMeta(f *zip.File) (*models.SoundingResultMeta, error) { | 301 func (sr *SoundingResult) loadMeta(f *zip.File) (*models.SoundingResultMeta, error) { |
277 r, err := f.Open() | 302 r, err := f.Open() |
278 if err != nil { | 303 if err != nil { |
279 return nil, err | 304 return nil, err |
280 } | 305 } |
281 defer r.Close() | 306 defer r.Close() |
282 var m models.SoundingResultMeta | 307 var m models.SoundingResultMeta |
283 return &m, m.Decode(r) | 308 if err := m.Decode(r); err != nil { |
309 return nil, err | |
310 } | |
311 | |
312 // Apply overrides | |
313 if sr.Date != nil { | |
314 m.Date = *sr.Date | |
315 } | |
316 if sr.Bottleneck != nil { | |
317 m.Bottleneck = *sr.Bottleneck | |
318 } | |
319 if sr.EPSG != nil { | |
320 m.EPSG = *sr.EPSG | |
321 } | |
322 if sr.DepthReference != nil { | |
323 m.DepthReference = *sr.DepthReference | |
324 } | |
325 | |
326 return &m, nil | |
284 } | 327 } |
285 | 328 |
286 func loadXYZReader(r io.Reader, feedback Feedback) (octree.MultiPointZ, error) { | 329 func loadXYZReader(r io.Reader, feedback Feedback) (octree.MultiPointZ, error) { |
287 mpz := make(octree.MultiPointZ, 0, 250000) | 330 mpz := make(octree.MultiPointZ, 0, 250000) |
288 s := bufio.NewScanner(r) | 331 s := bufio.NewScanner(r) |