示例#1
0
  @Test
  public void testCopy() {
    DataAccess da1 = createDataAccess(name);
    da1.create(1001 * 4);
    da1.setHeader(4, 12);
    da1.setInt(1 * 4, 1);
    da1.setInt(123 * 4, 321);
    da1.setInt(1000 * 4, 1111);

    DataAccess da2 = createDataAccess(name + "2");
    da2.create(10);
    da1.copyTo(da2);
    assertEquals(12, da2.getHeader(4));
    assertEquals(1, da2.getInt(1 * 4));
    assertEquals(321, da2.getInt(123 * 4));
    assertEquals(1111, da2.getInt(1000 * 4));

    da2.setInt(1 * 4, 2);
    assertEquals(2, da2.getInt(1 * 4));
    da2.flush();
    da1.flush();
    // make sure they are independent!
    assertEquals(1, da1.getInt(1 * 4));
    da1.close();
    da2.close();
  }
示例#2
0
  @Test
  public void testBoundsCheck() {
    DataAccess da = createDataAccess(name);
    da.setSegmentSize(128);
    da.create(128 * 11);
    da.setInt(32 * 4, 302);

    // make smaller
    da.trimTo(128 * 1);
    try {
      assertEquals(302, da.getInt(32 * 4));
      assertTrue(false);
    } catch (Exception ex) {
    }
    da.close();

    da = createDataAccess(name);
    da.create(128);
    da.setInt(31 * 4, 200);
    try {
      // this should fail with an index out of bounds exception
      da.setInt(32 * 4, 220);
      assertFalse(true);
    } catch (Exception ex) {
    }
    da.close();
  }
示例#3
0
  @Test
  public void testLoadFlush() {
    DataAccess da = createDataAccess(name);
    assertFalse(da.loadExisting());
    da.create(300);
    da.setInt(7 * 4, 123);
    assertEquals(123, da.getInt(7 * 4));
    da.setInt(10 * 4, Integer.MAX_VALUE / 3);
    assertEquals(Integer.MAX_VALUE / 3, da.getInt(10 * 4));
    da.flush();

    // check noValue clearing
    assertEquals(0, da.getInt(2 * 4));
    assertEquals(0, da.getInt(3 * 4));
    assertEquals(123, da.getInt(7 * 4));
    assertEquals(Integer.MAX_VALUE / 3, da.getInt(10 * 4));
    da.close();

    // cannot load data if already closed
    try {
      da.loadExisting();
      assertTrue(false);
    } catch (Exception ex) {
      assertEquals("already closed", ex.getMessage());
    }

    da = createDataAccess(name);
    assertTrue(da.loadExisting());
    assertEquals(123, da.getInt(7 * 4));
    da.close();
  }
示例#4
0
  @Test
  public void testSet_GetBytes() {
    DataAccess da = createDataAccess(name);
    da.create(300);
    assertEquals(128, da.getSegmentSize());
    byte[] bytes = BitUtil.BIG.fromInt(Integer.MAX_VALUE / 3);
    da.setBytes(8, bytes, bytes.length);
    bytes = new byte[4];
    da.getBytes(8, bytes, bytes.length);
    assertEquals(Integer.MAX_VALUE / 3, BitUtil.BIG.toInt(bytes));

    da.setBytes(127, bytes, bytes.length);
    da.getBytes(127, bytes, bytes.length);
    assertEquals(Integer.MAX_VALUE / 3, BitUtil.BIG.toInt(bytes));

    da.close();

    long bytePos = 4294967296L + 11111;
    int segmentSizePower = 24;
    int segmentSizeInBytes = 1 << segmentSizePower;
    int indexDivisor = segmentSizeInBytes - 1;
    int bufferIndex = (int) (bytePos >>> segmentSizePower);
    int index = (int) (bytePos & indexDivisor);
    assertEquals(256, bufferIndex);
    assertEquals(11111, index);
  }
