Mercurial > gemma
view pkg/models/cross.go @ 636:7a867e48b3c2
Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Thu, 13 Sep 2018 04:11:36 +0200 |
parents | 6093016fac88 |
children | 756f3fc62da6 |
line wrap: on
line source
package models import ( "encoding/json" "errors" "time" ) type ( GeoJSONFeature string GeoJSONLineStringType string GeoJSONDate struct{ time.Time } GeoJSONLineString struct { Type GeoJSONLineStringType `json:"type"` } GeoJSONCoordinate struct { Lon float64 Lat float64 } CrossSectionInputProperties struct { Bottleneck string `json:"bottleneck"` Date GeoJSONDate `json:"date"` } GeoJSONLineCoordinates []GeoJSONCoordinate CrossSectionInput struct { Type GeoJSONFeature `json:"type"` Geometry GeoJSONLineString `json:"geometry"` Coordinates GeoJSONLineCoordinates `json:"coordinates"` Properties CrossSectionInputProperties `json:"properties"` } ) var ( errNoGeoJSONFeature = errors.New("Not a valid GeoJSON feature") errNoGeoJSONLineStringType = errors.New("Not a valid GeoJSON linestring type") errTooLessComponents = errors.New("Too less components in coordinate") errTooLessCoordinates = errors.New("Too less coordinates") ) func (lc *GeoJSONLineCoordinates) UnmarshalJSON(data []byte) error { var coords []GeoJSONCoordinate if err := json.Unmarshal(data, &coords); err != nil { return err } if len(coords) < 2 { return errTooLessCoordinates } *lc = GeoJSONLineCoordinates(coords) return nil } func (d *GeoJSONDate) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } t, err := time.Parse("2006-01-02", s) if err != nil { return err } *d = GeoJSONDate{t} return nil } func (c *GeoJSONCoordinate) UnmarshalJSON(data []byte) error { var pos []float64 if err := json.Unmarshal(data, &pos); err != nil { return err } if len(pos) < 2 { return errTooLessComponents } *c = GeoJSONCoordinate{Lon: pos[0], Lat: pos[1]} return nil } func (t *GeoJSONFeature) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } if s != "Feature" { return errNoGeoJSONFeature } *t = GeoJSONFeature(s) return nil } func (t *GeoJSONLineStringType) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } if s != "LineString" { return errNoGeoJSONLineStringType } *t = GeoJSONLineStringType(s) return nil }