leaflet-ruby 0.3.beta1

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.
Files changed (141) hide show
  1. data/CHANGELOG.rdoc +5 -0
  2. data/LICENSE +21 -0
  3. data/README.rdoc +55 -0
  4. data/Rakefile +15 -0
  5. data/leaflet-ruby.gemspec +24 -0
  6. data/lib/leaflet-ruby.rb +18 -0
  7. data/lib/leaflet/CHANGELOG.md +181 -0
  8. data/lib/leaflet/Jakefile.js +65 -0
  9. data/lib/leaflet/LICENSE +22 -0
  10. data/lib/leaflet/README.md +32 -0
  11. data/lib/leaflet/build/build.html +243 -0
  12. data/lib/leaflet/build/build.js +79 -0
  13. data/lib/leaflet/build/deps.js +231 -0
  14. data/lib/leaflet/build/hint.js +30 -0
  15. data/lib/leaflet/build/hintrc.js +44 -0
  16. data/lib/leaflet/debug/control/control-layers.html +47 -0
  17. data/lib/leaflet/debug/control/map-control.html +29 -0
  18. data/lib/leaflet/debug/css/mobile.css +6 -0
  19. data/lib/leaflet/debug/css/screen.css +5 -0
  20. data/lib/leaflet/debug/geojson/geojson-sample.js +53 -0
  21. data/lib/leaflet/debug/geojson/geojson.html +56 -0
  22. data/lib/leaflet/debug/leaflet-include.js +120 -0
  23. data/lib/leaflet/debug/map/canvas.html +46 -0
  24. data/lib/leaflet/debug/map/map-mobile.html +42 -0
  25. data/lib/leaflet/debug/map/map.html +54 -0
  26. data/lib/leaflet/debug/map/max-bounds.html +36 -0
  27. data/lib/leaflet/debug/map/scroll.html +35 -0
  28. data/lib/leaflet/debug/map/wms-marble.html +30 -0
  29. data/lib/leaflet/debug/map/wms.html +37 -0
  30. data/lib/leaflet/debug/vector/editable.html +43 -0
  31. data/lib/leaflet/debug/vector/route.js +1 -0
  32. data/lib/leaflet/debug/vector/vector-bounds.html +69 -0
  33. data/lib/leaflet/debug/vector/vector-canvas.html +92 -0
  34. data/lib/leaflet/debug/vector/vector-mobile.html +38 -0
  35. data/lib/leaflet/debug/vector/vector-simple.html +63 -0
  36. data/lib/leaflet/debug/vector/vector.html +38 -0
  37. data/lib/leaflet/dist/images/layers.png +0 -0
  38. data/lib/leaflet/dist/images/marker-shadow.png +0 -0
  39. data/lib/leaflet/dist/images/marker.png +0 -0
  40. data/lib/leaflet/dist/images/popup-close.png +0 -0
  41. data/lib/leaflet/dist/images/zoom-in.png +0 -0
  42. data/lib/leaflet/dist/images/zoom-out.png +0 -0
  43. data/lib/leaflet/dist/leaflet-src.js +5537 -0
  44. data/lib/leaflet/dist/leaflet.css +323 -0
  45. data/lib/leaflet/dist/leaflet.ie.css +48 -0
  46. data/lib/leaflet/dist/leaflet.js +6 -0
  47. data/lib/leaflet/lib/jasmine/jasmine-html.js +182 -0
  48. data/lib/leaflet/lib/jasmine/jasmine.css +166 -0
  49. data/lib/leaflet/lib/jasmine/jasmine.js +2421 -0
  50. data/lib/leaflet/spec/runner.html +57 -0
  51. data/lib/leaflet/spec/suites/LeafletSpec.js +15 -0
  52. data/lib/leaflet/spec/suites/SpecHelper.js +28 -0
  53. data/lib/leaflet/spec/suites/core/ClassSpec.js +153 -0
  54. data/lib/leaflet/spec/suites/core/EventsSpec.js +110 -0
  55. data/lib/leaflet/spec/suites/core/UtilSpec.js +63 -0
  56. data/lib/leaflet/spec/suites/dom/DomEventSpec.js +102 -0
  57. data/lib/leaflet/spec/suites/dom/DomUtilSpec.js +59 -0
  58. data/lib/leaflet/spec/suites/geo/LatLngBoundsSpec.js +1 -0
  59. data/lib/leaflet/spec/suites/geo/LatLngSpec.js +76 -0
  60. data/lib/leaflet/spec/suites/geo/ProjectionSpec.js +42 -0
  61. data/lib/leaflet/spec/suites/geometry/BoundsSpec.js +53 -0
  62. data/lib/leaflet/spec/suites/geometry/PointSpec.js +45 -0
  63. data/lib/leaflet/spec/suites/geometry/TransformationSpec.js +19 -0
  64. data/lib/leaflet/spec/suites/layer/TileLayerSpec.js +1 -0
  65. data/lib/leaflet/spec/suites/layer/vector/PolylineGeometrySpec.js +35 -0
  66. data/lib/leaflet/spec/suites/map/MapSpec.js +1 -0
  67. data/lib/leaflet/src/Leaflet.js +33 -0
  68. data/lib/leaflet/src/control/Control.Attribution.js +66 -0
  69. data/lib/leaflet/src/control/Control.Layers.js +167 -0
  70. data/lib/leaflet/src/control/Control.Zoom.js +36 -0
  71. data/lib/leaflet/src/control/Control.js +9 -0
  72. data/lib/leaflet/src/core/Browser.js +53 -0
  73. data/lib/leaflet/src/core/Class.js +66 -0
  74. data/lib/leaflet/src/core/Events.js +62 -0
  75. data/lib/leaflet/src/core/Handler.js +29 -0
  76. data/lib/leaflet/src/core/Util.js +108 -0
  77. data/lib/leaflet/src/dom/DomEvent.DoubleTap.js +43 -0
  78. data/lib/leaflet/src/dom/DomEvent.js +154 -0
  79. data/lib/leaflet/src/dom/DomUtil.js +155 -0
  80. data/lib/leaflet/src/dom/Draggable.js +147 -0
  81. data/lib/leaflet/src/dom/transition/Transition.Native.js +102 -0
  82. data/lib/leaflet/src/dom/transition/Transition.Timer.js +126 -0
  83. data/lib/leaflet/src/dom/transition/Transition.js +28 -0
  84. data/lib/leaflet/src/geo/LatLng.js +44 -0
  85. data/lib/leaflet/src/geo/LatLngBounds.js +86 -0
  86. data/lib/leaflet/src/geo/crs/CRS.EPSG3395.js +13 -0
  87. data/lib/leaflet/src/geo/crs/CRS.EPSG3857.js +17 -0
  88. data/lib/leaflet/src/geo/crs/CRS.EPSG4326.js +7 -0
  89. data/lib/leaflet/src/geo/crs/CRS.js +17 -0
  90. data/lib/leaflet/src/geo/projection/Projection.LonLat.js +10 -0
  91. data/lib/leaflet/src/geo/projection/Projection.Mercator.js +51 -0
  92. data/lib/leaflet/src/geo/projection/Projection.SphericalMercator.js +23 -0
  93. data/lib/leaflet/src/geo/projection/Projection.js +5 -0
  94. data/lib/leaflet/src/geometry/Bounds.js +50 -0
  95. data/lib/leaflet/src/geometry/LineUtil.js +194 -0
  96. data/lib/leaflet/src/geometry/Point.js +66 -0
  97. data/lib/leaflet/src/geometry/PolyUtil.js +59 -0
  98. data/lib/leaflet/src/geometry/Transformation.js +31 -0
  99. data/lib/leaflet/src/layer/FeatureGroup.js +40 -0
  100. data/lib/leaflet/src/layer/GeoJSON.js +104 -0
  101. data/lib/leaflet/src/layer/ImageOverlay.js +58 -0
  102. data/lib/leaflet/src/layer/LayerGroup.js +74 -0
  103. data/lib/leaflet/src/layer/Popup.js +179 -0
  104. data/lib/leaflet/src/layer/marker/Icon.js +58 -0
  105. data/lib/leaflet/src/layer/marker/Marker.Drag.js +57 -0
  106. data/lib/leaflet/src/layer/marker/Marker.Popup.js +42 -0
  107. data/lib/leaflet/src/layer/marker/Marker.js +142 -0
  108. data/lib/leaflet/src/layer/tile/TileLayer.Canvas.js +41 -0
  109. data/lib/leaflet/src/layer/tile/TileLayer.WMS.js +47 -0
  110. data/lib/leaflet/src/layer/tile/TileLayer.js +310 -0
  111. data/lib/leaflet/src/layer/vector/Circle.js +68 -0
  112. data/lib/leaflet/src/layer/vector/CircleMarker.js +25 -0
  113. data/lib/leaflet/src/layer/vector/MultiPoly.js +34 -0
  114. data/lib/leaflet/src/layer/vector/Path.Popup.js +24 -0
  115. data/lib/leaflet/src/layer/vector/Path.SVG.js +138 -0
  116. data/lib/leaflet/src/layer/vector/Path.VML.js +93 -0
  117. data/lib/leaflet/src/layer/vector/Path.js +88 -0
  118. data/lib/leaflet/src/layer/vector/Polygon.js +64 -0
  119. data/lib/leaflet/src/layer/vector/Polyline.js +146 -0
  120. data/lib/leaflet/src/layer/vector/canvas/Circle.Canvas.js +18 -0
  121. data/lib/leaflet/src/layer/vector/canvas/Path.Canvas.js +146 -0
  122. data/lib/leaflet/src/layer/vector/canvas/Polygon.Canvas.js +34 -0
  123. data/lib/leaflet/src/layer/vector/canvas/Polyline.Canvas.js +27 -0
  124. data/lib/leaflet/src/map/Map.js +613 -0
  125. data/lib/leaflet/src/map/anim/Map.PanAnimation.js +70 -0
  126. data/lib/leaflet/src/map/anim/Map.ZoomAnimation.js +133 -0
  127. data/lib/leaflet/src/map/ext/Map.Control.js +50 -0
  128. data/lib/leaflet/src/map/ext/Map.Geolocation.js +86 -0
  129. data/lib/leaflet/src/map/ext/Map.Popup.js +20 -0
  130. data/lib/leaflet/src/map/handler/Map.BoxZoom.js +73 -0
  131. data/lib/leaflet/src/map/handler/Map.DoubleClickZoom.js +18 -0
  132. data/lib/leaflet/src/map/handler/Map.Drag.js +81 -0
  133. data/lib/leaflet/src/map/handler/Map.ScrollWheelZoom.js +55 -0
  134. data/lib/leaflet/src/map/handler/Map.TouchZoom.js +93 -0
  135. data/lib/zerista/CRS.Cartesian.js +20 -0
  136. data/lib/zerista/Projection.Identity.js +11 -0
  137. data/lib/zerista/zerista_layer.js +97 -0
  138. data/vendor/assets/javascripts/leaflet.js +139 -0
  139. data/vendor/assets/stylesheets/leaflet.css +1 -0
  140. data/vendor/assets/stylesheets/leaflet.ie.css +1 -0
  141. metadata +185 -0
