@@ -77,59 +77,75 @@ test('classifyRings', function(assert) {
7777 assert . end ( ) ;
7878} ) ;
7979
80- test ( 'classifyRings + maxRings' , function ( assert ) {
81- var geometry ;
82- var classified ;
80+ test ( 'classifyRings + maxRings' , function ( t ) {
8381
84- geometry = [
85- [
86- { x :0 , y :0 } ,
87- { x :0 , y :40 } ,
88- { x :40 , y :40 } ,
89- { x :40 , y :0 } ,
90- { x :0 , y :0 }
91- ] ,
92- [
93- { x :30 , y :30 } ,
94- { x :32 , y :30 } ,
95- { x :32 , y :32 } ,
96- { x :30 , y :30 }
97- ] ,
98- [
99- { x :10 , y :10 } ,
100- { x :20 , y :10 } ,
101- { x :20 , y :20 } ,
102- { x :10 , y :10 }
103- ]
104- ] ;
105- classified = classifyRings ( geometry ) ;
106- assert . equal ( classified . length , 1 , '1 polygon' ) ;
107- assert . equal ( classified [ 0 ] . length , 3 , 'polygon 1 has 1 exterior, 2 interior' ) ;
108- assert . equal ( classified [ 0 ] [ 0 ] . area , 3200 , 'polygon 1 exterior ring has area=3200' ) ;
109- assert . equal ( classified [ 0 ] [ 1 ] . area , 4 , 'polygon 1 interior ring1 has area=4' ) ;
110- assert . equal ( classified [ 0 ] [ 2 ] . area , 100 , 'polygon 1 interior ring2 has area=100' ) ;
82+ function createGeometry ( options ) {
83+ var geometry = [
84+ // Outer ring, area = 3200
85+ [ { x :0 , y :0 } , { x :0 , y :40 } , { x :40 , y :40 } , { x :40 , y :0 } , { x :0 , y :0 } ] ,
86+ // Inner ring, area = 100
87+ [ { x :30 , y :30 } , { x :32 , y :30 } , { x :32 , y :32 } , { x :30 , y :30 } ] ,
88+ // Inner ring, area = 4
89+ [ { x :10 , y :10 } , { x :20 , y :10 } , { x :20 , y :20 } , { x :10 , y :10 } ]
90+ ] ;
91+ if ( options && options . reverse ) {
92+ geometry [ 0 ] . reverse ( ) ;
93+ geometry [ 1 ] . reverse ( ) ;
94+ geometry [ 2 ] . reverse ( ) ;
95+ }
96+ return geometry ;
97+ }
11198
112- classified = classifyRings ( geometry , 2 ) ;
113- assert . equal ( classified . length , 1 , '1 polygon' ) ;
114- assert . equal ( classified [ 0 ] . length , 2 , 'polygon 1 has 1 exterior, 1 interior' ) ;
115- assert . equal ( classified [ 0 ] [ 0 ] . area , 3200 , 'polygon 1 exterior ring has area=3200' ) ;
116- assert . equal ( classified [ 0 ] [ 1 ] . area , 100 , 'polygon 1 interior ring has area=100' ) ;
11799
118- geometry [ 0 ] . reverse ( ) ;
119- geometry [ 1 ] . reverse ( ) ;
120- geometry [ 2 ] . reverse ( ) ;
121- classified = classifyRings ( geometry , 2 ) ;
122- assert . equal ( classified . length , 1 , '1 polygon' ) ;
123- assert . equal ( classified [ 0 ] . length , 2 , 'polygon 1 has 1 exterior, 1 interior' ) ;
124- assert . equal ( classified [ 0 ] [ 0 ] . area , 3200 , 'polygon 1 exterior ring has area=3200' ) ;
125- assert . equal ( classified [ 0 ] [ 1 ] . area , 100 , 'polygon 1 interior ring has area=100' ) ;
100+ t . test ( 'maxRings=undefined' , function ( t ) {
101+ var geometry = sortRings ( classifyRings ( createGeometry ( ) ) ) ;
102+ t . equal ( geometry . length , 1 ) ;
103+ t . equal ( geometry [ 0 ] . length , 3 ) ;
104+ t . equal ( geometry [ 0 ] [ 0 ] . area , 3200 ) ;
105+ t . equal ( geometry [ 0 ] [ 1 ] . area , 100 ) ;
106+ t . equal ( geometry [ 0 ] [ 2 ] . area , 4 ) ;
107+ t . end ( ) ;
108+ } ) ;
126109
127- geometry = feature . loadGeometry ( ) ;
128- classified = classifyRings ( geometry , 5 ) ;
129- assert . equal ( classified . length , 2 , '2 polygons' ) ;
130- assert . equal ( classified [ 0 ] . length , 1 , 'polygon 1 has 1 exterior' ) ;
131- assert . equal ( classified [ 1 ] . length , 5 , 'polygon 2 has 1 exterior, 4 interior' ) ;
110+ t . test ( 'maxRings=2' , function ( t ) {
111+ var geometry = sortRings ( classifyRings ( createGeometry ( ) , 2 ) ) ;
112+ t . equal ( geometry . length , 1 ) ;
113+ t . equal ( geometry [ 0 ] . length , 2 ) ;
114+ t . equal ( geometry [ 0 ] [ 0 ] . area , 3200 ) ;
115+ t . equal ( geometry [ 0 ] [ 1 ] . area , 100 ) ;
116+ t . end ( ) ;
117+ } ) ;
132118
133- assert . end ( ) ;
119+ t . test ( 'maxRings=2, reversed geometry' , function ( t ) {
120+ var geometry = sortRings ( classifyRings ( createGeometry ( { reverse : true } ) , 2 ) ) ;
121+ t . equal ( geometry . length , 1 ) ;
122+ t . equal ( geometry [ 0 ] . length , 2 ) ;
123+ t . equal ( geometry [ 0 ] [ 0 ] . area , 3200 ) ;
124+ t . equal ( geometry [ 0 ] [ 1 ] . area , 100 ) ;
125+ t . end ( ) ;
126+ } ) ;
127+
128+ t . test ( 'maxRings=5, geometry from fixture' , function ( t ) {
129+ var geometry = sortRings ( classifyRings ( feature . loadGeometry ( ) , 5 ) ) ;
130+ t . equal ( geometry . length , 2 ) ;
131+ t . equal ( geometry [ 0 ] . length , 1 ) ;
132+ t . equal ( geometry [ 1 ] . length , 5 ) ;
133+
134+ var areas = geometry [ 1 ] . map ( function ( ring ) { return ring . area ; } ) ;
135+ t . deepEqual ( areas , [ 2763951 , 21600 , 8298 , 4758 , 3411 ] ) ;
136+ t . end ( ) ;
137+ } ) ;
138+
139+ t . end ( ) ;
134140} ) ;
135141
142+ function sortRings ( geometry ) {
143+ for ( var i = 0 ; i < geometry . length ; i ++ ) {
144+ geometry [ i ] = geometry [ i ] . sort ( compareArea ) ;
145+ }
146+ return geometry ;
147+ }
148+
149+ function compareAreas ( a , b ) {
150+ return b . area - a . area ;
151+ }
0 commit comments