示例#5
0
  @Test
  public void testTrimTo() {
    DataAccess da = createDataAccess(name);
    da.setSegmentSize(128);
    da.create(128 * 11);
    da.setInt(1 * 4, 10);
    da.setInt(27 * 4, 200);
    da.setInt(31 * 4, 301);
    da.setInt(32 * 4, 302);
    da.setInt(337 * 4, 4000);

    // now 11 segments: (337 + 1) * 4 = 1352
    assertEquals(11, da.getSegments());
    assertEquals(11 * 128, da.getCapacity());

    // now 3 segments
    da.trimTo(128 * 2 + 1);
    assertEquals(3, da.getSegments());

    // now 2 segments
    da.trimTo(128 * 2);
    assertEquals(2, da.getSegments());
    assertEquals(301, da.getInt(31 * 4));
    assertEquals(302, da.getInt(32 * 4));

    // now only one segment
    da.trimTo(128 * 1);
    assertEquals(1, da.getSegments());
    assertEquals(301, da.getInt(31 * 4));

    // at least one segment
    da.trimTo(0);
    assertEquals(1, da.getSegments());
    da.close();
  }
示例#6
0
  @Test
  public void testEnsureCapacity() {
    DataAccess da = createDataAccess(name);
    da.create(128);
    da.setInt(31 * 4, 200);

    assertEquals(200, da.getInt(31 * 4));
    da.ensureCapacity(2 * 128);
    assertEquals(200, da.getInt(31 * 4));
    // now it shouldn't fail
    da.setInt(32 * 4, 220);
    assertEquals(220, da.getInt(32 * 4));
    da.close();

    // ensure some bigger area
    da = createDataAccess(name);
    da.create(200 * 4);
    da.ensureCapacity(600 * 4);
    da.close();
  }
示例#7
0
 @Test
 public void testRenameNoFlush() {
   DataAccess da = createDataAccess(name);
   da.create(100);
   da.setInt(17 * 4, 17);
   try {
     da.rename(name + "wow");
     assertTrue(false);
   } catch (Exception ex) {
   }
   da.close();
 }
示例#8
0
  @Test
  public void testLoadClose() {
    DataAccess da = createDataAccess(name);
    da.create(300);
    da.setInt(2 * 4, 321);
    da.flush();
    da.close();

    da = createDataAccess(name);
    assertTrue(da.loadExisting());
    assertEquals(321, da.getInt(2 * 4));
    da.close();
  }
示例#9
0
  @Test
  public void testRenameFlush() {
    DataAccess da = createDataAccess(name);
    da.create(100);
    da.setInt(17 * 4, 17);
    da.flush();
    assertTrue(new File(directory + name).exists());
    da.rename(name + "wow");
    assertFalse(new File(directory + name).exists());
    assertTrue(new File(directory + name + "wow").exists());
    assertEquals(17, da.getInt(17 * 4));
    da.close();

    da = createDataAccess(name + "wow");
    assertTrue(da.loadExisting());
    assertEquals(17, da.getInt(17 * 4));
    da.close();
  }
示例#10
0
  @Test
  public void testSet_Get_Short_Long() {
    DataAccess da = createDataAccess(name);
    da.create(300);
    da.setShort(6, (short) (Short.MAX_VALUE / 5));
    assertEquals(Short.MAX_VALUE / 5, da.getShort(6));

    da.setShort(8, (short) (Short.MAX_VALUE / 7));
    assertEquals(Short.MAX_VALUE / 7, da.getShort(8));

    // currently RAMIntDA does not support arbitrary byte positions
    if (!(da instanceof RAMIntDataAccess)) {
      da.setShort(7, (short) (Short.MAX_VALUE / 3));
      assertEquals(Short.MAX_VALUE / 3, da.getShort(7));
      // should be overwritten
      assertNotEquals(Short.MAX_VALUE / 3, da.getShort(8));
    }
    da.close();
  }