@@ -0,0 +1,10 @@
1
+
2
+ L.Projection.LonLat = {
3
+ project: function (latlng) {
4
+ return new L.Point(latlng.lng, latlng.lat);
5
+ },
6
+
7
+ unproject: function (point, unbounded) {
8
+ return new L.LatLng(point.y, point.x, unbounded);
9
+ }
10
+ };
@@ -0,0 +1,51 @@
1
+
2
+ L.Projection.Mercator = {
3
+ MAX_LATITUDE: 85.0840591556,
4
+
5
+ R_MINOR: 6356752.3142,
6
+ R_MAJOR: 6378137,
7
+
8
+ project: function (/*LatLng*/ latlng) /*-> Point*/ {
9
+ var d = L.LatLng.DEG_TO_RAD,
10
+ max = this.MAX_LATITUDE,
11
+ lat = Math.max(Math.min(max, latlng.lat), -max),
12
+ r = this.R_MAJOR,
13
+ r2 = this.R_MINOR,
14
+ x = latlng.lng * d * r,
15
+ y = lat * d,
16
+ tmp = r2 / r,
17
+ eccent = Math.sqrt(1.0 - tmp * tmp),
18
+ con = eccent * Math.sin(y);
19
+
20
+ con = Math.pow((1 - con) / (1 + con), eccent * 0.5);
21
+
22
+ var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;
23
+ y = -r2 * Math.log(ts);
24
+
25
+ return new L.Point(x, y);
26
+ },
27
+
28
+ unproject: function (/*Point*/ point, /*Boolean*/ unbounded) /*-> LatLng*/ {
29
+ var d = L.LatLng.RAD_TO_DEG,
30
+ r = this.R_MAJOR,
31
+ r2 = this.R_MINOR,
32
+ lng = point.x * d / r,
33
+ tmp = r2 / r,
34
+ eccent = Math.sqrt(1 - (tmp * tmp)),
35
+ ts = Math.exp(- point.y / r2),
36
+ phi = (Math.PI / 2) - 2 * Math.atan(ts),
37
+ numIter = 15,
38
+ tol = 1e-7,
39
+ i = numIter,
40
+ dphi = 0.1,
41
+ con;
42
+
43
+ while ((Math.abs(dphi) > tol) && (--i > 0)) {
44
+ con = eccent * Math.sin(phi);
45
+ dphi = (Math.PI / 2) - 2 * Math.atan(ts * Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi;
46
+ phi += dphi;
47
+ }
48
+
49
+ return new L.LatLng(phi * d, lng, unbounded);
50
+ }
51
+ };
@@ -0,0 +1,23 @@
1
+
2
+ L.Projection.SphericalMercator = {
3
+ MAX_LATITUDE: 85.0511287798,
4
+
5
+ project: function (/*LatLng*/ latlng) /*-> Point*/ {
6
+ var d = L.LatLng.DEG_TO_RAD,
7
+ max = this.MAX_LATITUDE,
8
+ lat = Math.max(Math.min(max, latlng.lat), -max),
9
+ x = latlng.lng * d,
10
+ y = lat * d;
11
+ y = Math.log(Math.tan((Math.PI / 4) + (y / 2)));
12
+
13
+ return new L.Point(x, y);
14
+ },
15
+
16
+ unproject: function (/*Point*/ point, /*Boolean*/ unbounded) /*-> LatLng*/ {
17
+ var d = L.LatLng.RAD_TO_DEG,
18
+ lng = point.x * d,
19
+ lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d;
20
+
21
+ return new L.LatLng(lat, lng, unbounded);
22
+ }
23
+ };
@@ -0,0 +1,5 @@
1
+ /*
2
+ * L.Projection contains various geographical projections used by CRS classes.
3
+ */
4
+
5
+ L.Projection = {};
@@ -0,0 +1,50 @@
1
+ /*
2
+ * L.Bounds represents a rectangular area on the screen in pixel coordinates.
3
+ */
4
+
5
+ L.Bounds = L.Class.extend({
6
+ initialize: function (min, max) { //(Point, Point) or Point[]
7
+ if (!min) {
8
+ return;
9
+ }
10
+ var points = (min instanceof Array ? min : [min, max]);
11
+ for (var i = 0, len = points.length; i < len; i++) {
12
+ this.extend(points[i]);
13
+ }
14
+ },
15
+
16
+ // extend the bounds to contain the given point
17
+ extend: function (/*Point*/ point) {
18
+ if (!this.min && !this.max) {
19
+ this.min = new L.Point(point.x, point.y);
20
+ this.max = new L.Point(point.x, point.y);
21
+ } else {
22
+ this.min.x = Math.min(point.x, this.min.x);
23
+ this.max.x = Math.max(point.x, this.max.x);
24
+ this.min.y = Math.min(point.y, this.min.y);
25
+ this.max.y = Math.max(point.y, this.max.y);
26
+ }
27
+ },
28
+
29
+ getCenter: function (round)/*->Point*/ {
30
+ return new L.Point(
31
+ (this.min.x + this.max.x) / 2,
32
+ (this.min.y + this.max.y) / 2, round);
33
+ },
34
+
35
+ contains: function (/*Bounds or Point*/ obj)/*->Boolean*/ {
36
+ var min, max;
37
+
38
+ if (obj instanceof L.Bounds) {
39
+ min = obj.min;
40
+ max = obj.max;
41
+ } else {
42
+ min = max = obj;
43
+ }
44
+
45
+ return (min.x >= this.min.x) &&
46
+ (max.x <= this.max.x) &&
47
+ (min.y >= this.min.y) &&
48
+ (max.y <= this.max.y);
49
+ }
50
+ });
@@ -0,0 +1,194 @@
1
+ /*
2
+ * L.LineUtil contains different utility functions for line segments
3
+ * and polylines (clipping, simplification, distances, etc.)
4
+ */
5
+
6
+ L.LineUtil = {
7
+
8
+ // Simplify polyline with vertex reduction and Douglas-Peucker simplification.
9
+ // Improves rendering performance dramatically by lessening the number of points to draw.
10
+
11
+ simplify: function (/*Point[]*/ points, /*Number*/ tolerance) {
12
+ if (!tolerance || !points.length) {
13
+ return points.slice();
14
+ }
15
+
16
+ // stage 1: vertex reduction
17
+ points = this.reducePoints(points, tolerance);
18
+
19
+ // stage 2: Douglas-Peucker simplification
20
+ points = this.simplifyDP(points, tolerance);
21
+
22
+ return points;
23
+ },
24
+
25
+ // distance from a point to a segment between two points
26
+ pointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {
27
+ return Math.sqrt(this._sqPointToSegmentDist(p, p1, p2));
28
+ },
29
+
30
+ closestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {
31
+ var point = this._sqClosestPointOnSegment(p, p1, p2);
32
+ point.distance = Math.sqrt(point._sqDist);
33
+ return point;
34
+ },
35
+
36
+ // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm
37
+ simplifyDP: function (points, tol) {
38
+ var maxDist2 = 0,
39
+ index = 0,
40
+ t2 = tol * tol,
41
+ len = points.length,
42
+ i, dist2;
43
+
44
+ if (len < 3) {
45
+ return points;
46
+ }
47
+
48
+ for (i = 0; i < len - 1; i++) {
49
+ dist2 = this._sqPointToSegmentDist(points[i], points[0], points[len - 1]);
50
+ if (dist2 > maxDist2) {
51
+ index = i;
52
+ maxDist2 = dist2;
53
+ }
54
+ }
55
+
56
+ var part1, part2;
57
+
58
+ if (maxDist2 >= t2) {
59
+ part1 = points.slice(0, index);
60
+ part2 = points.slice(index);
61
+
62
+ part1 = this.simplifyDP(part1, tol);
63
+ part2 = this.simplifyDP(part2, tol);
64
+
65
+ return part1.concat(part2);
66
+ } else {
67
+ return [points[0], points[len - 1]];
68
+ }
69
+ },
70
+
71
+ // reduce points that are too close to each other to a single point
72
+ reducePoints: function (points, tol) {
73
+ var reducedPoints = [points[0]],
74
+ t2 = tol * tol;
75
+
76
+ for (var i = 1, prev = 0, len = points.length; i < len; i++) {
77
+ if (this._sqDist(points[i], points[prev]) < t2) {
78
+ continue;
79
+ }
80
+ reducedPoints.push(points[i]);
81
+ prev = i;
82
+ }
83
+ if (prev < len - 1) {
84
+ reducedPoints.push(points[len - 1]);
85
+ }
86
+ return reducedPoints;
87
+ },
88
+
89
+ /*jshint bitwise:false */ // temporarily allow bitwise oprations
90
+
91
+ // Cohen-Sutherland line clipping algorithm.
92
+ // Used to avoid rendering parts of a polyline that are not currently visible.
93
+
94
+ clipSegment: function (a, b, bounds, useLastCode) {
95
+ var min = bounds.min,
96
+ max = bounds.max;
97
+
98
+ var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),
99
+ codeB = this._getBitCode(b, bounds);
100
+
101
+ // save 2nd code to avoid calculating it on the next segment
102
+ this._lastCode = codeB;
103
+
104
+ while (true) {
105
+ // if a,b is inside the clip window (trivial accept)
106
+ if (!(codeA | codeB)) {
107
+ return [a, b];
108
+ // if a,b is outside the clip window (trivial reject)
109
+ } else if (codeA & codeB) {
110
+ return false;
111
+ // other cases
112
+ } else {
113
+ var codeOut = codeA || codeB,
114
+ p = this._getEdgeIntersection(a, b, codeOut, bounds),
115
+ newCode = this._getBitCode(p, bounds);
116
+
117
+ if (codeOut === codeA) {
118
+ a = p;
119
+ codeA = newCode;
120
+ } else {
121
+ b = p;
122
+ codeB = newCode;
123
+ }
124
+ }
125
+ }
126
+ },
127
+
128
+ _getEdgeIntersection: function (a, b, code, bounds) {
129
+ var dx = b.x - a.x,
130
+ dy = b.y - a.y,
131
+ min = bounds.min,
132
+ max = bounds.max;
133
+
134
+ if (code & 8) { // top
135
+ return new L.Point(a.x + dx * (max.y - a.y) / dy, max.y);
136
+ } else if (code & 4) { // bottom
137
+ return new L.Point(a.x + dx * (min.y - a.y) / dy, min.y);
138
+ } else if (code & 2) { // right
139
+ return new L.Point(max.x, a.y + dy * (max.x - a.x) / dx);
140
+ } else if (code & 1) { // left
141
+ return new L.Point(min.x, a.y + dy * (min.x - a.x) / dx);
142
+ }
143
+ },
144
+
145
+ _getBitCode: function (/*Point*/ p, bounds) {
146
+ var code = 0;
147
+
148
+ if (p.x < bounds.min.x) { // left
149
+ code |= 1;
150
+ } else if (p.x > bounds.max.x) { // right
151
+ code |= 2;
152
+ }
153
+ if (p.y < bounds.min.y) { // bottom
154
+ code |= 4;
155
+ } else if (p.y > bounds.max.y) { // top
156
+ code |= 8;
157
+ }
158
+
159
+ return code;
160
+ },
161
+
162
+ /*jshint bitwise:true */
163
+
164
+ // square distance (to avoid unnecessary Math.sqrt calls)
165
+ _sqDist: function (p1, p2) {
166
+ var dx = p2.x - p1.x,
167
+ dy = p2.y - p1.y;
168
+ return dx * dx + dy * dy;
169
+ },
170
+
171
+ // return closest point on segment with attribute _sqDist - square distance to segment
172
+ _sqClosestPointOnSegment: function (p, p1, p2) {
173
+ var x2 = p2.x - p1.x,
174
+ y2 = p2.y - p1.y,
175
+ apoint = p1;
176
+ if (x2 || y2) {
177
+ var dot = (p.x - p1.x) * x2 + (p.y - p1.y) * y2,
178
+ t = dot / this._sqDist(p1, p2);
179
+
180
+ if (t > 1) {
181
+ apoint = p2;
182
+ } else if (t > 0) {
183
+ apoint = new L.Point(p1.x + x2 * t, p1.y + y2 * t);
184
+ }
185
+ }
186
+ apoint._sqDist = this._sqDist(p, apoint);
187
+ return apoint;
188
+ },
189
+
190
+ // distance from a point to a segment between two points
191
+ _sqPointToSegmentDist: function (p, p1, p2) {
192
+ return this._sqClosestPointOnSegment(p, p1, p2)._sqDist;
193
+ }
194
+ };
@@ -0,0 +1,66 @@
1
+ /*
2
+ * L.Point represents a point with x and y coordinates.
3
+ */
4
+
5
+ L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) {
6
+ this.x = (round ? Math.round(x) : x);
7
+ this.y = (round ? Math.round(y) : y);
8
+ };
9
+
10
+ L.Point.prototype = {
11
+ add: function (point) {
12
+ return this.clone()._add(point);
13
+ },
14
+
15
+ _add: function (point) {
16
+ this.x += point.x;
17
+ this.y += point.y;
18
+ return this;
19
+ },
20
+
21
+ subtract: function (point) {
22
+ return this.clone()._subtract(point);
23
+ },
24
+
25
+ // destructive subtract (faster)
26
+ _subtract: function (point) {
27
+ this.x -= point.x;
28
+ this.y -= point.y;
29
+ return this;
30
+ },
31
+
32
+ divideBy: function (num, round) {
33
+ return new L.Point(this.x / num, this.y / num, round);
34
+ },
35
+
36
+ multiplyBy: function (num) {
37
+ return new L.Point(this.x * num, this.y * num);
38
+ },
39
+
40
+ distanceTo: function (point) {
41
+ var x = point.x - this.x,
42
+ y = point.y - this.y;
43
+ return Math.sqrt(x * x + y * y);
44
+ },
45
+
46
+ round: function () {
47
+ return this.clone()._round();
48
+ },
49
+
50
+ // destructive round
51
+ _round: function () {
52
+ this.x = Math.round(this.x);
53
+ this.y = Math.round(this.y);
54
+ return this;
55
+ },
56
+
57
+ clone: function () {
58
+ return new L.Point(this.x, this.y);
59
+ },
60
+
61
+ toString: function () {
62
+ return 'Point(' +
63
+ L.Util.formatNum(this.x) + ', ' +
64
+ L.Util.formatNum(this.y) + ')';
65
+ }
66
+ };
@@ -0,0 +1,59 @@
1
+ /*
2
+ * L.PolyUtil contains utilify functions for polygons (clipping, etc.).
3
+ */
4
+
5
+ /*jshint bitwise:false */ // allow bitwise oprations here
6
+
7
+ L.PolyUtil = {};
8
+
9
+ /*
10
+ * Sutherland-Hodgeman polygon clipping algorithm.
11
+ * Used to avoid rendering parts of a polygon that are not currently visible.
12
+ */
13
+ L.PolyUtil.clipPolygon = function (points, bounds) {
14
+ var min = bounds.min,
15
+ max = bounds.max,
16
+ clippedPoints,
17
+ edges = [1, 4, 2, 8],
18
+ i, j, k,
19
+ a, b,
20
+ len, edge, p,
21
+ lu = L.LineUtil;
22
+
23
+ for (i = 0, len = points.length; i < len; i++) {
24
+ points[i]._code = lu._getBitCode(points[i], bounds);
25
+ }
26
+
27
+ // for each edge (left, bottom, right, top)
28
+ for (k = 0; k < 4; k++) {
29
+ edge = edges[k];
30
+ clippedPoints = [];
31
+
32
+ for (i = 0, len = points.length, j = len - 1; i < len; j = i++) {
33
+ a = points[i];
34
+ b = points[j];
35
+
36
+ // if a is inside the clip window
37
+ if (!(a._code & edge)) {
38
+ // if b is outside the clip window (a->b goes out of screen)
39
+ if (b._code & edge) {
40
+ p = lu._getEdgeIntersection(b, a, edge, bounds);
41
+ p._code = lu._getBitCode(p, bounds);
42
+ clippedPoints.push(p);
43
+ }
44
+ clippedPoints.push(a);
45
+
46
+ // else if b is inside the clip window (a->b enters the screen)
47
+ } else if (!(b._code & edge)) {
48
+ p = lu._getEdgeIntersection(b, a, edge, bounds);
49
+ p._code = lu._getBitCode(p, bounds);
50
+ clippedPoints.push(p);
51
+ }
52
+ }
53
+ points = clippedPoints;
54
+ }
55
+
56
+ return points;
57
+ };
58
+
59
+ /*jshint bitwise:true */