validate polygons from ways
parent
b3110b3bb5
commit
7f1a5cb999
|
@ -13,9 +13,11 @@ extern void initGEOS_debug();
|
|||
import "C"
|
||||
|
||||
import (
|
||||
"github.com/omniscale/imposm3/logging"
|
||||
"errors"
|
||||
"runtime"
|
||||
"unsafe"
|
||||
|
||||
"github.com/omniscale/imposm3/logging"
|
||||
)
|
||||
|
||||
var log = logging.NewLogger("GEOS")
|
||||
|
@ -268,6 +270,19 @@ func (this *Geos) Equals(a, b *Geom) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func (g *Geos) MakeValid(geom *Geom) (*Geom, error) {
|
||||
if g.IsValid(geom) {
|
||||
return geom, nil
|
||||
}
|
||||
fixed := g.Buffer(geom, 0)
|
||||
if fixed == nil {
|
||||
return nil, errors.New("Error while fixing geom with buffer(0)")
|
||||
}
|
||||
g.Destroy(geom)
|
||||
|
||||
return fixed, nil
|
||||
}
|
||||
|
||||
func (this *Geom) Area() float64 {
|
||||
var area C.double
|
||||
if ret := C.GEOSArea(this.v, &area); ret == 1 {
|
||||
|
|
|
@ -196,13 +196,10 @@ func buildRelGeometry(g *geos.Geos, rel *element.Relation, rings []*ring) (*geos
|
|||
return nil, errors.New("Error while building multi-polygon.")
|
||||
}
|
||||
}
|
||||
if !g.IsValid(result) {
|
||||
buffered := g.Buffer(result, 0)
|
||||
if buffered == nil {
|
||||
return nil, errors.New("Error while fixing geom with buffer(0)")
|
||||
}
|
||||
g.Destroy(result)
|
||||
result = buffered
|
||||
var err error
|
||||
result, err = g.MakeValid(result)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
g.DestroyLater(result)
|
||||
|
|
|
@ -252,10 +252,10 @@ def test_duplicate_ids():
|
|||
def test_generalized_banana_polygon_is_valid():
|
||||
"""Generalized polygons are valid."""
|
||||
park = t.query_row(t.db_conf, 'osm_landusages', 7101)
|
||||
# geometry is not valid
|
||||
assert not park['geometry'].is_valid, park
|
||||
# geometry is valid
|
||||
assert park['geometry'].is_valid, park
|
||||
park = t.query_row(t.db_conf, 'osm_landusages_gen0', 7101)
|
||||
# but simplified geometies are valid
|
||||
# simplified geometies are valid too
|
||||
assert park['geometry'].is_valid, park
|
||||
park = t.query_row(t.db_conf, 'osm_landusages_gen1', 7101)
|
||||
assert park['geometry'].is_valid, park
|
||||
|
|
|
@ -129,6 +129,9 @@ func (ww *WayWriter) buildAndInsert(g *geos.Geos, w *element.Way, matches []mapp
|
|||
|
||||
if isPolygon {
|
||||
geosgeom, err = geomp.Polygon(g, way.Nodes)
|
||||
if err == nil {
|
||||
geosgeom, err = g.MakeValid(geosgeom)
|
||||
}
|
||||
} else {
|
||||
geosgeom, err = geomp.LineString(g, way.Nodes)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue