2525
2626public class BoundingBox {
2727
28+ boolean allowWraparound = Boolean .parseBoolean (System .getenv ().getOrDefault ("ALLOW_BBOX_WRAPAROUND" , "true" ));
29+
2830 private double xMin = Double .POSITIVE_INFINITY ;
2931 private double xMax = Double .NEGATIVE_INFINITY ;
3032 private double yMin = Double .POSITIVE_INFINITY ;
@@ -110,7 +112,7 @@ void update(Geometry geometry, String crs) {
110112 }
111113 }
112114
113- updateXBounds (minX , maxX );
115+ updateXBounds (minX , maxX , allowWraparound );
114116
115117 yMin = Math .min (yMin , minY );
116118 yMax = Math .max (yMax , maxY );
@@ -125,7 +127,7 @@ void merge(BoundingBox other) {
125127 double minX = other .xMin ;
126128 double maxX = other .xMax ;
127129
128- updateXBounds (minX , maxX );
130+ updateXBounds (minX , maxX , allowWraparound );
129131
130132 yMin = Math .min (yMin , other .yMin );
131133 yMax = Math .max (yMax , other .yMax );
@@ -161,26 +163,31 @@ private boolean isCrossingAntiMeridian(double x1, double x2) {
161163 return Math .abs (x1 - x2 ) > 180 ;
162164 }
163165
164- private void updateXBounds (double minX , double maxX ) {
165- if (xMin == Double . POSITIVE_INFINITY || xMax == Double . NEGATIVE_INFINITY ) {
166- xMin = minX ;
167- xMax = maxX ;
166+ private void updateXBounds (double minX , double maxX , boolean allowWraparound ) {
167+ if (! allowWraparound ) {
168+ xMin = Math . min ( xMin , minX ) ;
169+ xMax = Math . max ( xMax , maxX ) ;
168170 } else {
169- if (!isCrossingAntiMeridian (xMax , xMin )) {
170- if (!isCrossingAntiMeridian (maxX , minX )) {
171- xMin = Math .min (xMin , minX );
172- xMax = Math .max (xMax , maxX );
173- } else {
174- xMin = Math .max (xMin , maxX );
175- xMax = Math .min (xMax , minX );
176- }
171+ if (xMin == Double .POSITIVE_INFINITY || xMax == Double .NEGATIVE_INFINITY ) {
172+ xMin = minX ;
173+ xMax = maxX ;
177174 } else {
178- if (!isCrossingAntiMeridian (maxX , minX )) {
179- xMin = Math .max (xMin , minX );
180- xMax = Math .min (xMax , maxX );
175+ if (!isCrossingAntiMeridian (xMax , xMin )) {
176+ if (!isCrossingAntiMeridian (maxX , minX )) {
177+ xMin = Math .min (xMin , minX );
178+ xMax = Math .max (xMax , maxX );
179+ } else {
180+ xMin = Math .max (xMin , maxX );
181+ xMax = Math .min (xMax , minX );
182+ }
181183 } else {
182- xMin = Math .max (xMin , maxX );
183- xMax = Math .min (xMax , minX );
184+ if (!isCrossingAntiMeridian (maxX , minX )) {
185+ xMin = Math .max (xMin , minX );
186+ xMax = Math .min (xMax , maxX );
187+ } else {
188+ xMin = Math .max (xMin , maxX );
189+ xMax = Math .min (xMax , minX );
190+ }
184191 }
185192 }
186193 }
@@ -198,7 +205,9 @@ private boolean shouldNormalizeLongitude(String crs) {
198205 return false ;
199206 }
200207 String normalizedCrs = crs .trim ().toUpperCase ();
201- return "OGC:CRS84" .equals (normalizedCrs ) || "EPSG:4326" .equals (normalizedCrs ) || "SRID:4326" .equals (normalizedCrs );
208+ return "OGC:CRS84" .equals (normalizedCrs )
209+ || "EPSG:4326" .equals (normalizedCrs )
210+ || "SRID:4326" .equals (normalizedCrs );
202211 }
203212
204213 public BoundingBox copy () {
0 commit comments