Subversion Repositories mkgmap

Rev

Rev 4093 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2018.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 or
 * version 2 as published by the Free Software Foundation.
 *
 * 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
 * General Public License for more details.
 */

package uk.me.parabola.mkgmap.reader.hgt;

import static org.junit.Assert.*;

import org.junit.Test;

import uk.me.parabola.imgfmt.app.Area;
import uk.me.parabola.imgfmt.app.Coord;
import uk.me.parabola.imgfmt.app.dem.DEMFile;

/**
 * Tests for HGTConverter.
 * @author Gerd Petermann
 *
 */

public class HGTConverterTest {
        private final static String HGT_PATH = "test/resources/in/hgt";
        @Test
        public void testLat0Top() throws Exception {
               
                // top is exactly at 0, caused ArrayIndexOutOfBoundsException with r4065
                Area bbox = new Area(-1.04296875, -90.9, 0.0, -90.0);
                HGTConverter hgtConverter = new HGTConverter(HGT_PATH, bbox, null, DEMFile.EXTRA);
                // test data contains sone islands with volcanos, bbox corners are all in the ocean
                assertEquals(0, hgtConverter.getElevation(bbox.getMaxLat() * 256, bbox.getMinLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMaxLat() * 256, bbox.getMaxLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMinLat() * 256, bbox.getMinLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMinLat() * 256, bbox.getMaxLong() * 256));
               
                // retrieve value at offset 646834 (0x9DEB2) in S01W091.hgt
                double hgtDis = 1.0D/1200;
                int lat32 =  (int) ((Math.round(-0.22395 / hgtDis) * hgtDis) * (1<<29) / 45);
                int lon32 =  (int) ((Math.round(-90.71 / hgtDis) * hgtDis) * (1<<29) / 45);
                assertEquals(308, hgtConverter.getElevation(lat32, lon32));
        }

        @Test
        public void testLat0Bottom() throws Exception {
                Area bbox = new Area(0, -90.9, 0.1, -90.0);
                HGTConverter hgtConverter = new HGTConverter(HGT_PATH, bbox, null, DEMFile.EXTRA);
                assertEquals(0, hgtConverter.getElevation(bbox.getMaxLat() * 256, bbox.getMinLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMaxLat() * 256, bbox.getMaxLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMinLat() * 256, bbox.getMinLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMinLat() * 256, bbox.getMaxLong() * 256));
        }

        @Test
        public void testLon0Left() throws Exception {
               
                Area bbox = new Area(0, 0.1, 0.1, 1.0);
                HGTConverter hgtConverter = new HGTConverter(HGT_PATH, bbox, null, DEMFile.EXTRA);
                assertEquals(0, hgtConverter.getElevation(bbox.getMaxLat() * 256, bbox.getMinLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMaxLat() * 256, bbox.getMaxLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMinLat() * 256, bbox.getMinLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMinLat() * 256, bbox.getMaxLong() * 256));
        }

        @Test
        public void testLon0Right() throws Exception {
                Area bbox = new Area(0, 0.1, 0.1, 0.0);
                HGTConverter hgtConverter = new HGTConverter(HGT_PATH, bbox, null, DEMFile.EXTRA);
                assertEquals(0, hgtConverter.getElevation(bbox.getMaxLat() * 256, bbox.getMinLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMaxLat() * 256, bbox.getMaxLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMinLat() * 256, bbox.getMinLong() * 256));
                assertEquals(0, hgtConverter.getElevation(bbox.getMinLat() * 256, bbox.getMaxLong() * 256));
        }

        @Test
        public void testReadHeight() throws Exception {
               
                Area bbox = new Area(-1.04296875, -91.1, 0.1, -89.9);
                HGTConverter hgtConverter = new HGTConverter(HGT_PATH, bbox, null, DEMFile.EXTRA);

                int hgtRes = 1200;
                double hgtDis = 1.0D/hgtRes;
                int hgtX = 348;
                int hgtY = 931;
               
                int fileOffset = 2 * ((hgtRes - hgtY) * (hgtRes + 1) + hgtX);
                assertEquals(646834, fileOffset);
                // get a value from S01W091.hgt
                double hgtLat = 0.0 - (hgtRes - hgtY) * hgtDis;
                double hgtLon = -91.0 + hgtX * hgtDis;
                // convert to DEM units
                int lat32 =  (int) (hgtLat / HGTConverter.FACTOR);
                int lon32 =  (int) (hgtLon / HGTConverter.FACTOR);
                assertTrue(bbox.contains(new Coord(hgtLat, hgtLon)));
                assertEquals(308, hgtConverter.getElevation(lat32, lon32));
               
        }
       
}