@@ -88,18 +88,9 @@ private static LinearRing filterRing(LinearRing linearRing) {
88
88
int numPoints = linearRing .length ();
89
89
int count = 2 ;
90
90
for (int i = 1 ; i < numPoints - 1 ; i ++) {
91
- if (linearRing .getLon (i - 1 ) == linearRing .getLon (i )) {
92
- if (linearRing .getLat (i - 1 ) == linearRing .getLat (i )) {
93
- // same point
94
- continue ;
95
- }
96
- if (linearRing .getLon (i - 1 ) == linearRing .getLon (i + 1 )
97
- && linearRing .getLat (i - 1 ) > linearRing .getLat (i ) != linearRing .getLat (i + 1 ) > linearRing .getLat (i )) {
98
- // coplanar
99
- continue ;
100
- }
91
+ if (skipPoint (linearRing , i ) == false ) {
92
+ count ++;
101
93
}
102
- count ++;
103
94
}
104
95
if (numPoints == count ) {
105
96
return linearRing ;
@@ -111,19 +102,31 @@ private static LinearRing filterRing(LinearRing linearRing) {
111
102
lons [0 ] = lons [count - 1 ] = linearRing .getLon (0 );
112
103
count = 0 ;
113
104
for (int i = 1 ; i < numPoints - 1 ; i ++) {
114
- if (linearRing .getLon (i - 1 ) == linearRing .getLon (i )) {
115
- if (linearRing .getLat (i - 1 ) == linearRing .getLat (i ) || linearRing .getLon (i - 1 ) == linearRing .getLon (i + 1 )) {
116
- // filter
117
- continue ;
118
- }
105
+ if (skipPoint (linearRing , i ) == false ) {
106
+ count ++;
107
+ lats [count ] = linearRing .getLat (i );
108
+ lons [count ] = linearRing .getLon (i );
119
109
}
120
- count ++;
121
- lats [count ] = linearRing .getLat (i );
122
- lons [count ] = linearRing .getLon (i );
123
110
}
124
111
return new LinearRing (lons , lats );
125
112
}
126
113
114
+ private static boolean skipPoint (LinearRing linearRing , int i ) {
115
+ if (linearRing .getLon (i - 1 ) == linearRing .getLon (i )) {
116
+ if (linearRing .getLat (i - 1 ) == linearRing .getLat (i )) {
117
+ // same point
118
+ return true ;
119
+ }
120
+ if (linearRing .getLon (i - 1 ) == linearRing .getLon (i + 1 )
121
+ && linearRing .getLat (i - 1 ) > linearRing .getLat (i ) != linearRing .getLat (i + 1 ) > linearRing .getLat (i )) {
122
+ // collinear - we only remove points that go in the same direction. So latitudes [1,2,3] we would want
123
+ // to remove 1 but for [1,2,-1] we don't.
124
+ return true ;
125
+ }
126
+ }
127
+ return false ;
128
+ }
129
+
127
130
private static void validateHole (LinearRing shell , LinearRing hole ) {
128
131
Set <Point > exterior = new HashSet <>();
129
132
Set <Point > interior = new HashSet <>();
0 commit comments