do not close ways with gap; check to match befor loading ways
parent
cbec2f20a3
commit
42b147c118
|
@ -332,9 +332,12 @@ func TestComplete_GeneralizedLinestringIsValid(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestComplete_RingWithGap(t *testing.T) {
|
func TestComplete_RingWithGap(t *testing.T) {
|
||||||
// Multipolygon and way with gap (overlapping but different endpoints) gets closed
|
// Multipolygon with gap (overlapping but different endpoints) gets closed
|
||||||
assertGeomValid(t, checkElem{"osm_landusages", -7301, Missing, nil})
|
assertGeomValid(t, checkElem{"osm_landusages", -7301, Missing, nil})
|
||||||
assertGeomValid(t, checkElem{"osm_landusages", 7311, Missing, nil})
|
// but not way
|
||||||
|
assertRecords(t, []checkElem{
|
||||||
|
checkElem{"osm_landusages", 7311, Missing, nil},
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestComplete_MultipolygonWithOpenRing(t *testing.T) {
|
func TestComplete_MultipolygonWithOpenRing(t *testing.T) {
|
||||||
|
|
|
@ -78,17 +78,29 @@ func (ww *WayWriter) loop() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ww.osmCache.Coords.FillWay(w)
|
filled := false
|
||||||
if err != nil {
|
// fill loads all coords. call only if we have a match
|
||||||
continue
|
fill := func(w *element.Way) bool {
|
||||||
|
if filled {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
err := ww.osmCache.Coords.FillWay(w)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
ww.NodesToSrid(w.Nodes)
|
||||||
|
filled = true
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
ww.NodesToSrid(w.Nodes)
|
|
||||||
|
|
||||||
w.Id = ww.wayId(w.Id)
|
w.Id = ww.wayId(w.Id)
|
||||||
|
|
||||||
inserted := false
|
inserted := false
|
||||||
insertedPolygon := false
|
insertedPolygon := false
|
||||||
if matches := ww.lineMatcher.MatchWay(w); len(matches) > 0 {
|
if matches := ww.lineMatcher.MatchWay(w); len(matches) > 0 {
|
||||||
|
if !fill(w) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
err, inserted = ww.buildAndInsert(geos, w, matches, false)
|
err, inserted = ww.buildAndInsert(geos, w, matches, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
|
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
|
||||||
|
@ -97,23 +109,28 @@ func (ww *WayWriter) loop() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !insertedAsRelation && (w.IsClosed() || w.TryClose(ww.maxGap)) {
|
if !insertedAsRelation {
|
||||||
// only add polygons that were not inserted as a MultiPolygon relation
|
// only add polygons that were not inserted as a MultiPolygon relation
|
||||||
if matches := ww.polygonMatcher.MatchWay(w); len(matches) > 0 {
|
if matches := ww.polygonMatcher.MatchWay(w); len(matches) > 0 {
|
||||||
err, insertedPolygon = ww.buildAndInsert(geos, w, matches, true)
|
if !fill(w) {
|
||||||
if err != nil {
|
|
||||||
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
|
|
||||||
log.Warn(err)
|
|
||||||
}
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if w.IsClosed() {
|
||||||
|
err, insertedPolygon = ww.buildAndInsert(geos, w, matches, true)
|
||||||
|
if err != nil {
|
||||||
|
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
|
||||||
|
log.Warn(err)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inserted || insertedPolygon) && ww.expireor != nil {
|
if (inserted || insertedPolygon) && ww.expireor != nil {
|
||||||
expire.ExpireProjectedNodes(ww.expireor, w.Nodes, ww.srid, insertedPolygon)
|
expire.ExpireProjectedNodes(ww.expireor, w.Nodes, ww.srid, insertedPolygon)
|
||||||
}
|
}
|
||||||
if ww.diffCache != nil {
|
if (inserted || insertedPolygon) && ww.diffCache != nil {
|
||||||
ww.diffCache.Coords.AddFromWay(w)
|
ww.diffCache.Coords.AddFromWay(w)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue