Skip to content

Commit 0130d8e

Browse files
committed
skip non-way members, skip incompleted ways, prevent global modification of Document with way
1 parent 0c52fe6 commit 0130d8e

File tree

5 files changed

+18
-11
lines changed

5 files changed

+18
-11
lines changed

src/building.js

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

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/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)