handle ways without refs/nodes in ring builder

fixes 'index out of range' panics
master
Oliver Tonnhofer 2014-01-14 12:06:43 +01:00
parent f08ac11f68
commit de4ec76ed8
4 changed files with 89 additions and 0 deletions

View File

@ -82,6 +82,9 @@ func mergeRings(rings []*Ring) []*Ring {
endpoints := make(map[int64]*Ring)
for _, ring := range rings {
if len(ring.refs) < 2 {
continue
}
left := ring.refs[0]
right := ring.refs[len(ring.refs)-1]
if origRing, ok := endpoints[left]; ok {

View File

@ -41,6 +41,34 @@ func TestRingMerge(t *testing.T) {
}
}
func TestRingMergeMissingRefs(t *testing.T) {
// way without refs should not panic with index out of range
w1 := element.Way{}
w1.Id = 1
w1.Refs = []int64{1, 2, 3}
w1.Nodes = []element.Node{
element.Node{},
element.Node{},
element.Node{},
}
r1 := NewRing(&w1)
w2 := element.Way{}
w2.Id = 2
w2.Refs = []int64{}
w2.Nodes = []element.Node{}
r2 := NewRing(&w2)
rings := []*Ring{r1, r2}
result := mergeRings(rings)
if len(result) != 1 {
t.Fatal(result)
}
if result[0] != r1 {
t.Fatal(result[0])
}
}
func TestRingMergeReverseEndpoints(t *testing.T) {
w1 := element.Way{}
w1.Id = 1

View File

@ -292,6 +292,18 @@ def test_merge_outer_multipolygon_way_1():
assert_almost_equal(park_16001['geometry'].area, 12779350582, -1)
assert query_row(db_conf, 'osm_roads', 16002)['type'] == 'residential'
def test_broken_multipolygon_ways():
"""MultiPolygons with broken outer ways are handled."""
# outer way does not merge (17002 has one node)
assert query_row(db_conf, 'osm_landusages', -17001) == None
assert query_row(db_conf, 'osm_roads', 17001)['type'] == 'residential'
assert query_row(db_conf, 'osm_roads', 17002) == None
# outer way does not merge (17102 has no nodes)
assert query_row(db_conf, 'osm_landusages', -17101) == None
assert query_row(db_conf, 'osm_roads', 17101)['type'] == 'residential'
assert query_row(db_conf, 'osm_roads', 17102) == None
def test_node_way_ref_after_delete_1():
"""Nodes refereces way"""
data = cache_query(nodes=[20001, 20002], deps=True)

View File

@ -641,6 +641,52 @@
</relation>
<!-- test handling of incomplete/broken ways -->
<node id="17001" version="1" timestamp="2011-11-11T00:11:11Z" lat="41" lon="89"/>
<node id="17002" version="1" timestamp="2011-11-11T00:11:11Z" lat="41" lon="90"/>
<node id="17003" version="1" timestamp="2011-11-11T00:11:11Z" lat="44" lon="90"/>
<node id="17004" version="1" timestamp="2011-11-11T00:11:11Z" lat="44" lon="89"/>
<way id="17001" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="17001"/>
<nd ref="17002"/>
<nd ref="17003"/>
<tag k="name" v="way 17001"/>
<tag k="highway" v="residential"/>
</way>
<!-- way with single ref -->
<way id="17002" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="17003"/>
<tag k="name" v="way 17002"/>
<tag k="highway" v="residential"/>
</way>
<relation id="17001" version="1" timestamp="2011-11-11T00:11:11Z">
<member type="way" ref="17001" role="outer"/>
<member type="way" ref="17002" role="outer"/>
<tag k="type" v="multipolygon"/>
<tag k="landuse" v="park"/>
</relation>
<way id="17101" version="1" timestamp="2011-11-11T00:11:11Z">
<nd ref="17001"/>
<nd ref="17002"/>
<nd ref="17003"/>
<tag k="name" v="way 17101"/>
<tag k="highway" v="residential"/>
</way>
<!-- way with no ref -->
<way id="17102" version="1" timestamp="2011-11-11T00:11:11Z">
<tag k="name" v="way 17102"/>
<tag k="highway" v="residential"/>
</way>
<relation id="17101" version="1" timestamp="2011-11-11T00:11:11Z">
<member type="way" ref="17101" role="outer"/>
<member type="way" ref="17102" role="outer"/>
<tag k="type" v="multipolygon"/>
<tag k="landuse" v="park"/>
</relation>
<!-- test that node (n:20001) does not reference way (w:20001) after it was deleted -->
<node id="20001" version="1" timestamp="2011-11-11T00:11:11Z" lat="30" lon="10">
<tag k="name" v="way 14001"/>