remove support for old-style multipolyon relation handling
First simplification as a result of #142 and https://github.com/osmlab/fixing-polygons-in-osm/issues/15master
parent
42b147c118
commit
b82b1db8c1
|
@ -16,15 +16,12 @@ type PreparedRelation struct {
|
|||
|
||||
// PrepareRelation is the first step in building a (multi-)polygon of a Relation.
|
||||
// It builds rings from all ways and returns an error if there are unclosed rings.
|
||||
// It also merges the Relation.Tags with the Tags of the outer way.
|
||||
func PrepareRelation(rel *element.Relation, srid int, maxRingGap float64) (PreparedRelation, error) {
|
||||
rings, err := buildRings(rel, maxRingGap)
|
||||
if err != nil {
|
||||
return PreparedRelation{}, err
|
||||
}
|
||||
|
||||
rel.Tags = relationTags(rel.Tags, rings[0].ways[0].Tags)
|
||||
|
||||
return PreparedRelation{rings, rel, srid}, nil
|
||||
}
|
||||
|
||||
|
@ -224,29 +221,6 @@ func buildRelGeometry(g *geos.Geos, rel *element.Relation, rings []*ring) (*geos
|
|||
return result, nil
|
||||
}
|
||||
|
||||
func relationTags(relTags, wayTags element.Tags) element.Tags {
|
||||
result := make(element.Tags)
|
||||
for k, v := range relTags {
|
||||
if k == "name" || k == "type" {
|
||||
continue
|
||||
}
|
||||
result[k] = v
|
||||
}
|
||||
|
||||
if len(result) == 0 {
|
||||
// relation does not have tags? use way tags
|
||||
for k, v := range wayTags {
|
||||
result[k] = v
|
||||
}
|
||||
} else {
|
||||
// add back name (if present)
|
||||
if name, ok := relTags["name"]; ok {
|
||||
result["name"] = name
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// ringIsHole returns true if rings[idx] is a hole, False if it is a
|
||||
// shell (also if hole in a hole, etc)
|
||||
func ringIsHole(rings []*ring, idx int) bool {
|
||||
|
|
|
@ -94,7 +94,7 @@ func TestMultiPolygonWithHoleAndRelName(t *testing.T) {
|
|||
})
|
||||
|
||||
rel := element.Relation{
|
||||
OSMElem: element.OSMElem{Id: 1, Tags: element.Tags{"name": "rel"}}}
|
||||
OSMElem: element.OSMElem{Id: 1, Tags: element.Tags{"name": "Relation", "natural": "forest", "type": "multipolygon"}}}
|
||||
rel.Members = []element.Member{
|
||||
{Id: 1, Type: element.WAY, Role: "outer", Way: &w1},
|
||||
{Id: 2, Type: element.WAY, Role: "inner", Way: &w2},
|
||||
|
@ -107,10 +107,11 @@ func TestMultiPolygonWithHoleAndRelName(t *testing.T) {
|
|||
g := geos.NewGeos()
|
||||
defer g.Finish()
|
||||
|
||||
if len(rel.Tags) != 2 {
|
||||
if len(rel.Tags) != 3 {
|
||||
t.Fatal("wrong rel tags", rel.Tags)
|
||||
}
|
||||
if rel.Tags["natural"] != "forest" || rel.Tags["name"] != "Blackwood" {
|
||||
// name from way is ignored
|
||||
if rel.Tags["natural"] != "forest" || rel.Tags["name"] != "Relation" {
|
||||
t.Fatal("wrong rel tags", rel.Tags)
|
||||
}
|
||||
|
||||
|
@ -147,7 +148,7 @@ func TestMultiPolygonWithMultipleHoles(t *testing.T) {
|
|||
})
|
||||
|
||||
rel := element.Relation{
|
||||
OSMElem: element.OSMElem{Id: 1, Tags: element.Tags{"landusage": "forest"}}}
|
||||
OSMElem: element.OSMElem{Id: 1, Tags: element.Tags{"landusage": "forest", "type": "multipolygon"}}}
|
||||
rel.Members = []element.Member{
|
||||
{Id: 1, Type: element.WAY, Role: "outer", Way: &w1},
|
||||
{Id: 2, Type: element.WAY, Role: "inner", Way: &w2},
|
||||
|
@ -161,7 +162,7 @@ func TestMultiPolygonWithMultipleHoles(t *testing.T) {
|
|||
g := geos.NewGeos()
|
||||
defer g.Finish()
|
||||
|
||||
if len(rel.Tags) != 1 {
|
||||
if len(rel.Tags) != 2 {
|
||||
t.Fatal("wrong rel tags", rel.Tags)
|
||||
}
|
||||
if rel.Tags["landusage"] != "forest" {
|
||||
|
@ -214,7 +215,7 @@ func TestMultiPolygonWithNeastedHoles(t *testing.T) {
|
|||
{1, 4, 4},
|
||||
})
|
||||
|
||||
rel := element.Relation{OSMElem: element.OSMElem{Id: 1}}
|
||||
rel := element.Relation{OSMElem: element.OSMElem{Id: 1, Tags: element.Tags{"landusage": "forest", "type": "multipolygon"}}}
|
||||
rel.Members = []element.Member{
|
||||
{Id: 1, Type: element.WAY, Role: "outer", Way: &w1},
|
||||
{Id: 2, Type: element.WAY, Role: "inner", Way: &w2},
|
||||
|
@ -230,7 +231,7 @@ func TestMultiPolygonWithNeastedHoles(t *testing.T) {
|
|||
g := geos.NewGeos()
|
||||
defer g.Finish()
|
||||
|
||||
if len(rel.Tags) != 1 {
|
||||
if len(rel.Tags) != 2 {
|
||||
t.Fatal("wrong rel tags", rel.Tags)
|
||||
}
|
||||
if rel.Tags["landusage"] != "forest" {
|
||||
|
@ -261,7 +262,7 @@ func TestPolygonFromThreeWays(t *testing.T) {
|
|||
{1, 0, 0},
|
||||
})
|
||||
|
||||
rel := element.Relation{OSMElem: element.OSMElem{Id: 1}}
|
||||
rel := element.Relation{OSMElem: element.OSMElem{Id: 1, Tags: element.Tags{"landusage": "forest", "type": "multipolygon"}}}
|
||||
rel.Members = []element.Member{
|
||||
{Id: 1, Type: element.WAY, Role: "outer", Way: &w1},
|
||||
{Id: 2, Type: element.WAY, Role: "inner", Way: &w2},
|
||||
|
@ -275,7 +276,7 @@ func TestPolygonFromThreeWays(t *testing.T) {
|
|||
g := geos.NewGeos()
|
||||
defer g.Finish()
|
||||
|
||||
if len(rel.Tags) != 1 {
|
||||
if len(rel.Tags) != 2 {
|
||||
t.Fatal("wrong rel tags", rel.Tags)
|
||||
}
|
||||
if rel.Tags["landusage"] != "forest" {
|
||||
|
|
|
@ -35,15 +35,6 @@
|
|||
<tag k="name" v="way 11001"/>
|
||||
<tag k="natural" v="water"/>
|
||||
</way>
|
||||
<way id="12001" version="2" timestamp="2011-11-11T00:11:11Z">
|
||||
<nd ref="12001"/>
|
||||
<nd ref="12002"/>
|
||||
<nd ref="12003"/>
|
||||
<nd ref="12004"/>
|
||||
<nd ref="12001"/>
|
||||
<tag k="name" v="way 12001"/>
|
||||
<tag k="natural" v="water"/>
|
||||
</way>
|
||||
<relation id="13001" version="2" timestamp="2011-11-11T00:11:11Z">
|
||||
<member type="way" ref="13001" role="outer"/>
|
||||
<tag k="natural" v="water"/>
|
||||
|
@ -71,6 +62,7 @@
|
|||
<tag k="natural" v="water"/>
|
||||
</way>
|
||||
<relation id="14001" version="2" timestamp="2011-11-11T00:11:11Z">
|
||||
<!-- now a new style relation -->
|
||||
<member type="way" ref="14001" role="outer"/>
|
||||
<member type="way" ref="14011" role="inner"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
|
|
|
@ -94,7 +94,6 @@
|
|||
<nd ref="1005"/>
|
||||
<nd ref="1001"/>
|
||||
<tag k="name" v="way 1001"/>
|
||||
<tag k="landuse" v="wood"/>
|
||||
</way>
|
||||
<way id="1002" version="1" timestamp="2011-11-11T00:11:11Z">
|
||||
<nd ref="1006"/>
|
||||
|
@ -267,6 +266,7 @@
|
|||
<relation id="1001" version="1" timestamp="2011-11-11T00:11:11Z">
|
||||
<member type="way" ref="1001" role="outer"/>
|
||||
<member type="way" ref="1002" role="inner"/>
|
||||
<tag k="landuse" v="wood"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
</relation>
|
||||
<relation id="2001" version="1" timestamp="2011-11-11T00:11:11Z">
|
||||
|
@ -524,7 +524,6 @@
|
|||
<nd ref="9201"/>
|
||||
<nd ref="9202"/>
|
||||
<nd ref="9203"/>
|
||||
<tag k="landuse" v="park"/>
|
||||
<tag k="highway" v="secondary"/>
|
||||
<tag k="name" v="9209"/>
|
||||
</way>
|
||||
|
@ -540,37 +539,10 @@
|
|||
<member type="way" ref="9209" role="outer"/>
|
||||
<member type="way" ref="9210" role="outer"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
</relation>
|
||||
|
||||
<!-- test multipolygon ways were inserted (same as 92xx, but different tagging) -->
|
||||
<node id="9301" version="1" timestamp="2011-11-11T00:11:11Z" lat="47" lon="80"/>
|
||||
<node id="9302" version="1" timestamp="2011-11-11T00:11:11Z" lat="47" lon="82"/>
|
||||
<node id="9303" version="1" timestamp="2011-11-11T00:11:11Z" lat="49" lon="82"/>
|
||||
<node id="9304" version="1" timestamp="2011-11-11T00:11:11Z" lat="49" lon="80"/>
|
||||
<way id="9309" version="1" timestamp="2011-11-11T00:11:11Z">
|
||||
<nd ref="9301"/>
|
||||
<nd ref="9302"/>
|
||||
<nd ref="9303"/>
|
||||
<tag k="landuse" v="park"/>
|
||||
<tag k="highway" v="secondary"/>
|
||||
<tag k="name" v="9309"/>
|
||||
</way>
|
||||
<way id="9310" version="1" timestamp="2011-11-11T00:11:11Z">
|
||||
<nd ref="9303"/>
|
||||
<nd ref="9304"/>
|
||||
<nd ref="9301"/>
|
||||
<tag k="highway" v="residential"/>
|
||||
<tag k="name" v="9310"/>
|
||||
</way>
|
||||
<relation id="9301" version="1" timestamp="2011-11-11T00:11:11Z">
|
||||
<member type="way" ref="9309" role="outer"/>
|
||||
<member type="way" ref="9310" role="outer"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
<tag k="landuse" v="park"/>
|
||||
</relation>
|
||||
|
||||
|
||||
|
||||
<!-- test multipolygon way was inserted -->
|
||||
<node id="8001" version="1" timestamp="2011-11-11T00:11:11Z" lat="47" lon="80"/>
|
||||
<node id="8002" version="1" timestamp="2011-11-11T00:11:11Z" lat="47" lon="82"/>
|
||||
|
@ -606,25 +578,6 @@
|
|||
<tag k="landuse" v="park"/>
|
||||
</way>
|
||||
|
||||
<!-- test for changed tags in way belonging to relation -->
|
||||
<node id="12001" version="1" timestamp="2011-11-11T00:11:11Z" lat="47" lon="85"/>
|
||||
<node id="12002" version="1" timestamp="2011-11-11T00:11:11Z" lat="47" lon="86"/>
|
||||
<node id="12003" version="1" timestamp="2011-11-11T00:11:11Z" lat="49" lon="86"/>
|
||||
<node id="12004" version="1" timestamp="2011-11-11T00:11:11Z" lat="49" lon="85"/>
|
||||
<way id="12001" version="1" timestamp="2011-11-11T00:11:11Z">
|
||||
<nd ref="12001"/>
|
||||
<nd ref="12002"/>
|
||||
<nd ref="12003"/>
|
||||
<nd ref="12004"/>
|
||||
<nd ref="12001"/>
|
||||
<tag k="name" v="way 12001"/>
|
||||
<tag k="landuse" v="park"/>
|
||||
</way>
|
||||
<relation id="12001" version="1" timestamp="2011-11-11T00:11:11Z">
|
||||
<member type="way" ref="12001" role="outer"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
</relation>
|
||||
|
||||
<!-- test for changed tags in relation -->
|
||||
<node id="13001" version="1" timestamp="2011-11-11T00:11:11Z" lat="47" lon="87"/>
|
||||
<node id="13002" version="1" timestamp="2011-11-11T00:11:11Z" lat="47" lon="88"/>
|
||||
|
@ -672,6 +625,7 @@
|
|||
<tag k="name" v="way 14011"/>
|
||||
</way>
|
||||
<relation id="14001" version="1" timestamp="2011-11-11T00:11:11Z">
|
||||
<!-- old style relation not inserted -->
|
||||
<member type="way" ref="14001" role="outer"/>
|
||||
<member type="way" ref="14011" role="inner"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
|
@ -694,7 +648,6 @@
|
|||
<nd ref="15004"/>
|
||||
<nd ref="15001"/>
|
||||
<tag k="name" v="way 15001"/>
|
||||
<tag k="landuse" v="park"/>
|
||||
</way>
|
||||
<way id="15011" version="1" timestamp="2011-11-11T00:11:11Z">
|
||||
<nd ref="15011"/>
|
||||
|
@ -708,6 +661,7 @@
|
|||
<member type="way" ref="15001" role="outer"/>
|
||||
<member type="way" ref="15011" role="inner"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
<tag k="landuse" v="park"/>
|
||||
</relation>
|
||||
|
||||
|
||||
|
@ -947,7 +901,7 @@
|
|||
<tag k="landuse" v="park"/>
|
||||
</relation>
|
||||
|
||||
<!-- test removing of relation (r:50121) without tags -->
|
||||
<!-- test old-style relation does not affect way -->
|
||||
<node id="50101" version="1" timestamp="2011-11-11T00:11:11Z" lat="42" lon="10"/>
|
||||
<node id="50102" version="1" timestamp="2011-11-11T00:11:11Z" lat="42" lon="11"/>
|
||||
<node id="50103" version="1" timestamp="2011-11-11T00:11:11Z" lat="44" lon="10"/>
|
||||
|
@ -1031,10 +985,10 @@
|
|||
<nd ref="52103"/>
|
||||
<nd ref="52104"/>
|
||||
<nd ref="52101"/>
|
||||
<tag k="building" v="yes"/>
|
||||
</way>
|
||||
<relation id="52121" version="1" timestamp="2011-11-11T00:11:11Z">
|
||||
<member type="way" ref="52111" role="outer"/>
|
||||
<tag k="building" v="yes"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
</relation>
|
||||
|
||||
|
|
|
@ -66,32 +66,25 @@ func TestComplete_LandusageToWaterarea1(t *testing.T) {
|
|||
cache := ts.cache(t)
|
||||
defer cache.Close()
|
||||
assertCachedWay(t, cache, 11001)
|
||||
assertCachedWay(t, cache, 12001)
|
||||
assertCachedWay(t, cache, 13001)
|
||||
|
||||
assertRecords(t, []checkElem{
|
||||
{"osm_waterareas", 11001, Missing, nil},
|
||||
{"osm_waterareas", -12001, Missing, nil},
|
||||
{"osm_waterareas", -13001, Missing, nil},
|
||||
|
||||
{"osm_waterareas_gen0", 11001, Missing, nil},
|
||||
{"osm_waterareas_gen0", -12001, Missing, nil},
|
||||
{"osm_waterareas_gen0", -13001, Missing, nil},
|
||||
|
||||
{"osm_waterareas_gen1", 11001, Missing, nil},
|
||||
{"osm_waterareas_gen1", -12001, Missing, nil},
|
||||
{"osm_waterareas_gen1", -13001, Missing, nil},
|
||||
|
||||
{"osm_landusages", 11001, "park", nil},
|
||||
{"osm_landusages", -12001, "park", nil},
|
||||
{"osm_landusages", -13001, "park", nil},
|
||||
|
||||
{"osm_landusages_gen0", 11001, "park", nil},
|
||||
{"osm_landusages_gen0", -12001, "park", nil},
|
||||
{"osm_landusages_gen0", -13001, "park", nil},
|
||||
|
||||
{"osm_landusages_gen1", 11001, "park", nil},
|
||||
{"osm_landusages_gen1", -12001, "park", nil},
|
||||
{"osm_landusages_gen1", -13001, "park", nil},
|
||||
})
|
||||
}
|
||||
|
@ -106,7 +99,8 @@ func TestComplete_ChangedHoleTags1(t *testing.T) {
|
|||
assertRecords(t, []checkElem{
|
||||
{"osm_waterareas", 14011, Missing, nil},
|
||||
{"osm_waterareas", -14011, Missing, nil},
|
||||
{"osm_landusages", -14001, "park", nil},
|
||||
{"osm_landusages", 14001, "park", nil},
|
||||
{"osm_landusages", -14001, Missing, nil},
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -218,19 +212,15 @@ func TestComplete_RelationWayNotInserted(t *testing.T) {
|
|||
func TestComplete_RelationWaysInserted(t *testing.T) {
|
||||
// Outer ways of multipolygon are inserted.
|
||||
assertRecords(t, []checkElem{
|
||||
{"osm_landusages", -9201, "park", map[string]string{"name": "9209"}},
|
||||
// no name on relation
|
||||
{"osm_landusages", -9201, "park", map[string]string{"name": ""}},
|
||||
{"osm_landusages", 9201, Missing, nil},
|
||||
{"osm_landusages", 9209, Missing, nil},
|
||||
{"osm_landusages", 9210, Missing, nil},
|
||||
// outer ways of multipolygon stand for their own
|
||||
{"osm_roads", 9209, "secondary", map[string]string{"name": "9209"}},
|
||||
{"osm_roads", 9210, "residential", map[string]string{"name": "9210"}},
|
||||
|
||||
// no name on relation
|
||||
{"osm_landusages", -9301, "park", map[string]string{"name": ""}},
|
||||
// outer ways of multipolygon stand for their own
|
||||
{"osm_roads", 9309, "secondary", map[string]string{"name": "9309"}},
|
||||
{"osm_roads", 9310, "residential", map[string]string{"name": "9310"}},
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func TestComplete_RelationWayInserted(t *testing.T) {
|
||||
|
@ -283,12 +273,12 @@ func TestComplete_RelationBeforeRemove(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestComplete_RelationWithoutTags(t *testing.T) {
|
||||
// Relation without tags is inserted.
|
||||
func TestComplete_OldStyleRelationIsIgnored(t *testing.T) {
|
||||
// Relation without tags is not inserted.
|
||||
|
||||
assertRecords(t, []checkElem{
|
||||
{"osm_buildings", 50111, Missing, nil},
|
||||
{"osm_buildings", -50121, "yes", nil},
|
||||
{"osm_buildings", 50111, "yes", nil},
|
||||
{"osm_buildings", -50121, Missing, nil},
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -483,27 +473,21 @@ func TestComplete_LandusageToWaterarea2(t *testing.T) {
|
|||
|
||||
assertRecords(t, []checkElem{
|
||||
{"osm_waterareas", 11001, "water", nil},
|
||||
{"osm_waterareas", -12001, "water", nil},
|
||||
{"osm_waterareas", -13001, "water", nil},
|
||||
|
||||
{"osm_waterareas_gen0", 11001, "water", nil},
|
||||
{"osm_waterareas_gen0", -12001, "water", nil},
|
||||
{"osm_waterareas_gen0", -13001, "water", nil},
|
||||
|
||||
{"osm_waterareas_gen1", 11001, "water", nil},
|
||||
{"osm_waterareas_gen1", -12001, "water", nil},
|
||||
{"osm_waterareas_gen1", -13001, "water", nil},
|
||||
|
||||
{"osm_landusages", 11001, Missing, nil},
|
||||
{"osm_landusages", -12001, Missing, nil},
|
||||
{"osm_landusages", -13001, Missing, nil},
|
||||
|
||||
{"osm_landusages_gen0", 11001, Missing, nil},
|
||||
{"osm_landusages_gen0", -12001, Missing, nil},
|
||||
{"osm_landusages_gen0", -13001, Missing, nil},
|
||||
|
||||
{"osm_landusages_gen1", 11001, Missing, nil},
|
||||
{"osm_landusages_gen1", -12001, Missing, nil},
|
||||
{"osm_landusages_gen1", -13001, Missing, nil},
|
||||
})
|
||||
}
|
||||
|
@ -518,6 +502,11 @@ func TestComplete_ChangedHoleTags2(t *testing.T) {
|
|||
|
||||
assertGeomArea(t, checkElem{"osm_waterareas", 14011, "water", nil}, 26672019779)
|
||||
assertGeomArea(t, checkElem{"osm_landusages", -14001, "park", nil}, 10373697182)
|
||||
|
||||
assertRecords(t, []checkElem{
|
||||
{"osm_waterareas", -14011, Missing, nil},
|
||||
{"osm_landusages", -14001, "park", nil},
|
||||
})
|
||||
}
|
||||
|
||||
func TestComplete_SplitOuterMultipolygonWay2(t *testing.T) {
|
||||
|
|
|
@ -159,7 +159,7 @@ func TestSingleTable_DuplicateIds1(t *testing.T) {
|
|||
}
|
||||
|
||||
assertHstore(t, []checkElem{
|
||||
{"osm_all", RelOffset - 31101, "*", map[string]string{"building": "yes"}},
|
||||
{"osm_all", RelOffset - 31101, "*", map[string]string{"building": "yes", "type": "multipolygon"}},
|
||||
})
|
||||
assertGeomType(t, checkElem{"osm_all", RelOffset - 31101, "*", nil}, "Polygon")
|
||||
}
|
||||
|
@ -185,7 +185,7 @@ func TestSingleTable_DuplicateIds2(t *testing.T) {
|
|||
}
|
||||
|
||||
assertHstore(t, []checkElem{
|
||||
{"osm_all", RelOffset - 31101, "*", map[string]string{"building": "yes"}},
|
||||
{"osm_all", RelOffset - 31101, "*", map[string]string{"building": "yes", "type": "multipolygon"}},
|
||||
})
|
||||
assertGeomType(t, checkElem{"osm_all", RelOffset - 31101, "*", nil}, "Polygon")
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue