]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/leaflet/leaflet.osm.js
66879d1ddb01d1c145c926f86664018c2e0fc577
[rails.git] / vendor / assets / leaflet / leaflet.osm.js
1 L.OSM = L.FeatureGroup.extend({
2   options: {
3     areaTags: ['area', 'building', 'leisure', 'tourism', 'ruins', 'historic', 'landuse', 'military', 'natural', 'sport'],
4     uninterestingTags: ['source', 'source_ref', 'source:ref', 'history', 'attribution', 'created_by', 'tiger:county', 'tiger:tlid', 'tiger:upload_uuid'],
5     styles: {}
6   },
7
8   initialize: function (xml, options) {
9     L.Util.setOptions(this, options);
10
11     L.FeatureGroup.prototype.initialize.call(this);
12
13     if (xml) {
14       this.addData(xml);
15     }
16   },
17
18   addData: function (xml) {
19     var nodes = L.OSM.getNodes(xml),
20          ways = L.OSM.getWays(xml);
21
22     for (var i = 0; i < ways.length; i++) {
23       var way = ways[i],
24         latLngs = new Array(way.nodes.length);
25
26       for (var j = 0; j < way.nodes.length; j++) {
27         latLngs[j] = nodes[way.nodes[j]].latLng;
28       }
29
30       var layer;
31
32       if (this.isWayArea(way)) {
33         latLngs.pop(); // Remove last == first.
34         layer = L.polygon(latLngs, this.options.styles.area);
35       } else {
36         layer = L.polyline(latLngs, this.options.styles.way);
37       }
38
39       layer.addTo(this);
40       layer.feature = way;
41     }
42
43     for (var node_id in nodes) {
44       var node = nodes[node_id];
45       if (this.interestingNode(node)) {
46         var layer = L.circleMarker(node.latLng, this.options.styles.node);
47
48         layer.addTo(this);
49         layer.feature = node;
50       }
51     }
52   },
53
54   isWayArea: function (way) {
55     if (way.nodes[0] != way.nodes[way.nodes.length - 1]) {
56       return false;
57     }
58
59     for (var key in way.tags) {
60       if (~this.options.areaTags.indexOf(key)) {
61         return true;
62       }
63     }
64
65     return false;
66   },
67
68   interestingNode: function (node) {
69     for (var key in node.tags) {
70       if (!~this.options.uninterestingTags.indexOf(key)) {
71         return true;
72       }
73     }
74
75     return false;
76   }
77 });
78
79 L.Util.extend(L.OSM, {
80   getNodes: function (xml) {
81     var result = {};
82
83     var nodes = xml.getElementsByTagName("node");
84     for (var i = 0; i < nodes.length; i++) {
85       var node = nodes[i], id = node.getAttribute("id");
86       result[id] = {
87         id: id,
88         type: "node",
89         latLng: L.latLng(node.getAttribute("lat"),
90                          node.getAttribute("lon"),
91                          true),
92         tags: this.getTags(node)
93       };
94     }
95
96     return result;
97   },
98
99   getWays: function (xml) {
100     var result = [];
101
102     var ways = xml.getElementsByTagName("way");
103     for (var i = 0; i < ways.length; i++) {
104       var way = ways[i], nds = way.getElementsByTagName("nd");
105
106       var way_object = {
107         id: way.getAttribute("id"),
108         type: "way",
109         nodes: new Array(nds.length),
110         tags: this.getTags(way)
111       };
112
113       for (var j = 0; j < nds.length; j++) {
114         way_object.nodes[j] = nds[j].getAttribute("ref");
115       }
116
117       result.push(way_object);
118     }
119
120     return result;
121   },
122
123   getTags: function (xml) {
124     var result = {};
125
126     var tags = xml.getElementsByTagName("tag");
127     for (var j = 0; j < tags.length; j++) {
128       result[tags[j].getAttribute("k")] = tags[j].getAttribute("v");
129     }
130
131     return result;
132   }
133 });