Ignore:
Timestamp:
2015-07-26T17:03:37+02:00 (9 years ago)
Author:
wiktorn
Message:

Fix calculation of World Bounds for WMS when no projection has no bounds defined, and bogus results are returned on boundaries.

Closes: #11697, #11701

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java

    r8599 r8618  
    1515import org.openstreetmap.josm.data.coor.LatLon;
    1616import org.openstreetmap.josm.data.osm.BBox;
     17import org.openstreetmap.josm.data.projection.CustomProjection;
    1718import org.openstreetmap.josm.data.projection.Projection;
    1819import org.openstreetmap.josm.data.projection.Projections;
     
    6768
    6869    @Test
     70    public void testEPSG4326_widebounds() {
     71        Main.setProjection(new CustomProjection("+proj=lonlat +datum=WGS84 +axis=neu +bounds=-180,53,180,54"));
     72        TemplatedWMSTileSource source = getSource();
     73
     74        verifyLocation(source, new LatLon(53.5937132, 19.5652017));
     75        verifyLocation(source, new LatLon(53.501565692302854, 18.54455233898721));
     76    }
     77
     78    @Test
     79    public void testEPSG4326_narrowbounds() {
     80        Main.setProjection(new CustomProjection("+proj=lonlat +datum=WGS84 +axis=neu +bounds=18,-90,20,90"));
     81        TemplatedWMSTileSource source = getSource();
     82
     83        verifyLocation(source, new LatLon(53.5937132, 19.5652017));
     84        verifyLocation(source, new LatLon(53.501565692302854, 18.54455233898721));
     85    }
     86
     87    @Test
    6988    public void testEPSG2180() {
    7089        Main.setProjection(Projections.getProjectionByCode("EPSG:2180"));
     
    7796        verifyTileSquarness(source, 150, 20, 18);
    7897        verifyTileSquarness(source, 2270, 1323, 12);
     98    }
     99
     100    @Test
     101    public void testEPSG3006_withbounds() {
     102        Main.setProjection(
     103                new CustomProjection("+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 "
     104                        + "+units=m +no_defs +axis=neu +wmssrs=EPSG:3006 +bounds=10.5700,55.2000,24.1800,69.1000 "));
     105        TemplatedWMSTileSource source = getSource();
     106
     107        verifyLocation(source, new LatLon(60, 18), 3);
     108        verifyLocation(source, new LatLon(60, 18));
     109
     110    }
     111
     112    @Test
     113    public void testEPSG3006_withoutbounds() {
     114        Main.setProjection(
     115                new CustomProjection("+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 "
     116                        + "+units=m +no_defs +axis=neu +wmssrs=EPSG:3006"));
     117        TemplatedWMSTileSource source = getSource();
     118
     119        verifyTileSquarness(source, 0, 1, 4);
     120        verifyLocation(source, new LatLon(60, 18.1), 3);
     121        verifyLocation(source, new LatLon(60, 18.1));
     122
    79123    }
    80124
     
    83127        LatLon result = getTileLatLon(source, x, y, z);
    84128        LatLon expected = new LatLon(verifier.tileYToLat(y, z - 1), verifier.tileXToLon(x, z - 1)); //
    85         System.out.println(z + "/" + x + "/" + y + " - result: " + result.toDisplayString() + " osmMercator: " +  expected.toDisplayString());
    86129        assertTrue("result: " + result.toDisplayString() + " osmMercator: " +  expected.toDisplayString(), result.equalsEpsilon(expected));
    87130        LatLon tileCenter = new Bounds(result, getTileLatLon(source, x+1, y+1, z)).getCenter();
     
    92135
    93136    private void verifyLocation(TemplatedWMSTileSource source, LatLon location) {
    94         for (int z = 1; z < 22; z++) {
    95             TileXY tileIndex = source.latLonToTileXY(location.toCoordinate(), z);
    96             BBox bbox = new BBox(
    97                     getTileLatLon(source, tileIndex, z),
    98                     getTileLatLon(source, tileIndex.getXIndex() + 1, tileIndex.getYIndex() + 1, z)
    99                     );
    100             assertTrue(location.toDisplayString() + " not within " + bbox.toString() +
    101                     " for tile " + z + "/" + tileIndex.getXIndex() + "/" + tileIndex.getYIndex(),
    102                     bbox.bounds(location));
     137        for (int z = 22; z > 1; z--) {
     138            verifyLocation(source, location, z);
    103139        }
     140    }
     141
     142    private void verifyLocation(TemplatedWMSTileSource source, LatLon location, int z) {
     143        assertTrue(
     144                "Point outside world bounds",
     145                Main.getProjection().getWorldBoundsLatLon().contains(location)
     146                );
     147
     148        TileXY tileIndex = source.latLonToTileXY(location.toCoordinate(), z);
     149
     150        assertTrue("X index: " + tileIndex.getXIndex() + " greater than tileXmax: " + source.getTileXMax(z) + " at zoom: " + z,
     151                tileIndex.getXIndex() <= source.getTileXMax(z));
     152
     153        assertTrue("Y index: " + tileIndex.getYIndex() + " greater than tileYmax: " + source.getTileYMax(z) + " at zoom: " + z,
     154                tileIndex.getYIndex() <= source.getTileYMax(z));
     155
     156        // test that location is within tile bounds
     157        BBox bbox = new BBox(
     158                getTileLatLon(source, tileIndex, z),
     159                getTileLatLon(source, tileIndex.getXIndex() + 1, tileIndex.getYIndex() + 1, z)
     160                );
     161        assertTrue(location.toDisplayString() + " not within " + bbox.toString() +
     162                " for tile " + z + "/" + tileIndex.getXIndex() + "/" + tileIndex.getYIndex(),
     163                bbox.bounds(location));
     164        verifyTileSquarness(source, tileIndex.getXIndex(), tileIndex.getYIndex(), z);
    104165    }
    105166
     
    119180         * t3 | t4
    120181         */
    121         EastNorth t1 = proj.latlon2eastNorth(getTileLatLon(source, x, y, z));
    122         EastNorth t2 = proj.latlon2eastNorth(getTileLatLon(source, x + 1, y, z));
    123         EastNorth t3 = proj.latlon2eastNorth(getTileLatLon(source, x, y + 1, z));
    124         EastNorth t4 = proj.latlon2eastNorth(getTileLatLon(source, x + 1, y + 1, z));
     182        EastNorth t1 = source.getTileEastNorth(x, y, z);
     183        EastNorth t2 = source.getTileEastNorth(x + 1, y, z);
     184        EastNorth t3 = source.getTileEastNorth(x, y + 1, z);
     185        EastNorth t4 = source.getTileEastNorth(x + 1, y + 1, z);
    125186        double y_size = Math.abs(t1.getY() - t4.getY());
    126187        double x_size = Math.abs(t1.getX() - t4.getX());
    127188
    128         assertEquals(x_size, y_size, Math.max(x_size, y_size) * 1e-05);
    129         assertEquals(y_size, Math.abs(t1.getY() - t3.getY()), y_size * 1e-05);
    130         assertEquals(x_size, Math.abs(t1.getX() - t2.getX()), x_size * 1e-05);
     189        assertEquals(x_size, y_size, Math.max(x_size, y_size) * 1e-06);
     190        assertEquals(y_size, Math.abs(t1.getY() - t3.getY()), y_size * 1e-06);
     191        assertEquals(x_size, Math.abs(t1.getX() - t2.getX()), x_size * 1e-06);
    131192
    132193        t1 = source.getTileEastNorth(x, y, z);
Note: See TracChangeset for help on using the changeset viewer.