Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
openstreetmap-website/vendor/assets/leaflet/leaflet.osm.js /
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
286 lines (233 sloc)
7.86 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| L.OSM = {}; | |
| L.OSM.TileLayer = L.TileLayer.extend({ | |
| options: { | |
| url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', | |
| attribution: '© <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a> contributors' | |
| }, | |
| initialize: function (options) { | |
| options = L.Util.setOptions(this, options); | |
| L.TileLayer.prototype.initialize.call(this, options.url); | |
| } | |
| }); | |
| L.OSM.Mapnik = L.OSM.TileLayer.extend({ | |
| options: { | |
| url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', | |
| maxZoom: 19 | |
| } | |
| }); | |
| L.OSM.CyclOSM = L.OSM.TileLayer.extend({ | |
| options: { | |
| url: 'https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png', | |
| maxZoom: 20, | |
| subdomains: 'abc', | |
| attribution: '© <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a> contributors. Tiles courtesy of <a href="https://www.openstreetmap.fr" target="_blank">OpenStreetMap France</a>' | |
| } | |
| }); | |
| L.OSM.CycleMap = L.OSM.TileLayer.extend({ | |
| options: { | |
| url: 'https://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}{r}.png?apikey={apikey}', | |
| maxZoom: 21, | |
| attribution: '© <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a> contributors. Tiles courtesy of <a href="http://www.thunderforest.com/" target="_blank">Andy Allan</a>' | |
| } | |
| }); | |
| L.OSM.TransportMap = L.OSM.TileLayer.extend({ | |
| options: { | |
| url: 'https://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}{r}.png?apikey={apikey}', | |
| maxZoom: 21, | |
| attribution: '© <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a> contributors. Tiles courtesy of <a href="http://www.thunderforest.com/" target="_blank">Andy Allan</a>' | |
| } | |
| }); | |
| L.OSM.OPNVKarte = L.OSM.TileLayer.extend({ | |
| options: { | |
| url: 'https://tileserver.memomaps.de/tilegen/{z}/{x}/{y}.png', | |
| maxZoom: 18, | |
| attribution: '© <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a> contributors. Tiles courtesy of <a href="http://memomaps.de/" target="_blank">MeMoMaps</a>' | |
| } | |
| }); | |
| L.OSM.HOT = L.OSM.TileLayer.extend({ | |
| options: { | |
| url: 'https://tile-{s}.openstreetmap.fr/hot/{z}/{x}/{y}.png', | |
| maxZoom: 20, | |
| subdomains: 'abc', | |
| attribution: '© <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a> contributors. Tiles courtesy of <a href="http://hot.openstreetmap.org/" target="_blank">Humanitarian OpenStreetMap Team</a>' | |
| } | |
| }); | |
| L.OSM.GPS = L.OSM.TileLayer.extend({ | |
| options: { | |
| url: 'https://gps.tile.openstreetmap.org/lines/{z}/{x}/{y}.png', | |
| maxZoom: 21, | |
| maxNativeZoom: 20, | |
| subdomains: 'abc' | |
| } | |
| }); | |
| L.OSM.DataLayer = L.FeatureGroup.extend({ | |
| options: { | |
| areaTags: ['area', 'building', 'leisure', 'tourism', 'ruins', 'historic', 'landuse', 'military', 'natural', 'sport'], | |
| uninterestingTags: ['source', 'source_ref', 'source:ref', 'history', 'attribution', 'created_by', 'tiger:county', 'tiger:tlid', 'tiger:upload_uuid'], | |
| styles: {} | |
| }, | |
| initialize: function (xml, options) { | |
| L.Util.setOptions(this, options); | |
| L.FeatureGroup.prototype.initialize.call(this); | |
| if (xml) { | |
| this.addData(xml); | |
| } | |
| }, | |
| addData: function (features) { | |
| if (!(features instanceof Array)) { | |
| features = this.buildFeatures(features); | |
| } | |
| for (var i = 0; i < features.length; i++) { | |
| var feature = features[i], layer; | |
| if (feature.type === "changeset") { | |
| layer = L.rectangle(feature.latLngBounds, this.options.styles.changeset); | |
| } else if (feature.type === "node") { | |
| layer = L.circleMarker(feature.latLng, this.options.styles.node); | |
| } else { | |
| var latLngs = new Array(feature.nodes.length); | |
| for (var j = 0; j < feature.nodes.length; j++) { | |
| latLngs[j] = feature.nodes[j].latLng; | |
| } | |
| if (this.isWayArea(feature)) { | |
| latLngs.pop(); // Remove last == first. | |
| layer = L.polygon(latLngs, this.options.styles.area); | |
| } else { | |
| layer = L.polyline(latLngs, this.options.styles.way); | |
| } | |
| } | |
| layer.addTo(this); | |
| layer.feature = feature; | |
| } | |
| }, | |
| buildFeatures: function (xml) { | |
| var features = L.OSM.getChangesets(xml), | |
| nodes = L.OSM.getNodes(xml), | |
| ways = L.OSM.getWays(xml, nodes), | |
| relations = L.OSM.getRelations(xml, nodes, ways); | |
| for (var node_id in nodes) { | |
| var node = nodes[node_id]; | |
| if (this.interestingNode(node, ways, relations)) { | |
| features.push(node); | |
| } | |
| } | |
| for (var i = 0; i < ways.length; i++) { | |
| var way = ways[i]; | |
| features.push(way); | |
| } | |
| return features; | |
| }, | |
| isWayArea: function (way) { | |
| if (way.nodes[0] != way.nodes[way.nodes.length - 1]) { | |
| return false; | |
| } | |
| for (var key in way.tags) { | |
| if (~this.options.areaTags.indexOf(key)) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| }, | |
| interestingNode: function (node, ways, relations) { | |
| var used = false; | |
| for (var i = 0; i < ways.length; i++) { | |
| if (ways[i].nodes.indexOf(node) >= 0) { | |
| used = true; | |
| break; | |
| } | |
| } | |
| if (!used) { | |
| return true; | |
| } | |
| for (var i = 0; i < relations.length; i++) { | |
| if (relations[i].members.indexOf(node) >= 0) | |
| return true; | |
| } | |
| for (var key in node.tags) { | |
| if (this.options.uninterestingTags.indexOf(key) < 0) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| }); | |
| L.Util.extend(L.OSM, { | |
| getChangesets: function (xml) { | |
| var result = []; | |
| var nodes = xml.getElementsByTagName("changeset"); | |
| for (var i = 0; i < nodes.length; i++) { | |
| var node = nodes[i], id = node.getAttribute("id"); | |
| result.push({ | |
| id: id, | |
| type: "changeset", | |
| latLngBounds: L.latLngBounds( | |
| [node.getAttribute("min_lat"), node.getAttribute("min_lon")], | |
| [node.getAttribute("max_lat"), node.getAttribute("max_lon")]), | |
| tags: this.getTags(node) | |
| }); | |
| } | |
| return result; | |
| }, | |
| getNodes: function (xml) { | |
| var result = {}; | |
| var nodes = xml.getElementsByTagName("node"); | |
| for (var i = 0; i < nodes.length; i++) { | |
| var node = nodes[i], id = node.getAttribute("id"); | |
| result[id] = { | |
| id: id, | |
| type: "node", | |
| latLng: L.latLng(node.getAttribute("lat"), | |
| node.getAttribute("lon"), | |
| true), | |
| tags: this.getTags(node) | |
| }; | |
| } | |
| return result; | |
| }, | |
| getWays: function (xml, nodes) { | |
| var result = []; | |
| var ways = xml.getElementsByTagName("way"); | |
| for (var i = 0; i < ways.length; i++) { | |
| var way = ways[i], nds = way.getElementsByTagName("nd"); | |
| var way_object = { | |
| id: way.getAttribute("id"), | |
| type: "way", | |
| nodes: new Array(nds.length), | |
| tags: this.getTags(way) | |
| }; | |
| for (var j = 0; j < nds.length; j++) { | |
| way_object.nodes[j] = nodes[nds[j].getAttribute("ref")]; | |
| } | |
| result.push(way_object); | |
| } | |
| return result; | |
| }, | |
| getRelations: function (xml, nodes, ways) { | |
| var result = []; | |
| var rels = xml.getElementsByTagName("relation"); | |
| for (var i = 0; i < rels.length; i++) { | |
| var rel = rels[i], members = rel.getElementsByTagName("member"); | |
| var rel_object = { | |
| id: rel.getAttribute("id"), | |
| type: "relation", | |
| members: new Array(members.length), | |
| tags: this.getTags(rel) | |
| }; | |
| for (var j = 0; j < members.length; j++) { | |
| if (members[j].getAttribute("type") === "node") | |
| rel_object.members[j] = nodes[members[j].getAttribute("ref")]; | |
| else // relation-way and relation-relation membership not implemented | |
| rel_object.members[j] = null; | |
| } | |
| result.push(rel_object); | |
| } | |
| return result; | |
| }, | |
| getTags: function (xml) { | |
| var result = {}; | |
| var tags = xml.getElementsByTagName("tag"); | |
| for (var j = 0; j < tags.length; j++) { | |
| result[tags[j].getAttribute("k")] = tags[j].getAttribute("v"); | |
| } | |
| return result; | |
| } | |
| }); |