X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=extlib%2Fleaflet%2Fsrc%2Flayer%2Fvector%2FPolyline.js;fp=extlib%2Fleaflet%2Fsrc%2Flayer%2Fvector%2FPolyline.js;h=606d7d71ce73076888b96efa5f336f55b87ce87f;hb=c5ba5b0456a711d157e317f220e9c739226e7f50;hp=0000000000000000000000000000000000000000;hpb=c47a03b909ecd97cab5b144d0cab007b62b92a90;p=mediagoblin.git diff --git a/extlib/leaflet/src/layer/vector/Polyline.js b/extlib/leaflet/src/layer/vector/Polyline.js new file mode 100644 index 00000000..606d7d71 --- /dev/null +++ b/extlib/leaflet/src/layer/vector/Polyline.js @@ -0,0 +1,112 @@ + +L.Polyline = L.Path.extend({ + initialize: function(latlngs, options) { + L.Path.prototype.initialize.call(this, options); + this._latlngs = latlngs; + }, + + options: { + // how much to simplify the polyline on each zoom level + // more = better performance and smoother look, less = more accurate + smoothFactor: 1.0, + noClip: false, + + updateOnMoveEnd: true + }, + + projectLatlngs: function() { + this._originalPoints = []; + + for (var i = 0, len = this._latlngs.length; i < len; i++) { + this._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]); + } + }, + + getPathString: function() { + for (var i = 0, len = this._parts.length, str = ''; i < len; i++) { + str += this._getPathPartStr(this._parts[i]); + } + return str; + }, + + getLatLngs: function() { + return this._latlngs; + }, + + setLatLngs: function(latlngs) { + this._latlngs = latlngs; + this._redraw(); + return this; + }, + + addLatLng: function(latlng) { + this._latlngs.push(latlng); + this._redraw(); + return this; + }, + + spliceLatLngs: function(index, howMany) { + var removed = [].splice.apply(this._latlngs, arguments); + this._redraw(); + return removed; + }, + + _getPathPartStr: function(points) { + var round = L.Path.VML; + + for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) { + p = points[j]; + if (round) p._round(); + str += (j ? 'L' : 'M') + p.x + ' ' + p.y; + } + return str; + }, + + _clipPoints: function() { + var points = this._originalPoints, + len = points.length, + i, k, segment; + + if (this.options.noClip) { + this._parts = [points]; + return; + } + + this._parts = []; + + var parts = this._parts, + vp = this._map._pathViewport, + lu = L.LineUtil; + + for (i = 0, k = 0; i < len - 1; i++) { + segment = lu.clipSegment(points[i], points[i+1], vp, i); + if (!segment) continue; + + parts[k] = parts[k] || []; + parts[k].push(segment[0]); + + // if segment goes out of screen, or it's the last one, it's the end of the line part + if ((segment[1] != points[i+1]) || (i == len - 2)) { + parts[k].push(segment[1]); + k++; + } + } + }, + + // simplify each clipped part of the polyline + _simplifyPoints: function() { + var parts = this._parts, + lu = L.LineUtil; + + for (var i = 0, len = parts.length; i < len; i++) { + parts[i] = lu.simplify(parts[i], this.options.smoothFactor); + } + }, + + _updatePath: function() { + this._clipPoints(); + this._simplifyPoints(); + + L.Path.prototype._updatePath.call(this); + } +}); \ No newline at end of file