handle ways without refs/nodes in ring builder
fixes 'index out of range' panicsmaster
parent
f08ac11f68
commit
de4ec76ed8
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"/>
|
||||
|
|
Loading…
Reference in New Issue