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)
|
endpoints := make(map[int64]*Ring)
|
||||||
|
|
||||||
for _, ring := range rings {
|
for _, ring := range rings {
|
||||||
|
if len(ring.refs) < 2 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
left := ring.refs[0]
|
left := ring.refs[0]
|
||||||
right := ring.refs[len(ring.refs)-1]
|
right := ring.refs[len(ring.refs)-1]
|
||||||
if origRing, ok := endpoints[left]; ok {
|
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) {
|
func TestRingMergeReverseEndpoints(t *testing.T) {
|
||||||
w1 := element.Way{}
|
w1 := element.Way{}
|
||||||
w1.Id = 1
|
w1.Id = 1
|
||||||
|
|
|
@ -292,6 +292,18 @@ def test_merge_outer_multipolygon_way_1():
|
||||||
assert_almost_equal(park_16001['geometry'].area, 12779350582, -1)
|
assert_almost_equal(park_16001['geometry'].area, 12779350582, -1)
|
||||||
assert query_row(db_conf, 'osm_roads', 16002)['type'] == 'residential'
|
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():
|
def test_node_way_ref_after_delete_1():
|
||||||
"""Nodes refereces way"""
|
"""Nodes refereces way"""
|
||||||
data = cache_query(nodes=[20001, 20002], deps=True)
|
data = cache_query(nodes=[20001, 20002], deps=True)
|
||||||
|
|
|
@ -641,6 +641,52 @@
|
||||||
</relation>
|
</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 -->
|
<!-- 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">
|
<node id="20001" version="1" timestamp="2011-11-11T00:11:11Z" lat="30" lon="10">
|
||||||
<tag k="name" v="way 14001"/>
|
<tag k="name" v="way 14001"/>
|
||||||
|
|
Loading…
Reference in New Issue