Index: /trunk/src/org/openstreetmap/josm/data/Bounds.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/Bounds.java	(revision 14520)
+++ /trunk/src/org/openstreetmap/josm/data/Bounds.java	(revision 14521)
@@ -500,9 +500,22 @@
      */
     public Rectangle2D.Double asRect() {
-        double w = getWidth();
-        return new Rectangle2D.Double(minLon, minLat, w, maxLat-minLat);
-    }
-
-    private double getWidth() {
+        return new Rectangle2D.Double(minLon, minLat, getWidth(), getHeight());
+    }
+
+    /**
+     * Returns the bounds width.
+     * @return the bounds width
+     * @since 14521
+     */
+    public double getHeight() {
+        return maxLat-minLat;
+    }
+
+    /**
+     * Returns the bounds width.
+     * @return the bounds width
+     * @since 14521
+     */
+    public double getWidth() {
         return maxLon-minLon + (crosses180thMeridian() ? 360.0 : 0.0);
     }
@@ -513,5 +526,5 @@
      */
     public double getArea() {
-        return getWidth() * (maxLat - minLat);
+        return getWidth() * getHeight();
     }
 
Index: /trunk/src/org/openstreetmap/josm/tools/Geometry.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 14520)
+++ /trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 14521)
@@ -840,5 +840,5 @@
         BigDecimal east = BigDecimal.ZERO;
 
-        // See https://en.wikipedia.org/wiki/Centroid#Centroid_of_a_polygon for the equation used here
+        // See https://en.wikipedia.org/wiki/Centroid#Of_a_polygon for the equation used here
         for (int i = 0; i < size; i++) {
             EastNorth n0 = nodes.get(i);
Index: /trunk/test/unit/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreferenceTestIT.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreferenceTestIT.java	(revision 14520)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreferenceTestIT.java	(revision 14521)
@@ -13,8 +13,8 @@
 import java.util.Set;
 import java.util.TreeMap;
-import java.util.stream.Collectors;
 
 import org.junit.Rule;
 import org.junit.Test;
+import org.openstreetmap.gui.jmapviewer.Coordinate;
 import org.openstreetmap.gui.jmapviewer.TileXY;
 import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate;
@@ -23,4 +23,5 @@
 import org.openstreetmap.gui.jmapviewer.tilesources.ScanexTileSource;
 import org.openstreetmap.gui.jmapviewer.tilesources.TemplatedTMSTileSource;
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.imagery.CoordinateConversion;
@@ -33,8 +34,6 @@
 import org.openstreetmap.josm.data.imagery.WMTSTileSource;
 import org.openstreetmap.josm.data.imagery.WMTSTileSource.WMTSGetCapabilitiesException;
-import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.ProjectionRegistry;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
-import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.HttpClient;
 import org.openstreetmap.josm.tools.HttpClient.Response;
@@ -106,14 +105,52 @@
     }
 
+    private static LatLon getPointInShape(Shape shape) {
+        final Coordinate p1 = shape.getPoints().get(0);
+        final Bounds bounds = new Bounds(p1.getLat(), p1.getLon(), p1.getLat(), p1.getLon());
+        shape.getPoints().forEach(p -> bounds.extend(p.getLat(), p.getLon()));
+
+        final double w = bounds.getWidth();
+        final double h = bounds.getHeight();
+
+        final double x2 = bounds.getMinLon() + (w / 2.0);
+        final double y2 = bounds.getMinLat() + (h / 2.0);
+
+        final LatLon center = new LatLon(y2, x2);
+
+        // check to see if center is inside shape
+        if (shape.contains(center)) {
+            return center;
+        }
+
+        // if center position (C) is not inside shape, try naively some other positions as follows:
+        final double x1 = bounds.getMinLon() + (.25 * w);
+        final double x3 = bounds.getMinLon() + (.75 * w);
+        final double y1 = bounds.getMinLat() + (.25 * h);
+        final double y3 = bounds.getMinLat() + (.75 * h);
+        // +-----------+
+        // |  5  1  6  |
+        // |  4  C  2  |
+        // |  8  3  7  |
+        // +-----------+
+        for (LatLon candidate : new LatLon[] {
+                new LatLon(y1, x2),
+                new LatLon(y2, x3),
+                new LatLon(y3, x2),
+                new LatLon(y2, x1),
+                new LatLon(y1, x1),
+                new LatLon(y1, x3),
+                new LatLon(y3, x3),
+                new LatLon(y3, x1)
+        }) {
+            if (shape.contains(candidate)) {
+                return candidate;
+            }
+        }
+        return center;
+    }
+
     private static LatLon getCenter(ImageryBounds bounds) {
         List<Shape> shapes = bounds.getShapes();
-        Projection proj = ProjectionRegistry.getProjection();
-        return shapes != null && shapes.size() > 1
-                ? proj.eastNorth2latlon(
-                        Geometry.getCentroidEN(shapes.get(0).getPoints().stream()
-                                .map(CoordinateConversion::coorToLL)
-                                .map(proj::latlon2eastNorth)
-                                .collect(Collectors.toList())))
-                : bounds.getCenter();
+        return shapes != null && !shapes.isEmpty() ? getPointInShape(shapes.get(0)) : bounds.getCenter();
     }
 
