--- /dev/null
+\r
+L.Polyline = L.Path.extend({\r
+ initialize: function(latlngs, options) {\r
+ L.Path.prototype.initialize.call(this, options);\r
+ this._latlngs = latlngs;\r
+ },\r
+ \r
+ options: {\r
+ // how much to simplify the polyline on each zoom level\r
+ // more = better performance and smoother look, less = more accurate\r
+ smoothFactor: 1.0,\r
+ noClip: false,\r
+ \r
+ updateOnMoveEnd: true\r
+ },\r
+ \r
+ projectLatlngs: function() {\r
+ this._originalPoints = [];\r
+ \r
+ for (var i = 0, len = this._latlngs.length; i < len; i++) {\r
+ this._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]);\r
+ }\r
+ },\r
+ \r
+ getPathString: function() {\r
+ for (var i = 0, len = this._parts.length, str = ''; i < len; i++) {\r
+ str += this._getPathPartStr(this._parts[i]);\r
+ }\r
+ return str;\r
+ },\r
+ \r
+ getLatLngs: function() {\r
+ return this._latlngs;\r
+ },\r
+ \r
+ setLatLngs: function(latlngs) {\r
+ this._latlngs = latlngs;\r
+ this._redraw();\r
+ return this;\r
+ },\r
+ \r
+ addLatLng: function(latlng) {\r
+ this._latlngs.push(latlng);\r
+ this._redraw();\r
+ return this;\r
+ },\r
+ \r
+ spliceLatLngs: function(index, howMany) {\r
+ var removed = [].splice.apply(this._latlngs, arguments);\r
+ this._redraw();\r
+ return removed;\r
+ },\r
+ \r
+ _getPathPartStr: function(points) {\r
+ var round = L.Path.VML;\r
+ \r
+ for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) {\r
+ p = points[j];\r
+ if (round) p._round();\r
+ str += (j ? 'L' : 'M') + p.x + ' ' + p.y;\r
+ }\r
+ return str;\r
+ },\r
+ \r
+ _clipPoints: function() {\r
+ var points = this._originalPoints,\r
+ len = points.length,\r
+ i, k, segment;\r
+\r
+ if (this.options.noClip) {\r
+ this._parts = [points];\r
+ return;\r
+ }\r
+ \r
+ this._parts = [];\r
+ \r
+ var parts = this._parts,\r
+ vp = this._map._pathViewport,\r
+ lu = L.LineUtil;\r
+ \r
+ for (i = 0, k = 0; i < len - 1; i++) {\r
+ segment = lu.clipSegment(points[i], points[i+1], vp, i);\r
+ if (!segment) continue;\r
+ \r
+ parts[k] = parts[k] || [];\r
+ parts[k].push(segment[0]);\r
+ \r
+ // if segment goes out of screen, or it's the last one, it's the end of the line part\r
+ if ((segment[1] != points[i+1]) || (i == len - 2)) {\r
+ parts[k].push(segment[1]);\r
+ k++; \r
+ }\r
+ }\r
+ },\r
+ \r
+ // simplify each clipped part of the polyline\r
+ _simplifyPoints: function() {\r
+ var parts = this._parts,\r
+ lu = L.LineUtil;\r
+ \r
+ for (var i = 0, len = parts.length; i < len; i++) {\r
+ parts[i] = lu.simplify(parts[i], this.options.smoothFactor);\r
+ }\r
+ },\r
+ \r
+ _updatePath: function() {\r
+ this._clipPoints();\r
+ this._simplifyPoints();\r
+ \r
+ L.Path.prototype._updatePath.call(this);\r
+ }\r
+});
\ No newline at end of file