Skip to content

Commit 874b3fe

Browse files
authored
Skip incompleted ways, skip non-way members, prevent global modification of way object (#100)
* skip non-way members, skip incompleted ways, prevent global modification of Document with way * add test
1 parent e1105a8 commit 874b3fe

File tree

6 files changed

+62
-11
lines changed

6 files changed

+62
-11
lines changed

src/building.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,11 @@ class Building {
199199
for (let i = 0; i < parts.length; i++) {
200200
if (parts[i].querySelector('[k="building:part"]')) {
201201
const id = parts[i].getAttribute('id');
202-
this.parts.push(new MultiBuildingPart(id, this.fullXmlData, this.nodelist, this.outerElement.options));
202+
try {
203+
this.parts.push(new MultiBuildingPart(id, this.fullXmlData, this.nodelist, this.outerElement.options));
204+
} catch (e) {
205+
window.printError(e);
206+
}
203207
}
204208
}
205209
}

src/multibuildingpart.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ class MultiBuildingPart extends BuildingPart {
1414
*/
1515
buildShape() {
1616
this.type = 'multipolygon';
17-
const innerMembers = this.way.querySelectorAll('member[role="inner"]');
18-
const outerMembers = this.way.querySelectorAll('member[role="outer"]');
17+
const innerMembers = this.way.querySelectorAll('member[role="inner"][type="way"]');
18+
const outerMembers = this.way.querySelectorAll('member[role="outer"][type="way"]');
1919
const innerShapes = [];
2020
var shapes = [];
2121
for (let i = 0; i < innerMembers.length; i++) {
@@ -25,7 +25,10 @@ class MultiBuildingPart extends BuildingPart {
2525
const ways = [];
2626
for (let j = 0; j < outerMembers.length; j++) {
2727
const way = this.fullXmlData.getElementById(outerMembers[j].getAttribute('ref'));
28-
ways.push(way);
28+
if (way === null) {
29+
throw `Incompleted way ${outerMembers[j].getAttribute('ref')}`;
30+
}
31+
ways.push(way.cloneNode(true));
2932
}
3033
const closedWays = BuildingShapeUtils.combineWays(ways);
3134
for (let k = 0; k < closedWays.length; k++) {

test/building.test.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,50 @@ test('Visible Outer Building', () => {
131131
expect(mesh[1].visible).toBe(true);
132132
});
133133

134+
135+
test('Test with neighboring incomplete building:part relation', () => {
136+
const data = `<?xml version="1.0" encoding="UTF-8"?>
137+
<osm>
138+
<node id="1" lat="59.9297360" lon="30.4883115"/>
139+
<node id="2" lat="59.9293517" lon="30.4883115"/>
140+
<node id="3" lat="59.9293516" lon="30.4892180"/>
141+
<node id="4" lat="59.9297360" lon="30.4892179"/>
142+
<node id="5" lat="59.9279610" lon="30.4840202"/>
143+
<node id="6" lat="59.9295379" lon="30.4879181"/>
144+
<node id="7" lat="59.9283455" lon="30.4831137"/>
145+
<way id="222">
146+
<nd ref="3"/>
147+
<nd ref="4"/>
148+
<nd ref="1"/>
149+
</way>
150+
<way id="333">
151+
<nd ref="1"/>
152+
<nd ref="2"/>
153+
<nd ref="3"/>
154+
</way>
155+
<way id="444">
156+
<nd ref="5"/>
157+
<nd ref="6"/>
158+
<nd ref="7"/>
159+
</way>
160+
<relation id="42">
161+
<member type="way" ref="222" role="outer"/>
162+
<member type="way" ref="333" role="outer"/>
163+
<tag k="building" v="apartments"/>
164+
<tag k="type" v="multipolygon"/>
165+
</relation>
166+
<relation id="40">
167+
<member type="way" ref="444" role="outer"/>
168+
<member type="way" ref="1000" role="outer"/>
169+
<tag k="building:part" v="yes"/>
170+
<tag k="type" v="multipolygon"/>
171+
</relation>
172+
</osm>
173+
`;
174+
expect(new Building('42', data).id).toBe('42');
175+
});
176+
177+
134178
window.printError = printError;
135179

136180
var errors = [];

test/multipolygon.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const data = `
1616
<node id="6" lat="4.001" lon="4.001"/>
1717
<node id="7" lat="4.001" lon="4"/>
1818
<relation id="4">
19-
<member ref="1" role="outer"/>
19+
<member ref="1" role="outer" type="way"/>
2020
<tag k="type" v="multipolygon"/>
2121
<tag k="building" v="yes"/>
2222
<tag k="roof:shape" v="skillion"/>

test/split_way_multipolygon.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ const data = `
1919
<node id="9" lat="4.00025" lon="4.00075"/>
2020
<node id="10" lat="4.00075" lon="4.0005"/>
2121
<relation id="5">
22-
<member ref="1" role="outer"/>
23-
<member ref="3" role="outer"/>
24-
<member ref="2" role="inner"/>
22+
<member ref="1" role="outer" type="way"/>
23+
<member ref="3" role="outer" type="way"/>
24+
<member ref="2" role="inner" type="way"/>
2525
<tag k="type" v="multipolygon"/>
2626
<tag k="building" v="yes"/>
2727
<tag k="roof:shape" v="skillion"/>

test/split_way_multipolygon_reverse.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ const data = `
1919
<node id="9" lat="4.00025" lon="4.00075"/>
2020
<node id="10" lat="4.00075" lon="4.0005"/>
2121
<relation id="5">
22-
<member ref="1" role="outer"/>
23-
<member ref="3" role="outer"/>
24-
<member ref="2" role="inner"/>
22+
<member ref="1" role="outer" type="way"/>
23+
<member ref="3" role="outer" type="way"/>
24+
<member ref="2" role="inner" type="way"/>
2525
<tag k="type" v="multipolygon"/>
2626
<tag k="building" v="yes"/>
2727
<tag k="roof:shape" v="skillion"/>

0 commit comments

Comments
 (0)