From 4de5d987d7aa3d4f4fec9d0a6fa1a71923970b19 Mon Sep 17 00:00:00 2001 From: Oliver Tonnhofer Date: Wed, 1 Feb 2017 11:59:41 +0100 Subject: [PATCH] do not expire clipped ways/relations --- writer/relations.go | 3 +++ writer/ways.go | 32 +++++++++++++++++--------------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/writer/relations.go b/writer/relations.go index 3af283a..53a8043 100644 --- a/writer/relations.go +++ b/writer/relations.go @@ -172,6 +172,9 @@ func handleMultiPolygon(rw *RelationWriter, r *element.Relation, geos *geosp.Geo if duration := time.Now().Sub(start); duration > time.Minute { log.Warnf("clipping relation %d to -limitto took %s", r.Id, duration) } + if len(parts) == 0 { + return false + } for _, g := range parts { rel := element.Relation(*r) rel.Id = rw.relId(r.Id) diff --git a/writer/ways.go b/writer/ways.go index 1f770fa..a11de60 100644 --- a/writer/ways.go +++ b/writer/ways.go @@ -89,31 +89,28 @@ func (ww *WayWriter) loop() { inserted := false insertedPolygon := false if matches := ww.lineMatcher.MatchWay(w); len(matches) > 0 { - err := ww.buildAndInsert(geos, w, matches, false) + err, inserted = ww.buildAndInsert(geos, w, matches, false) if err != nil { if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 { log.Warn(err) } continue } - inserted = true } if !insertedAsRelation && (w.IsClosed() || w.TryClose(ww.maxGap)) { // only add polygons that were not inserted as a MultiPolygon relation if matches := ww.polygonMatcher.MatchWay(w); len(matches) > 0 { - err := ww.buildAndInsert(geos, w, matches, true) + err, insertedPolygon = ww.buildAndInsert(geos, w, matches, true) if err != nil { if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 { log.Warn(err) } continue } - inserted = true - insertedPolygon = true } } - if inserted && ww.expireor != nil { + if (inserted || insertedPolygon) && ww.expireor != nil { expire.ExpireProjectedNodes(ww.expireor, w.Nodes, ww.srid, insertedPolygon) } if ww.diffCache != nil { @@ -123,7 +120,7 @@ func (ww *WayWriter) loop() { ww.wg.Done() } -func (ww *WayWriter) buildAndInsert(g *geos.Geos, w *element.Way, matches []mapping.Match, isPolygon bool) error { +func (ww *WayWriter) buildAndInsert(g *geos.Geos, w *element.Way, matches []mapping.Match, isPolygon bool) (error, bool) { var err error var geosgeom *geos.Geom // make copy to avoid interference with polygon/linestring matches @@ -138,42 +135,47 @@ func (ww *WayWriter) buildAndInsert(g *geos.Geos, w *element.Way, matches []mapp geosgeom, err = geomp.LineString(g, way.Nodes) } if err != nil { - return err + return err, false } geom, err := geomp.AsGeomElement(g, geosgeom) if err != nil { - return err + return err, false } + inserted := true if ww.limiter != nil { parts, err := ww.limiter.Clip(geom.Geom) if err != nil { - return err + return err, false + } + if len(parts) == 0 { + // outside of limitto + inserted = false } for _, p := range parts { way := element.Way(*w) geom = geomp.Geometry{Geom: p, Wkb: g.AsEwkbHex(p)} if isPolygon { if err := ww.inserter.InsertPolygon(way.OSMElem, geom, matches); err != nil { - return err + return err, false } } else { if err := ww.inserter.InsertLineString(way.OSMElem, geom, matches); err != nil { - return err + return err, false } } } } else { if isPolygon { if err := ww.inserter.InsertPolygon(way.OSMElem, geom, matches); err != nil { - return err + return err, false } } else { if err := ww.inserter.InsertLineString(way.OSMElem, geom, matches); err != nil { - return err + return err, false } } } - return nil + return nil, inserted }