changeset 5010:1d1be6bd5304

Wrap geometries if needed.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 11 Mar 2020 17:31:45 +0100
parents e8b2dc771f9e
children 2d7af72bb7ac
files pkg/imports/fm.go pkg/imports/wfsjob.go
diffstat 2 files changed, 48 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/fm.go	Wed Mar 11 17:11:23 2020 +0100
+++ b/pkg/imports/fm.go	Wed Mar 11 17:31:45 2020 +0100
@@ -567,7 +567,7 @@
 
 func consume(
 	spc *SQLGeometryConsumer,
-	points, properties interface{},
+	geom, properties interface{},
 	epsg int,
 ) error {
 	var fmid int64
@@ -576,7 +576,7 @@
 			spc.ctx,
 			append(
 				[]interface{}{
-					points.(*pointSlice).asWKB(),
+					geom.(interface{ asWKB() []byte }).asWKB(),
 					epsg,
 				},
 				structs.Values(properties)...)...,
--- a/pkg/imports/wfsjob.go	Wed Mar 11 17:11:23 2020 +0100
+++ b/pkg/imports/wfsjob.go	Wed Mar 11 17:31:45 2020 +0100
@@ -58,9 +58,21 @@
 	}
 )
 
-var kindToGeometry = map[string]func() interface{}{
-	"Point": func() interface{} { return new(pointSlice) },
-}
+var (
+	kindToGeometry = map[string]func() interface{}{
+		// TODO: extend me!
+		"Point":           func() interface{} { return new(pointSlice) },
+		"LineString":      func() interface{} { return new(lineSlice) },
+		"MultiLineString": func() interface{} { return new(multiLineSlice) },
+	}
+
+	wrapGeomKind = map[[2]string]func(interface{}) interface{}{
+		// TODO: extend me!
+		{"LineString", "MultiLineString"}: func(x interface{}) interface{} {
+			return &multiLineSlice{*x.(*lineSlice)}
+		},
+	}
+)
 
 func (wfjc *WFSFeatureJobCreator) Description() string {
 	return wfjc.description
@@ -182,37 +194,44 @@
 
 			kind, props := consumer.NewFeature()
 
-			makeGeom := kindToGeometry[kind]
-			if makeGeom == nil {
-				unsupported[kind]++
-				continue
-			}
-
-			geom := makeGeom()
-
 			if err := json.Unmarshal(*feature.Properties, props); err != nil {
 				badProperties++
 				continue
 			}
 
-			if feature.Geometry.Type == kind {
-				if err := json.Unmarshal(*feature.Geometry.Coordinates, geom); err != nil {
-					return err
+			// Optional wrapping
+			wrap := func(x interface{}) interface{} { return x }
+
+			makeGeom := kindToGeometry[kind]
+			if makeGeom == nil {
+				// Look if we can deserialize it
+				if makeGeom = kindToGeometry[feature.Geometry.Type]; makeGeom == nil {
+					unsupported[feature.Geometry.Type]++
+					continue
 				}
+				// Look if we can wrap it
+				if wrap = wrapGeomKind[[2]string{feature.Geometry.Type, kind}]; wrap == nil {
+					unsupported[kind]++
+					continue
+				}
+			}
 
-				err := consumer.Consume(geom, props, epsg)
-				switch {
-				case err == ErrFeatureDuplicated:
-					dupes++
-				case err == ErrFeatureIgnored:
-					// be silent
-				case err != nil:
-					return err
-				default:
-					features++
-				}
-			} else {
-				unsupported[feature.Geometry.Type]++
+			geom := makeGeom()
+
+			if err := json.Unmarshal(*feature.Geometry.Coordinates, geom); err != nil {
+				return err
+			}
+
+			err := consumer.Consume(wrap(geom), props, epsg)
+			switch {
+			case err == ErrFeatureDuplicated:
+				dupes++
+			case err == ErrFeatureIgnored:
+				// be silent
+			case err != nil:
+				return err
+			default:
+				features++
 			}
 		}
 		return nil