示例#11
0
  @Test
  public void testHeader() {
    DataAccess da = createDataAccess(name);
    da.create(300);
    da.setHeader(7 * 4, 123);
    assertEquals(123, da.getHeader(7 * 4));
    da.setHeader(10 * 4, Integer.MAX_VALUE / 3);
    assertEquals(Integer.MAX_VALUE / 3, da.getHeader(10 * 4));

    da.setHeader(11 * 4, Helper.degreeToInt(123.321));
    assertEquals(123.321, Helper.intToDegree(da.getHeader(11 * 4)), 1e-4);
    da.flush();
    da.close();

    da = createDataAccess(name);
    assertTrue(da.loadExisting());
    assertEquals(123, da.getHeader(7 * 4));
    da.close();
  }
示例#12
0
  @Test
  public void testSegments() {
    DataAccess da = createDataAccess(name);
    da.setSegmentSize(128);
    da.create(10);
    assertEquals(1, da.getSegments());
    da.ensureCapacity(500);
    int olds = da.getSegments();
    assertTrue(olds > 3);

    da.setInt(400, 321);
    da.flush();
    da.close();

    da = createDataAccess(name);
    assertTrue(da.loadExisting());
    assertEquals(olds, da.getSegments());
    assertEquals(321, da.getInt(400));
    da.close();
  }
示例#13
0
  @Override
  public double getEle(double lat, double lon) {
    lat = (int) (lat * precision) / precision;
    lon = (int) (lon * precision) / precision;
    int intKey = calcIntKey(lat, lon);
    HeightTile demProvider = cacheData.get(intKey);
    if (demProvider == null) {
      if (!cacheDir.exists()) cacheDir.mkdirs();

      String fileDetails = getFileString(lat, lon);
      if (fileDetails == null) return 0;

      int minLat = down(lat);
      int minLon = down(lon);
      demProvider = new HeightTile(minLat, minLon, WIDTH, precision);
      cacheData.put(intKey, demProvider);
      try {
        String zippedURL = baseUrl + "/" + fileDetails + "hgt.zip";
        File file = new File(cacheDir, new File(zippedURL).getName());
        InputStream is;
        // get zip file if not already in cacheDir - unzip later and in-memory only!
        if (!file.exists()) {
          for (int i = 0; i < 2; i++) {
            try {
              downloader.downloadFile(zippedURL, file.getAbsolutePath());
              break;
            } catch (FileNotFoundException ex) {
              // now try with point if mirror is used
              zippedURL = baseUrl + "/" + fileDetails + ".hgt.zip";
              continue;
            }
          }
        }

        is = new FileInputStream(file);
        ZipInputStream zis = new ZipInputStream(is);
        zis.getNextEntry();
        BufferedInputStream buff = new BufferedInputStream(zis);
        byte[] bytes = new byte[2 * WIDTH * WIDTH];
        DataAccess heights = getDirectory().find("dem" + intKey);
        heights.create(bytes.length);

        demProvider.setHeights(heights);
        int len;
        while ((len = buff.read(bytes)) > 0) {
          for (int bytePos = 0; bytePos < len; bytePos += 2) {
            short val = BIT_UTIL.toShort(bytes, bytePos);
            if (val < -1000 || val > 10000) {
              // TODO fill unassigned gaps with neighbor values -> flood fill algorithm !
              // -> calculate mean with an associated weight of how long the distance to the
              // neighbor is
              //                            throw new IllegalStateException("Invalid height value "
              // + val
              //                                    + ", y:" + bytePos / WIDTH + ", x:" + (WIDTH -
              // bytePos % WIDTH));
              val = Short.MIN_VALUE;
            }

            heights.setShort(bytePos, val);
          }
        }
        // demProvider.toImage(file.getName() + ".png");
      } catch (Exception ex) {
        throw new RuntimeException(ex);
      }
    }

    short val = demProvider.getHeight(lat, lon);
    if (val == Short.MIN_VALUE) return Double.NaN;
    return val;
  }
示例#14
0
 @Override
 public void create(long initBytes) {
   turnCosts.create((long) initBytes * turnCostsEntryBytes);
 }