OpenLayers OpenLayers

root/trunk/openlayers/tests/Geometry/Polygon.html

Revision 7885, 13.3 kB (checked in by crschmidt, 4 months ago)

Clear bounds of geometries when reprojecting. Patch wwork by myself, tschaub,
ahocevar. r=ahocevar. (Closes #1658)

  • Property svn:eol-style set to native
Line 
1 <html>
2 <head>
3   <script src="../../lib/OpenLayers.js"></script>
4   <script type="text/javascript">
5     var polygon;
6     var components = [new OpenLayers.Geometry.Point(10,14), new OpenLayers.Geometry.Point(5,3)];
7     var components2 = [new OpenLayers.Geometry.Point(12,15), new OpenLayers.Geometry.Point(2,3), new OpenLayers.Geometry.Point(10,0), new OpenLayers.Geometry.Point(10,10)];
8     var linearRing = new OpenLayers.Geometry.LinearRing(components);
9     var linearRing2 = new OpenLayers.Geometry.LinearRing(components2);
10    
11     function test_Polygon_constructor (t) {
12         t.plan( 3 );
13         polygon = new OpenLayers.Geometry.Polygon();
14         t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
15         t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
16         t.eq( polygon.components.length, 0, "polygon.components is set correctly");
17     }
18
19     function test_Polygon_constructor (t) {
20         t.plan( 3 );
21         polygon = new OpenLayers.Geometry.Polygon([linearRing]);
22         t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
23         t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
24         t.eq( polygon.components.length, 1, "polygon.components.length is set correctly");
25     }
26    
27     function test_Polygon_constructor (t) {
28         t.plan( 3 );
29         polygon = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
30         t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
31         t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
32         t.eq( polygon.components.length, 2, "polygon.components.length is set correctly");
33     }
34    
35     function test_Polygon_transform_getBounds (t) {
36         t.plan(3);
37
38         var components = [new OpenLayers.Geometry.Point(10,14), new OpenLayers.Geometry.Point(5,3)];
39         var linearRing = new OpenLayers.Geometry.LinearRing(components);
40         polygon = new OpenLayers.Geometry.Polygon([linearRing.clone()]);
41         polygon.calculateBounds();
42         t.ok( polygon.bounds != null, "bounds calculated by calcBounds" );
43         polygon.transform(new OpenLayers.Projection("EPSG:4326"),
44                         new OpenLayers.Projection("EPSG:900913"));
45         t.eq(polygon.bounds, null, "Point bounds cleared after transform");
46         t.eq(polygon.getBounds().toBBOX(), "556597.453889,334111.171355,1113194.907778,1574216.547942", "Bounds are correct")
47     }
48
49     function test_Polygon_getArea(t) {
50         t.plan( 5 );
51
52       //no components
53         var polygon = new OpenLayers.Geometry.Polygon();
54         t.eq(polygon.getArea(), 0, "getArea empty polygon is 0");
55
56         var createSquareRing = function(area) {
57             var points = [
58                 new OpenLayers.Geometry.Point(0, 0),
59                 new OpenLayers.Geometry.Point(0, area),
60                 new OpenLayers.Geometry.Point(area, area),
61                 new OpenLayers.Geometry.Point(area, 0)
62             ];
63             var ring = new OpenLayers.Geometry.LinearRing(points);
64             return ring;
65         };
66    
67
68       //simple polygon
69         var comps = [ createSquareRing(2) ];
70        
71         var polygon = new OpenLayers.Geometry.Polygon(comps);
72         t.eq(polygon.getArea(), 4, "getArea simple polygon works lovely");
73
74       //polygon with holes
75         comps = [ createSquareRing(10),
76                            createSquareRing(2),
77                            createSquareRing(3),
78                            createSquareRing(4)
79                          ];
80
81         var polygon = new OpenLayers.Geometry.Polygon(comps);
82         t.eq(polygon.getArea(), 71, "getArea polygon with holes works lovely");
83        
84       //simple polygon negative
85         comps = [ createSquareRing(-2) ];
86        
87         var polygon = new OpenLayers.Geometry.Polygon(comps);
88         t.eq(polygon.getArea(), 4, "getArea simple polygon negative works lovely");
89
90       //polygon with holes negative
91         comps = [ createSquareRing(-10),
92                            createSquareRing(-2),
93                            createSquareRing(-3),
94                            createSquareRing(-4)
95                          ];
96        
97         var polygon = new OpenLayers.Geometry.Polygon(comps);
98         t.eq(polygon.getArea(), 71, "getArea negative polygon with holes works lovely");
99        
100     }
101    
102     function test_Polygon_move(t) {
103         t.plan(4);
104        
105         polygon = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
106        
107         var x = linearRing.components[0].x;
108         var y = linearRing.components[0].y;
109         var x2 = linearRing2.components[0].x;
110         var y2 = linearRing2.components[0].y;
111        
112         var dx = 10 * Math.random();
113         var dy = 10 * Math.random();
114
115         polygon.move(dx, dy);
116
117         t.eq(polygon.components[0].components[0].x, x + dx, "move() correctly modifies first x");
118         t.eq(polygon.components[0].components[0].y, y + dy, "move() correctly modifies first y");
119         t.eq(polygon.components[1].components[0].x, x2 + dx, "move() correctly modifies second x");
120         t.eq(polygon.components[1].components[0].y, y2 + dy, "move() correctly modifies second y");
121     }
122
123     function test_Polygon_rotate(t) {
124         t.plan(6);
125        
126         var geometry = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
127        
128         var originals = [];
129         var comp;
130         var angle = 2 * Math.PI * Math.random();
131         var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
132                                                    10 * Math.random());
133         for(var i=0; i<geometry.components.length; ++i) {
134             comp = geometry.components[i];
135             originals[i] = comp.rotate;
136             comp.rotate = function(a, o) {
137                 t.ok(true, "rotate called for component " + i);
138                 t.ok(a == angle, "rotate called with correct angle");
139                 t.ok(o == origin, "rotate called with correct origin");
140             }
141         }
142         geometry.rotate(angle, origin);
143        
144         // restore the original rotate defs
145         for(var i=0; i<geometry.components.length; ++i) {
146             comp.rotate = originals[i];
147         }
148     }
149
150     function test_Polygon_resize(t) {
151         t.plan(8);
152        
153         var tolerance = 1e-10;
154         var geometry = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
155         var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
156                                                    10 * Math.random());
157         var scale = 10 * Math.random();
158        
159         var oldArea = geometry.getArea();
160         var oldPerimeter = geometry.getLength();
161         geometry.resize(scale, origin);
162         var newArea = geometry.getArea();
163         var newPerimeter = geometry.getLength();
164        
165         t.ok((((newArea / oldArea) - (scale * scale)) / (scale * scale)) < tolerance,
166              "resize correctly changes the area of a polygon")
167         t.ok((((newPerimeter / oldPerimeter) - scale) / scale) < tolerance,
168              "resize correctly changes the perimeter of a polygon")
169
170         var originals = [];
171         var comp;
172         for(var i=0; i<geometry.components.length; ++i) {
173             comp = geometry.components[i];
174             originals[i] = comp.resize;
175             comp.resize = function(s, o) {
176                 t.ok(true, "resize called for component " + i);
177                 t.ok(s == scale, "resize called with correct scale");
178                 t.ok(o == origin, "resize called with correct origin");
179             }
180         }
181         geometry.resize(scale, origin);
182        
183         // restore the original resize defs
184         for(var i=0; i<geometry.components.length; ++i) {
185             comp.resize = originals[i];
186         }
187        
188     }
189
190     function test_Polygon_createRegular(t) {
191         t.plan(22);
192         var sides = 40;
193         var poly = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(5,0), 6, sides);
194         var polyBounds = poly.getBounds();
195         t.eq(polyBounds.toBBOX(), "-0.981504,-5.981504,10.981504,5.981504", sides + " sided figure generates correct bbox.");
196         t.eq(poly.components.length, 1, "Poly has one linear ring");
197         t.eq(poly.components[0].components.length, sides + 1, "ring has 41 components");
198         t.eq(poly.components[0].components[0].id, poly.components[0].components[sides].id, "ring starts and ends with same geom");
199         t.eq(Math.round(poly.getArea()), Math.round(Math.PI * 36), "area of "+sides+" sided poly rounds to same area as a circle.");
200        
201         var sides = 3;
202         var poly = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(5,0), 6, sides);
203         var polyBounds = poly.getBounds();
204         t.eq(polyBounds.toBBOX(), "-0.196152,-3,10.196152,6", sides + " sided figure generates correct bbox.");
205         t.eq(poly.components.length, 1, "Poly has one linear ring");
206         t.eq(poly.components[0].components.length, sides + 1, "ring has  correct count of  components");
207         t.eq(poly.components[0].components[0].id, poly.components[0].components[sides].id, "ring starts and ends with same geom");
208         t.eq(Math.round(poly.getArea()), 47, "area of 3 sided poly is correct");
209        
210         var sides = 3;
211         var poly3 = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(10,0), 15, sides);
212         var polyBounds = poly3.getBounds();
213         t.eq(polyBounds.toBBOX(), "-2.990381,-7.5,22.990381,15", sides + " sided figure generates correct bbox.");
214         t.eq(Math.round(polyBounds.getCenterLonLat().lon), 10, "longitude of center of bounds is same as origin");
215         t.eq(poly3.components.length, 1, "Poly has one linear ring");
216         t.eq(poly3.components[0].components.length, sides + 1, "ring has  correct count of  components");
217         t.eq(poly3.components[0].components[0].id, poly3.components[0].components[sides].id, "ring starts and ends with same geom");
218         t.ok(poly3.getArea() > poly.getArea(), "area with radius 15 > poly with radius 6");
219        
220         var sides = 4;
221         var poly4 = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(10,0), 15, sides);
222         var polyBounds = poly4.getBounds();
223         t.eq(polyBounds.toBBOX(), "-0.606602,-10.606602,20.606602,10.606602", sides + " sided figure generates correct bbox.");
224         t.eq(Math.round(polyBounds.getCenterLonLat().lon), 10, "longitude of center of bounds is same as origin");
225         t.eq(poly4.components.length, 1, "Poly has one linear ring");
226         t.eq(poly4.components[0].components.length, sides + 1, "ring has  correct count of  components");
227         t.eq(poly4.components[0].components[0].id, poly4.components[0].components[sides].id, "ring starts and ends with same geom");
228         t.ok(poly4.getArea() > poly3.getArea(), "square with radius 15 > triangle with radius 15");
229     }
230
231     function test_Polygon_equals(t) {
232         t.plan(3);
233        
234         var x0 = Math.random() * 100;
235         var y0 = Math.random() * 100;
236         var x1 = Math.random() * 100;
237         var y1 = Math.random() * 100;
238         var x2 = Math.random() * 100;
239         var y2 = Math.random() * 100;
240         var point0 = new OpenLayers.Geometry.Point(x0, y0);
241         var point1 = new OpenLayers.Geometry.Point(x1, y1);
242         var point2 = new OpenLayers.Geometry.Point(x2, y2);
243         var pointX = new OpenLayers.Geometry.Point(x0 + 1, y0);
244         var pointY = new OpenLayers.Geometry.Point(x0, y0 + 1);
245         var geometry = new OpenLayers.Geometry.Polygon([
246                             new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
247         var equal = new OpenLayers.Geometry.Polygon([
248                             new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
249         var offX = new OpenLayers.Geometry.Polygon([
250                             new OpenLayers.Geometry.LinearRing([pointX, point1, point2])]);
251         var offY = new OpenLayers.Geometry.Polygon([
252                             new OpenLayers.Geometry.LinearRing([pointY, point1, point2])]);
253         t.ok(geometry.equals(equal),
254              "equals() returns true for a geometry with equivalent coordinates");
255         t.ok(!geometry.equals(offX),
256              "equals() returns false for a geometry with offset x");
257         t.ok(!geometry.equals(offY),
258              "equals() returns false for a geometry with offset y");
259     }
260    
261     function test_Polygon_clone(t) {
262         t.plan(2);
263        
264         var x0 = Math.random() * 100;
265         var y0 = Math.random() * 100;
266         var x1 = Math.random() * 100;
267         var y1 = Math.random() * 100;
268         var x2 = Math.random() * 100;
269         var y2 = Math.random() * 100;
270         var point0 = new OpenLayers.Geometry.Point(x0, y0);
271         var point1 = new OpenLayers.Geometry.Point(x1, y1);
272         var point2 = new OpenLayers.Geometry.Point(x2, y2);
273         var geometry = new OpenLayers.Geometry.Polygon([
274                             new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
275         var clone = geometry.clone();
276         t.ok(clone instanceof OpenLayers.Geometry.Polygon,
277              "clone() creates an OpenLayers.Geometry.Polygon");
278         t.ok(geometry.equals(clone), "clone has equivalent coordinates");
279     }
280    
281
282   </script>
283 </head>
284 <body>
285 </body>
286 </html>
Note: See TracBrowser for help on using the browser.