/*
* Copyright 2010, 2011, 2012 mapsforge.org
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mapsforge.core.util;
import org.junit.Assert;
import org.junit.Test;
import org.mapsforge.core.model.CoordinatesUtil;
import org.mapsforge.core.model.Tile;
public class MercatorProjectionTest {
private static final int ZOOM_LEVEL_MAX = 30;
private static final int ZOOM_LEVEL_MIN = 0;
@Test
public void getMapSizeTest() {
for (byte zoomLevel = ZOOM_LEVEL_MIN; zoomLevel <= ZOOM_LEVEL_MAX; ++zoomLevel) {
long factor = Math.round(Math.pow(2, zoomLevel));
Assert.assertEquals(Tile.TILE_SIZE * factor, MercatorProjection.getMapSize(zoomLevel));
}
try {
MercatorProjection.getMapSize((byte) -1);
Assert.fail();
} catch (IllegalArgumentException e) {
Assert.assertTrue(true);
}
}
@Test
public void latitudeToPixelYTest() {
for (byte zoomLevel = ZOOM_LEVEL_MIN; zoomLevel <= ZOOM_LEVEL_MAX; ++zoomLevel) {
double pixelY = MercatorProjection.latitudeToPixelY(MercatorProjection.LATITUDE_MAX, zoomLevel);
Assert.assertEquals(0, pixelY, 0);
long mapSize = MercatorProjection.getMapSize(zoomLevel);
pixelY = MercatorProjection.latitudeToPixelY(0, zoomLevel);
Assert.assertEquals(mapSize / 2, pixelY, 0);
pixelY = MercatorProjection.latitudeToPixelY(MercatorProjection.LATITUDE_MIN, zoomLevel);
Assert.assertEquals(mapSize, pixelY, 0);
}
}
@Test
public void longitudeToPixelXTest() {
for (byte zoomLevel = ZOOM_LEVEL_MIN; zoomLevel <= ZOOM_LEVEL_MAX; ++zoomLevel) {
double pixelX = MercatorProjection.longitudeToPixelX(CoordinatesUtil.LONGITUDE_MIN, zoomLevel);
Assert.assertEquals(0, pixelX, 0);
long mapSize = MercatorProjection.getMapSize(zoomLevel);
pixelX = MercatorProjection.longitudeToPixelX(0, zoomLevel);
Assert.assertEquals(mapSize / 2, pixelX, 0);
pixelX = MercatorProjection.longitudeToPixelX(CoordinatesUtil.LONGITUDE_MAX, zoomLevel);
Assert.assertEquals(mapSize, pixelX, 0);
}
}
@Test
public void pixelXToLongitudeTest() {
for (byte zoomLevel = ZOOM_LEVEL_MIN; zoomLevel <= ZOOM_LEVEL_MAX; ++zoomLevel) {
double longitude = MercatorProjection.pixelXToLongitude(0, zoomLevel);
Assert.assertEquals(CoordinatesUtil.LONGITUDE_MIN, longitude, 0);
long mapSize = MercatorProjection.getMapSize(zoomLevel);
longitude = MercatorProjection.pixelXToLongitude(mapSize / 2, zoomLevel);
Assert.assertEquals(0, longitude, 0);
longitude = MercatorProjection.pixelXToLongitude(mapSize, zoomLevel);
Assert.assertEquals(CoordinatesUtil.LONGITUDE_MAX, longitude, 0);
}
}
@Test
public void pixelXToTileXTest() {
for (byte zoomLevel = ZOOM_LEVEL_MIN; zoomLevel <= ZOOM_LEVEL_MAX; ++zoomLevel) {
Assert.assertEquals(0, MercatorProjection.pixelXToTileX(0, zoomLevel));
}
}
@Test
public void pixelYToLatitudeTest() {
for (byte zoomLevel = ZOOM_LEVEL_MIN; zoomLevel <= ZOOM_LEVEL_MAX; ++zoomLevel) {
double latitude = MercatorProjection.pixelYToLatitude(0, zoomLevel);
Assert.assertEquals(MercatorProjection.LATITUDE_MAX, latitude, 0);
long mapSize = MercatorProjection.getMapSize(zoomLevel);
latitude = MercatorProjection.pixelYToLatitude(mapSize / 2, zoomLevel);
Assert.assertEquals(0, latitude, 0);
latitude = MercatorProjection.pixelYToLatitude(mapSize, zoomLevel);
Assert.assertEquals(MercatorProjection.LATITUDE_MIN, latitude, 0);
}
}
@Test
public void pixelYToTileYTest() {
for (byte zoomLevel = ZOOM_LEVEL_MIN; zoomLevel <= ZOOM_LEVEL_MAX; ++zoomLevel) {
Assert.assertEquals(0, MercatorProjection.pixelYToTileY(0, zoomLevel));
}
}
@Test
public void tileXToLongitudeTest() {
for (byte zoomLevel = ZOOM_LEVEL_MIN; zoomLevel <= ZOOM_LEVEL_MAX; ++zoomLevel) {
double longitude = MercatorProjection.tileXToLongitude(0, zoomLevel);
Assert.assertEquals(CoordinatesUtil.LONGITUDE_MIN, longitude, 0);
long tileX = MercatorProjection.getMapSize(zoomLevel) / Tile.TILE_SIZE;
longitude = MercatorProjection.tileXToLongitude(tileX, zoomLevel);
Assert.assertEquals(CoordinatesUtil.LONGITUDE_MAX, longitude, 0);
}
}
@Test
public void tileYToLatitudeTest() {
for (byte zoomLevel = ZOOM_LEVEL_MIN; zoomLevel <= ZOOM_LEVEL_MAX; ++zoomLevel) {
double latitude = MercatorProjection.tileYToLatitude(0, zoomLevel);
Assert.assertEquals(MercatorProjection.LATITUDE_MAX, latitude, 0);
long tileY = MercatorProjection.getMapSize(zoomLevel) / Tile.TILE_SIZE;
latitude = MercatorProjection.tileYToLatitude(tileY, zoomLevel);
Assert.assertEquals(MercatorProjection.LATITUDE_MIN, latitude, 0);
}
}
}