@wemap/osm 2.7.5 → 2.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/itinerary-montpellier-outdoor-errored.json +1 -0
- package/assets/itinerary-montpellier-outdoor-without-steps.json +1 -0
- package/assets/network-conveying-backward.osm +74 -0
- package/assets/network-elevator.osm +48 -0
- package/assets/network-simple.osm +27 -0
- package/assets/network-with-modifiers.osm +39 -0
- package/assets/simple.osm +31 -0
- package/package.json +5 -5
- package/src/model/OsmElement.js +5 -2
- package/src/model/OsmElement.spec.js +11 -0
- package/src/model/OsmModel.js +11 -9
- package/src/model/OsmModel.spec.js +57 -0
- package/src/model/OsmNode.js +5 -13
- package/src/model/OsmNode.spec.js +14 -0
- package/src/model/OsmParser.js +18 -6
- package/src/model/OsmParser.spec.js +49 -0
- package/src/model/OsmWay.js +4 -8
- package/src/network/OsmNetwork.js +7 -8
- package/src/network/OsmNetwork.spec.js +103 -0
- package/src/network/OsmRouter.js +13 -15
- package/src/network/OsmRouter.spec.js +34 -19
- package/src/osrm/OsrmUtils.js +61 -61
- package/src/osrm/OsrmUtils.spec.js +184 -97
- /package/assets/{itinerary-osrm.json → itinerary-montpellier-outdoor.json} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"code":"Ok","routes":[{"geometry":{"coordinates":[[3.875607,43.600777],[3.875723,43.600109],[3.875766,43.600086],[3.876247,43.599974],[3.876341,43.599956],[3.876396,43.599881],[3.876234,43.599853],[3.875869,43.599787],[3.875829,43.599781],[3.875671,43.599759],[3.875643,43.599755],[3.875606,43.599749],[3.875578,43.599746],[3.875498,43.599734],[3.87536,43.599707],[3.875169,43.599674],[3.874655,43.599577],[3.874623,43.599063],[3.873865,43.59906]],"type":"LineString"},"legs":[{"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[173],"location":[3.875607,43.600777]}],"driving_side":"right","geometry":{"coordinates":[[3.875607,43.600777],[3.875723,43.600109],[3.875766,43.600086],[3.876247,43.599974],[3.876341,43.599956],[3.876396,43.599881]],"type":"LineString"},"mode":"walking","duration":98.7,"maneuver":{"bearing_after":173,"type":"depart","modifier":"left","bearing_before":0,"location":[3.875607,43.600777]},"weight":98.7,"distance":137.2,"name":""},{"intersections":[{"out":1,"location":[3.876396,43.599881],"bearings":[75,255,330],"entry":[true,true,false],"in":2},{"out":2,"location":[3.876234,43.599853],"bearings":[75,180,255],"entry":[false,true,true],"in":0},{"out":2,"location":[3.875829,43.599781],"bearings":[75,195,255],"entry":[false,true,true],"in":0},{"out":2,"location":[3.875643,43.599755],"bearings":[75,135,255],"entry":[false,true,true],"in":0},{"out":2,"location":[3.875498,43.599734],"bearings":[75,165,255,345],"entry":[false,true,true,true],"in":0},{"out":2,"location":[3.875169,43.599674],"bearings":[75,180,255],"entry":[false,true,true],"in":0}],"driving_side":"right","geometry":{"coordinates":[[3.876396,43.599881],[3.876234,43.599853],[3.875869,43.599787],[3.875829,43.599781],[3.875671,43.599759],[4.875643,43.599755],[3.875606,43.599749],[3.875578,43.599746],[3.875498,43.599734],[3.87536,43.599707],[3.875169,43.599674],[3.874655,43.599577]],"type":"LineString"},"mode":"walking","duration":103.9,"maneuver":{"bearing_after":255,"type":"turn","modifier":"right","bearing_before":149,"location":[3.876396,43.599881]},"weight":103.9,"distance":144.3,"name":"Boulevard Vieussens"},{"intersections":[{"out":1,"location":[3.874655,43.599577],"bearings":[75,180,255],"entry":[false,true,true],"in":0}],"driving_side":"right","geometry":{"coordinates":[[3.874655,43.599577],[3.874623,43.599063]],"type":"LineString"},"mode":"walking","duration":41.2,"maneuver":{"bearing_after":181,"type":"turn","modifier":"left","bearing_before":254,"location":[3.874655,43.599577]},"weight":41.2,"distance":57.2,"name":"Impasse Bizeray"},{"intersections":[{"out":2,"location":[3.874623,43.599063],"bearings":[0,90,270],"entry":[false,true,true],"in":0}],"driving_side":"right","geometry":{"coordinates":[[3.874623,43.599063],[3.873865,43.59906]],"type":"LineString"},"mode":"walking","duration":44,"maneuver":{"bearing_after":268,"type":"turn","modifier":"right","bearing_before":181,"location":[3.874623,43.599063]},"weight":44,"distance":61.1,"name":"Rue du Docteur Louis Perrier"},{"intersections":[{"in":0,"entry":[true],"bearings":[90],"location":[3.873865,43.59906]}],"driving_side":"right","geometry":{"coordinates":[[3.873865,43.59906],[3.873865,43.59906]],"type":"LineString"},"mode":"walking","duration":0,"maneuver":{"bearing_after":0,"type":"arrive","modifier":"left","bearing_before":270,"location":[3.873865,43.59906]},"weight":0,"distance":0,"name":"Rue du Docteur Louis Perrier"}],"distance":399.7,"duration":287.8,"summary":"Boulevard Vieussens, Boulevard Berthelot","weight":287.8}],"distance":399.7,"duration":287.8,"weight_name":"duration","weight":287.8}],"waypoints":[{"hint":"d89TgaHPU4GmAQAAGwIAAB0AAADAAQAApgEAABsCAAAdAAAAwAEAAAIAAAAXIzsAiUuZAoojOwCTS5kCAQDPCg61bn8=","name":"","location":[3.875607,43.600777]},{"hint":"dNRTgZbUU4FHAAAAuAEAAIMAAAAAAAAARwAAALgBAACDAAAAAAAAAAIAAABJHDsA1ESZAkocOwAdRJkCAwCfBQ61bn8=","name":"Rue du Docteur Louis Perrier","location":[3.873865,43.59906]}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"code":"Ok","routes":[{"geometry":{"coordinates":[[3.875607,43.600777],[3.875723,43.600109],[3.875766,43.600086],[3.876247,43.599974],[3.876341,43.599956],[3.876396,43.599881],[3.876234,43.599853],[3.875869,43.599787],[3.875829,43.599781],[3.875671,43.599759],[3.875643,43.599755],[3.875606,43.599749],[3.875578,43.599746],[3.875498,43.599734],[3.87536,43.599707],[3.875169,43.599674],[3.874655,43.599577],[3.874623,43.599063],[3.873865,43.59906]],"type":"LineString"},"distance":399.7,"duration":287.8,"weight_name":"duration","weight":287.8}],"waypoints":[{"hint":"d89TgaHPU4GmAQAAGwIAAB0AAADAAQAApgEAABsCAAAdAAAAwAEAAAIAAAAXIzsAiUuZAoojOwCTS5kCAQDPCg61bn8=","name":"","location":[3.875607,43.600777]},{"hint":"dNRTgZbUU4FHAAAAuAEAAIMAAAAAAAAARwAAALgBAACDAAAAAAAAAAIAAABJHDsA1ESZAkocOwAdRJkCAwCfBQ61bn8=","name":"Rue du Docteur Louis Perrier","location":[3.873865,43.59906]}]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
|
2
|
+
<osm version='0.6' generator='JOSM'>
|
|
3
|
+
<node id='-519157' action='modify' visible='true' lat='48.84445412307' lon='2.37216128192'>
|
|
4
|
+
<tag k='name' v='p6' />
|
|
5
|
+
</node>
|
|
6
|
+
<node id='-519158' action='modify' visible='true' lat='48.84456231196' lon='2.37194113366'>
|
|
7
|
+
<tag k='name' v='p11' />
|
|
8
|
+
</node>
|
|
9
|
+
<node id='-519161' action='modify' visible='true' lat='48.84459094139' lon='2.37200629832'>
|
|
10
|
+
<tag k='name' v='p13' />
|
|
11
|
+
</node>
|
|
12
|
+
<node id='-519164' action='modify' visible='true' lat='48.8445706698' lon='2.3719601573'>
|
|
13
|
+
<tag k='name' v='p12' />
|
|
14
|
+
</node>
|
|
15
|
+
<node id='1395307661' action='modify' timestamp='2019-09-19T15:44:48Z' uid='439947' user='StephaneP' visible='true' version='11' changeset='74681133' lat='48.8444657' lon='2.3720493'>
|
|
16
|
+
<tag k='name' v='p7' />
|
|
17
|
+
</node>
|
|
18
|
+
<node id='1395307662' action='modify' timestamp='2019-09-19T15:44:48Z' uid='439947' user='StephaneP' visible='true' version='3' changeset='74681133' lat='48.8445534' lon='2.3719505'>
|
|
19
|
+
<tag k='name' v='p10' />
|
|
20
|
+
</node>
|
|
21
|
+
<node id='4086374112' action='modify' timestamp='2019-09-19T16:18:40Z' uid='439947' user='StephaneP' visible='true' version='3' changeset='74683089' lat='48.8444961' lon='2.3720441'>
|
|
22
|
+
<tag k='name' v='p8' />
|
|
23
|
+
</node>
|
|
24
|
+
<node id='4086374115' action='modify' timestamp='2019-09-19T15:44:48Z' uid='439947' user='StephaneP' visible='true' version='2' changeset='74681133' lat='48.844562' lon='2.3719702'>
|
|
25
|
+
<tag k='name' v='p9' />
|
|
26
|
+
</node>
|
|
27
|
+
<node id='4086374120' action='delete' timestamp='2019-09-19T16:18:40Z' uid='439947' user='StephaneP' visible='true' version='3' changeset='74683089' lat='48.8446803' lon='2.3718155'>
|
|
28
|
+
<tag k='level' v='-1' />
|
|
29
|
+
<tag k='name' v='p1' />
|
|
30
|
+
<tag k='railway' v='subway_entrance' />
|
|
31
|
+
<tag k='ref' v='13' />
|
|
32
|
+
<tag k='source' v='cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2011' />
|
|
33
|
+
<tag k='wheelchair' v='no' />
|
|
34
|
+
</node>
|
|
35
|
+
<way id='-519165' action='modify' visible='true'>
|
|
36
|
+
<nd ref='-519164' />
|
|
37
|
+
<nd ref='4086374115' />
|
|
38
|
+
<tag k='highway' v='footway' />
|
|
39
|
+
<tag k='level' v='0' />
|
|
40
|
+
</way>
|
|
41
|
+
<way id='-519168' action='modify' visible='true'>
|
|
42
|
+
<nd ref='1395307662' />
|
|
43
|
+
<nd ref='-519158' />
|
|
44
|
+
<nd ref='-519164' />
|
|
45
|
+
<nd ref='-519161' />
|
|
46
|
+
<tag k='highway' v='footway' />
|
|
47
|
+
<tag k='level' v='0' />
|
|
48
|
+
</way>
|
|
49
|
+
<way id='-519174' action='modify' visible='true'>
|
|
50
|
+
<nd ref='-519157' />
|
|
51
|
+
<nd ref='4086374112' />
|
|
52
|
+
<tag k='highway' v='footway' />
|
|
53
|
+
<tag k='level' v='-1' />
|
|
54
|
+
</way>
|
|
55
|
+
<way id='-519225' action='modify' visible='true'>
|
|
56
|
+
<nd ref='1395307661' />
|
|
57
|
+
<nd ref='-519157' />
|
|
58
|
+
<tag k='highway' v='footway' />
|
|
59
|
+
<tag k='level' v='-1' />
|
|
60
|
+
</way>
|
|
61
|
+
<way id='125679471' action='modify' timestamp='2016-04-15T07:37:33Z' uid='1908665' user='naomap' visible='true' version='4' changeset='38579747'>
|
|
62
|
+
<nd ref='1395307661' />
|
|
63
|
+
<nd ref='1395307662' />
|
|
64
|
+
<tag k='highway' v='steps' />
|
|
65
|
+
<tag k='level' v='-1;0' />
|
|
66
|
+
</way>
|
|
67
|
+
<way id='406582305' action='modify' timestamp='2016-04-15T07:37:40Z' uid='1908665' user='naomap' visible='true' version='2' changeset='38579747'>
|
|
68
|
+
<nd ref='4086374112' />
|
|
69
|
+
<nd ref='4086374115' />
|
|
70
|
+
<tag k='conveying' v='backward' />
|
|
71
|
+
<tag k='highway' v='steps' />
|
|
72
|
+
<tag k='level' v='-1;0' />
|
|
73
|
+
</way>
|
|
74
|
+
</osm>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
|
2
|
+
<osm>
|
|
3
|
+
<node id='1' lat='43.60933232537' lon='3.88424831515'>
|
|
4
|
+
<tag k='highway' v='elevator' />
|
|
5
|
+
<tag k='level' v='1;3' />
|
|
6
|
+
<tag k='name' v='p2' />
|
|
7
|
+
</node>
|
|
8
|
+
<node id='2' lat='43.60932786117' lon='3.88427765877'>
|
|
9
|
+
<tag k='name' v='p1' />
|
|
10
|
+
</node>
|
|
11
|
+
<node id='3' lat='43.60932786111' lon='3.8842776591'>
|
|
12
|
+
<tag k='name' v='p3' />
|
|
13
|
+
</node>
|
|
14
|
+
<node id='4' lat='43.60932198746' lon='3.8843159771'>
|
|
15
|
+
<tag k='name' v='p4' />
|
|
16
|
+
</node>
|
|
17
|
+
<node id='5' lat='43.60932198746' lon='3.8843159771'>
|
|
18
|
+
<tag k='name' v='p5' />
|
|
19
|
+
</node>
|
|
20
|
+
<way id='101'>
|
|
21
|
+
<nd ref='1' />
|
|
22
|
+
<nd ref='2' />
|
|
23
|
+
<tag k='highway' v='footway'>
|
|
24
|
+
<tag k='level' v='1' />
|
|
25
|
+
<tag k='name' v='w1' />
|
|
26
|
+
</way>
|
|
27
|
+
<way id='102'>
|
|
28
|
+
<nd ref='1' />
|
|
29
|
+
<nd ref='3' />
|
|
30
|
+
<tag k='highway' v='footway'>
|
|
31
|
+
<tag k='level' v='2' />
|
|
32
|
+
<tag k='name' v='w2' />
|
|
33
|
+
</way>
|
|
34
|
+
<way id='103'>
|
|
35
|
+
<nd ref='1' />
|
|
36
|
+
<nd ref='4' />
|
|
37
|
+
<tag k='highway' v='footway'>
|
|
38
|
+
<tag k='level' v='3' />
|
|
39
|
+
<tag k='name' v='w3' />
|
|
40
|
+
</way>
|
|
41
|
+
<way id='104'>
|
|
42
|
+
<nd ref='1' />
|
|
43
|
+
<nd ref='5' />
|
|
44
|
+
<tag k='highway' v='footway'>
|
|
45
|
+
<tag k='level' v='3' />
|
|
46
|
+
<tag k='name' v='w3-2' />
|
|
47
|
+
</way>
|
|
48
|
+
</osm>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
|
2
|
+
<osm>
|
|
3
|
+
<node id='1' lat='43.6093335' lon='3.88428'>
|
|
4
|
+
<tag k='name' v='p1' />
|
|
5
|
+
</node>
|
|
6
|
+
<node id='2' lat='43.60933232537' lon='3.88424831515'>
|
|
7
|
+
<tag k='name' v='p2' />
|
|
8
|
+
</node>
|
|
9
|
+
<node id='3' lat='43.60932786111' lon='3.8842776591'>
|
|
10
|
+
<tag k='name' v='p3' />
|
|
11
|
+
</node>
|
|
12
|
+
<node id='4' lat='43.60932198746' lon='3.8843159771'>
|
|
13
|
+
<tag k='name' v='p4' />
|
|
14
|
+
</node>
|
|
15
|
+
<way id='101'>
|
|
16
|
+
<nd ref='1' />
|
|
17
|
+
<nd ref='2' />
|
|
18
|
+
<nd ref='3' />
|
|
19
|
+
<tag k='name' v='w1' />
|
|
20
|
+
<tag k='highway' v='footway' />
|
|
21
|
+
</way>
|
|
22
|
+
<way id='102'>
|
|
23
|
+
<nd ref='3' />
|
|
24
|
+
<nd ref='4' />
|
|
25
|
+
<tag k='name' v='w2' />
|
|
26
|
+
</way>
|
|
27
|
+
</osm>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
|
2
|
+
<osm version='0.6' generator='JOSM'>
|
|
3
|
+
<node id='-519658' action='modify' visible='true' lat='48.84421815274' lon='2.37214171465'>
|
|
4
|
+
<tag k='name' v='start' />
|
|
5
|
+
</node>
|
|
6
|
+
<node id='-519659' action='modify' visible='true' lat='48.84493822092' lon='2.37214171465' />
|
|
7
|
+
<node id='-519661' action='modify' visible='true' lat='48.84431552103' lon='2.37268800579' />
|
|
8
|
+
<node id='-519663' action='modify' visible='true' lat='48.84395581937' lon='2.37174132231' />
|
|
9
|
+
<node id='-519665' action='modify' visible='true' lat='48.84395581937' lon='2.37064538259' />
|
|
10
|
+
<node id='-519667' action='modify' visible='true' lat='48.84395581937' lon='2.36955122674' />
|
|
11
|
+
<node id='-519669' action='modify' visible='true' lat='48.84359604217' lon='2.36860435126' />
|
|
12
|
+
<node id='-519671' action='modify' visible='true' lat='48.84297192036' lon='2.36915187515' />
|
|
13
|
+
<node id='-519673' action='modify' visible='true' lat='48.84368879871' lon='2.36915187515'>
|
|
14
|
+
<tag k='name' v='end' />
|
|
15
|
+
</node>
|
|
16
|
+
<way id='-519660' action='modify' visible='true'>
|
|
17
|
+
<nd ref='-519658' />
|
|
18
|
+
<nd ref='-519659' />
|
|
19
|
+
<nd ref='-519661' />
|
|
20
|
+
<nd ref='-519663' />
|
|
21
|
+
<nd ref='-519665' />
|
|
22
|
+
<tag k='highway' v='footway' />
|
|
23
|
+
<tag k='level' v='0' />
|
|
24
|
+
</way>
|
|
25
|
+
<way id='-519746' action='modify' visible='true'>
|
|
26
|
+
<nd ref='-519665' />
|
|
27
|
+
<nd ref='-519667' />
|
|
28
|
+
<tag k='highway' v='steps' />
|
|
29
|
+
<tag k='level' v='0;1' />
|
|
30
|
+
</way>
|
|
31
|
+
<way id='-519747' action='modify' visible='true'>
|
|
32
|
+
<nd ref='-519667' />
|
|
33
|
+
<nd ref='-519669' />
|
|
34
|
+
<nd ref='-519671' />
|
|
35
|
+
<nd ref='-519673' />
|
|
36
|
+
<tag k='highway' v='footway' />
|
|
37
|
+
<tag k='level' v='1' />
|
|
38
|
+
</way>
|
|
39
|
+
</osm>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
|
2
|
+
<osm version='0.6'>
|
|
3
|
+
<node id='-1' action='modify' visible='true' lat='43.60942861314' lon='3.88420107589'>
|
|
4
|
+
<tag k='name' v='p1' />
|
|
5
|
+
</node>
|
|
6
|
+
<node id='-2' action='modify' visible='true' lat='43.60938929783' lon='3.8841913836'>
|
|
7
|
+
<tag k='name' v='p2' />
|
|
8
|
+
</node>
|
|
9
|
+
<node id='-3' action='modify' visible='true' lat='43.60940277907' lon='3.88421907562'>
|
|
10
|
+
<tag k='name' v='p3' />
|
|
11
|
+
</node>
|
|
12
|
+
<node id='-4' action='modify' visible='true' lat='43.60937924953' lon='3.88418893318'>
|
|
13
|
+
<tag k='name' v='p4' />
|
|
14
|
+
</node>
|
|
15
|
+
<node id='-5' action='delete' visible='true' lat='43.6094255609' lon='3.88422469196'>
|
|
16
|
+
<tag k='name' v='p5' />
|
|
17
|
+
</node>
|
|
18
|
+
<way id='-101' action='modify' visible='true'>
|
|
19
|
+
<nd ref='-1' />
|
|
20
|
+
<nd ref='-2' />
|
|
21
|
+
<nd ref='-3' />
|
|
22
|
+
</way>
|
|
23
|
+
<way id='-102' action='modify' visible='true'>
|
|
24
|
+
<nd ref='-3' />
|
|
25
|
+
<nd ref='-4' />
|
|
26
|
+
</way>
|
|
27
|
+
<way id='-103' action='delete' visible='true'>
|
|
28
|
+
<nd ref='-4' />
|
|
29
|
+
<nd ref='-5' />
|
|
30
|
+
</way>
|
|
31
|
+
</osm>
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"directory": "packages/osm"
|
|
12
12
|
},
|
|
13
13
|
"name": "@wemap/osm",
|
|
14
|
-
"version": "2.7.
|
|
14
|
+
"version": "2.7.7",
|
|
15
15
|
"bugs": {
|
|
16
16
|
"url": "https://github.com/wemap/wemap-modules-js/issues"
|
|
17
17
|
},
|
|
@@ -26,11 +26,11 @@
|
|
|
26
26
|
],
|
|
27
27
|
"license": "ISC",
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@wemap/geo": "^2.7.
|
|
30
|
-
"@wemap/graph": "^2.7.
|
|
31
|
-
"@wemap/logger": "^2.7.
|
|
29
|
+
"@wemap/geo": "^2.7.7",
|
|
30
|
+
"@wemap/graph": "^2.7.7",
|
|
31
|
+
"@wemap/logger": "^2.7.7",
|
|
32
32
|
"lodash.isnumber": "^3.0.3",
|
|
33
33
|
"sax": "^1.2.4"
|
|
34
34
|
},
|
|
35
|
-
"gitHead": "
|
|
35
|
+
"gitHead": "988e0675759932cfc6b64df7768c6e6e573df1d9"
|
|
36
36
|
}
|
package/src/model/OsmElement.js
CHANGED
package/src/model/OsmModel.js
CHANGED
|
@@ -1,24 +1,26 @@
|
|
|
1
|
-
import OsmParser from './OsmParser';
|
|
2
|
-
|
|
3
1
|
class OsmModel {
|
|
4
2
|
|
|
5
|
-
constructor() {
|
|
6
|
-
this.nodes = [];
|
|
7
|
-
this.ways = [];
|
|
3
|
+
constructor(nodes, ways) {
|
|
4
|
+
this.nodes = nodes || [];
|
|
5
|
+
this.ways = ways || [];
|
|
8
6
|
}
|
|
9
7
|
|
|
10
8
|
getNodeById(id) {
|
|
11
|
-
return this.nodes.find(node => node.id === id);
|
|
9
|
+
return this.nodes.find(node => node.id === id) || null;
|
|
12
10
|
}
|
|
13
11
|
|
|
14
12
|
getNodeByName(name) {
|
|
15
|
-
return this.nodes.find(node => node.tags.name === name);
|
|
13
|
+
return this.nodes.find(node => node.tags.name === name) || null;
|
|
16
14
|
}
|
|
17
15
|
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
|
|
17
|
+
getWayById(id) {
|
|
18
|
+
return this.ways.find(way => way.id === id) || null;
|
|
20
19
|
}
|
|
21
20
|
|
|
21
|
+
getWayByName(name) {
|
|
22
|
+
return this.ways.find(way => way.tags.name === name) || null;
|
|
23
|
+
}
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
export default OsmModel;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
|
|
3
|
+
import { WGS84 } from '@wemap/geo';
|
|
4
|
+
import Logger from '@wemap/logger';
|
|
5
|
+
|
|
6
|
+
import OsmModel from './OsmModel';
|
|
7
|
+
import OsmNode from './OsmNode';
|
|
8
|
+
import OsmWay from './OsmWay';
|
|
9
|
+
|
|
10
|
+
Logger.enable(false);
|
|
11
|
+
|
|
12
|
+
describe('OsmModel', () => {
|
|
13
|
+
|
|
14
|
+
const nodes = [
|
|
15
|
+
new OsmNode(1, new WGS84(45, 5), {name: 'p1'}),
|
|
16
|
+
new OsmNode(2, new WGS84(46, 5.5), {name: 'p2'}),
|
|
17
|
+
new OsmNode(3, new WGS84(46.1, 5.3), {name: 'p3'}),
|
|
18
|
+
new OsmNode(4, new WGS84(46, 5.6), {name: 'p4'})
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const ways = [
|
|
22
|
+
new OsmWay(101, {name: 'w1'}),
|
|
23
|
+
new OsmWay(102, {name: 'w2'})
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
ways[0].nodes = [nodes[0], nodes[1], nodes[2]];
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
it('creation', () => {
|
|
30
|
+
expect(() => new OsmModel()).not.throw(Error);
|
|
31
|
+
expect(() => new OsmModel([], [])).not.throw(Error);
|
|
32
|
+
expect(() => new OsmModel(nodes, ways)).not.throw(Error);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
it('find nodes', () => {
|
|
37
|
+
const model = new OsmModel(nodes, ways);
|
|
38
|
+
expect(model.getNodeById(1)).equals(nodes[0]);
|
|
39
|
+
expect(model.getNodeById(5)).is.null;
|
|
40
|
+
expect(model.getNodeById(101)).is.null;
|
|
41
|
+
|
|
42
|
+
expect(model.getNodeByName('p2')).equals(nodes[1]);
|
|
43
|
+
expect(model.getNodeByName('p5')).is.null;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
it('find ways', () => {
|
|
48
|
+
const model = new OsmModel(nodes, ways);
|
|
49
|
+
expect(model.getWayById(1)).is.null;
|
|
50
|
+
expect(model.getWayById(5)).is.null;
|
|
51
|
+
expect(model.getWayById(101)).equals(ways[0]);
|
|
52
|
+
|
|
53
|
+
expect(model.getWayByName('w2')).equals(ways[1]);
|
|
54
|
+
expect(model.getWayByName('w5')).is.null;
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
});
|
package/src/model/OsmNode.js
CHANGED
|
@@ -1,21 +1,13 @@
|
|
|
1
|
-
import { WGS84 } from '@wemap/geo';
|
|
2
|
-
|
|
3
1
|
import OsmElement from './OsmElement';
|
|
4
2
|
|
|
5
3
|
class OsmNode extends OsmElement {
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
this.ways = [];
|
|
10
|
-
this.coords = coords;
|
|
11
|
-
}
|
|
5
|
+
coords = null;
|
|
6
|
+
ways = [];
|
|
12
7
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
new WGS84(Number(attr.lat), Number(attr.lon)));
|
|
17
|
-
node.action = attr.action;
|
|
18
|
-
return node;
|
|
8
|
+
constructor(id, coords, tags) {
|
|
9
|
+
super(id, tags);
|
|
10
|
+
this.coords = coords;
|
|
19
11
|
}
|
|
20
12
|
}
|
|
21
13
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
|
|
3
|
+
import { WGS84 } from '@wemap/geo';
|
|
4
|
+
|
|
5
|
+
import OsmNode from './OsmNode';
|
|
6
|
+
|
|
7
|
+
describe('OsmNode', () => {
|
|
8
|
+
|
|
9
|
+
it('creation', () => {
|
|
10
|
+
expect(() => new OsmNode(0)).not.throw(Error);
|
|
11
|
+
expect(() => new OsmNode(0, new WGS84(0, 0))).not.throw(Error);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
});
|
package/src/model/OsmParser.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/* eslint-disable max-statements */
|
|
2
2
|
import sax from 'sax';
|
|
3
3
|
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import {
|
|
5
|
+
Level, WGS84
|
|
6
|
+
} from '@wemap/geo';
|
|
6
7
|
|
|
7
8
|
import OsmModel from './OsmModel';
|
|
8
9
|
import OsmNode from './OsmNode';
|
|
@@ -24,18 +25,20 @@ class OsmParser {
|
|
|
24
25
|
switch (node.name) {
|
|
25
26
|
case 'node': {
|
|
26
27
|
if (isDeleted(node)) {
|
|
28
|
+
buffer = null;
|
|
27
29
|
break;
|
|
28
30
|
}
|
|
29
|
-
const osmNode =
|
|
31
|
+
const osmNode = this.parseNode(node.attributes);
|
|
30
32
|
buffer = osmNode;
|
|
31
33
|
model.nodes.push(osmNode);
|
|
32
34
|
break;
|
|
33
35
|
}
|
|
34
36
|
case 'way': {
|
|
35
37
|
if (isDeleted(node)) {
|
|
38
|
+
buffer = null;
|
|
36
39
|
break;
|
|
37
40
|
}
|
|
38
|
-
const osmWay =
|
|
41
|
+
const osmWay = this.parseWay(node.attributes);
|
|
39
42
|
buffer = osmWay;
|
|
40
43
|
model.ways.push(osmWay);
|
|
41
44
|
break;
|
|
@@ -57,8 +60,7 @@ class OsmParser {
|
|
|
57
60
|
const nodeId = Number(node.attributes.ref);
|
|
58
61
|
const refNode = model.getNodeById(nodeId);
|
|
59
62
|
if (!refNode) {
|
|
60
|
-
|
|
61
|
-
return;
|
|
63
|
+
throw Error('Node: ' + nodeId + ' in way ' + buffer.id + ' not found');
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
buffer.nodes.push(refNode);
|
|
@@ -80,6 +82,16 @@ class OsmParser {
|
|
|
80
82
|
return model;
|
|
81
83
|
}
|
|
82
84
|
|
|
85
|
+
|
|
86
|
+
static parseNode(attr) {
|
|
87
|
+
return new OsmNode(
|
|
88
|
+
Number(attr.id),
|
|
89
|
+
new WGS84(Number(attr.lat), Number(attr.lon)));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
static parseWay(attr) {
|
|
93
|
+
return new OsmWay(Number(attr.id));
|
|
94
|
+
}
|
|
83
95
|
}
|
|
84
96
|
|
|
85
97
|
export default OsmParser;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
|
|
5
|
+
import { Level } from '@wemap/geo';
|
|
6
|
+
|
|
7
|
+
import OsmParser from './OsmParser';
|
|
8
|
+
|
|
9
|
+
describe('OsmParser', () => {
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
it('parseOsmXmlString', () => {
|
|
13
|
+
|
|
14
|
+
const filePath = path.resolve(__dirname, '../../assets/simple.osm');
|
|
15
|
+
const osmXmlString = fs.readFileSync(filePath, 'utf8');
|
|
16
|
+
|
|
17
|
+
const model = OsmParser.parseOsmXmlString(osmXmlString);
|
|
18
|
+
|
|
19
|
+
expect(model.nodes.length).equals(4);
|
|
20
|
+
expect(model.ways.length).equals(2);
|
|
21
|
+
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
it('parseOsmXmlString - Unknown node ref', () => {
|
|
26
|
+
expect(() => OsmParser.parseOsmXmlString(`
|
|
27
|
+
<osm>
|
|
28
|
+
<way id='1'>
|
|
29
|
+
<nd ref='2' />
|
|
30
|
+
</way>
|
|
31
|
+
</osm>
|
|
32
|
+
`)).throw(Error);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('parseOsmXmlString - parse level', () => {
|
|
36
|
+
|
|
37
|
+
const model = OsmParser.parseOsmXmlString(`
|
|
38
|
+
<osm>
|
|
39
|
+
<node id='1' lat='0' lon ='0' />
|
|
40
|
+
<way id='2'>
|
|
41
|
+
<nd ref='1' />
|
|
42
|
+
<tag k='level' v='0' />
|
|
43
|
+
</way>
|
|
44
|
+
</osm>
|
|
45
|
+
`);
|
|
46
|
+
expect(Level.equalsTo(model.ways[0].level, new Level(0))).true;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
});
|
package/src/model/OsmWay.js
CHANGED
|
@@ -2,15 +2,11 @@ import OsmElement from './OsmElement';
|
|
|
2
2
|
|
|
3
3
|
class OsmWay extends OsmElement {
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
this.nodes = [];
|
|
8
|
-
}
|
|
5
|
+
nodes = [];
|
|
6
|
+
level = null;
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
way.action = attr.action;
|
|
13
|
-
return way;
|
|
8
|
+
constructor(id, tags) {
|
|
9
|
+
super(id, tags);
|
|
14
10
|
}
|
|
15
11
|
|
|
16
12
|
}
|
|
@@ -2,8 +2,6 @@ import { Level } from '@wemap/geo';
|
|
|
2
2
|
import {
|
|
3
3
|
Edge, Node, Network
|
|
4
4
|
} from '@wemap/graph';
|
|
5
|
-
import Logger from '@wemap/logger';
|
|
6
|
-
|
|
7
5
|
|
|
8
6
|
const HIGHWAYS_PEDESTRIANS = ['footway', 'steps'];
|
|
9
7
|
const DEFAULT_WAY_SELECTOR = way => HIGHWAYS_PEDESTRIANS.includes(way.tags.highway);
|
|
@@ -62,13 +60,14 @@ class OsmNetwork extends Network {
|
|
|
62
60
|
static createNodesAndEdgesFromElevator(networkModel, node) {
|
|
63
61
|
|
|
64
62
|
const createdNodes = [];
|
|
65
|
-
const isLevelAlreadyCreated = level => createdNodes.some(
|
|
63
|
+
const isLevelAlreadyCreated = level => createdNodes.some(
|
|
64
|
+
createdNode => Level.equalsTo(level, createdNode.coords.level)
|
|
65
|
+
);
|
|
66
66
|
|
|
67
67
|
// Create nodes from node.edges
|
|
68
68
|
node.edges.forEach(edge => {
|
|
69
69
|
if (edge.level.isRange) {
|
|
70
|
-
|
|
71
|
-
return;
|
|
70
|
+
throw new Error('Cannot handle this elevator edge due to ambiguity');
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
if (isLevelAlreadyCreated(edge.level)) {
|
|
@@ -77,7 +76,7 @@ class OsmNetwork extends Network {
|
|
|
77
76
|
|
|
78
77
|
const newNode = node.clone();
|
|
79
78
|
newNode.coords = node.coords.clone();
|
|
80
|
-
newNode.coords.level = edge.level
|
|
79
|
+
newNode.coords.level = edge.level.clone();
|
|
81
80
|
|
|
82
81
|
const otherNode = edge.node1 === node ? edge.node2 : edge.node1;
|
|
83
82
|
otherNode.edges = otherNode.edges.filter(_edge => _edge !== edge);
|
|
@@ -119,8 +118,8 @@ class OsmNetwork extends Network {
|
|
|
119
118
|
return this.nodes.find(node => node.data.tags.name === name);
|
|
120
119
|
}
|
|
121
120
|
|
|
122
|
-
|
|
123
|
-
return this.edges.
|
|
121
|
+
getEdgesById(id) {
|
|
122
|
+
return this.edges.filter(edge => edge.data.id === id);
|
|
124
123
|
}
|
|
125
124
|
|
|
126
125
|
toDetailedString() {
|