Mercurial > gemma
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