changeset 5277:3bab0e19f08b

Merged multi-geoms branch.
author Sascha Wilde <sascha.wilde@intevation.de>
date Thu, 11 Jun 2020 10:09:28 +0200
parents 6f56d17c0291 (current diff) 9a903cdebd97 (diff)
children 8d19d4701f0c
files pkg/imports/fd.go
diffstat 1 files changed, 27 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/fd.go	Thu Jun 11 10:06:59 2020 +0200
+++ b/pkg/imports/fd.go	Thu Jun 11 10:09:28 2020 +0200
@@ -17,7 +17,6 @@
 	"context"
 	"database/sql"
 	"encoding/json"
-	"errors"
 	"fmt"
 	"io"
 	"strings"
@@ -48,8 +47,6 @@
 	Password string `json:"password,omitempty"`
 }
 
-var errContinue = errors.New("continue")
-
 // Description gives a short info about relevant facts of this import.
 func (fd *FairwayDimension) Description() (string, error) {
 	return strings.Join([]string{
@@ -368,13 +365,32 @@
 				dateInfo = (*props.HydroSorDat).Time
 			}
 
-			// Store a feature in the database.
-			storeFeature := func(p polygonSlice) error {
+			var polys multiPolygonSlice
+
+			switch feature.Geometry.Type {
+			case "Polygon":
+				var p polygonSlice
+				if err := json.Unmarshal(*feature.Geometry.Coordinates, &p); err != nil {
+					return err
+				}
+				polys = multiPolygonSlice{p}
 
+			case "MultiPolygon":
+				if err := json.Unmarshal(*feature.Geometry.Coordinates, &polys); err != nil {
+					return err
+				}
+			default:
+				unsupported[feature.Geometry.Type]++
+				continue features
+			}
+
+			// Store the features.
+		storePolygons:
+			for _, p := range polys {
 				var fdid int64
 				var lat, lon float64
-				err = savepoint(func() error {
-					err := insertStmt.QueryRowContext(
+				switch err := savepoint(func() error {
+					return insertStmt.QueryRowContext(
 						ctx,
 						p.asWKB(),
 						epsg,
@@ -385,19 +401,17 @@
 						dateInfo,
 						fd.SourceOrganization,
 					).Scan(&fdid, &lat, &lon)
-					return err
-				})
-				switch {
+				}); {
 				case err == sql.ErrNoRows:
 					outside++
 					// ignore -> filtered by responsibility area (stretches)
-					return errContinue
+					continue storePolygons
 				case err != nil:
 					feedback.Error(pgxutils.ReadableError{Err: err}.Error())
-					return errContinue
+					continue storePolygons
 				}
 				// Store for potential later removal.
-				if err = track(
+				if err := track(
 					ctx, tx, importID, "waterway.fairway_dimensions", fdid,
 				); err != nil {
 					return err
@@ -405,38 +419,6 @@
 				fds = append(fds, fdSummary{ID: fdid, Lat: lat, Lon: lon})
 
 				features++
-
-				return nil
-			}
-
-			switch feature.Geometry.Type {
-			case "Polygon":
-				var p polygonSlice
-				if err := json.Unmarshal(*feature.Geometry.Coordinates, &p); err != nil {
-					return err
-				}
-				switch err := storeFeature(p); {
-				case err == errContinue:
-					continue features
-				case err != nil:
-					return err
-				}
-
-			case "MultiPolygon":
-				var mp multiPolygonSlice
-				if err := json.Unmarshal(*feature.Geometry.Coordinates, &mp); err != nil {
-					return err
-				}
-				for i := range mp {
-					switch err := storeFeature(mp[i]); {
-					case err == errContinue:
-						continue features
-					case err != nil:
-						return err
-					}
-				}
-			default:
-				unsupported[feature.Geometry.Type]++
 			}
 		}
 		return nil