From 580b7b2421b0285ca8a2ae98eaeeadb491f6ed59 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sat, 6 May 2023 17:48:54 +0200 Subject: [PATCH 01/14] add hgt reader --- .../java/btools/mapcreator/HgtReader.java | 269 ++++++++++++++++++ .../java/btools/mapcreator/PosUnifier.java | 51 +++- 2 files changed, 316 insertions(+), 4 deletions(-) create mode 100644 brouter-map-creator/src/main/java/btools/mapcreator/HgtReader.java diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/HgtReader.java b/brouter-map-creator/src/main/java/btools/mapcreator/HgtReader.java new file mode 100644 index 0000000..b232bf3 --- /dev/null +++ b/brouter-map-creator/src/main/java/btools/mapcreator/HgtReader.java @@ -0,0 +1,269 @@ +// License: GPL. For details, see LICENSE file. +package btools.mapcreator; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.ShortBuffer; +import java.nio.channels.FileChannel; +import java.util.HashMap; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * adapted from https://github.com/JOSM/josm-plugins/blob/master/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/HgtReader.java + *

+ * Class HgtReader reads data from SRTM HGT files. Currently this class is restricted to a resolution of 3 arc seconds. + *

+ * SRTM data files are available at the NASA SRTM site + * + * @author Oliver Wieland <oliver.wieland@online.de> + */ +public class HgtReader { + final static boolean DEBUG = false; + + private static final int SECONDS_PER_MINUTE = 60; + + public static final String HGT_EXT = ".hgt"; + public static final String ZIP_EXT = ".zip"; + + // alter these values for different SRTM resolutions + public static final int HGT3_RES = 3; // resolution in arc seconds + public static final int HGT3_ROW_LENGTH = 1201; // number of elevation values per line + public static final int HGT_VOID = -32768; // magic number which indicates 'void data' in HGT file + public static final int HGT1_RES = 1; // <<- The new SRTM is 1-ARCSEC + public static final int HGT1_ROW_LENGTH = 3601; //-- New file resolution is 3601x3601 + /** + * The 'no elevation' data magic. + */ + public static double NO_ELEVATION = Double.NaN; + + private static String srtmFolder = ""; + + private static final Map cache = new HashMap<>(); + + public HgtReader(String folder) { + srtmFolder = folder; + } + + public static double getElevationFromHgt(double lat, double lon) { + try { + String file = getHgtFileName(lat, lon); + if (DEBUG) System.out.println("SRTM buffer " + file + " for " + lat + " " + lon); + + // given area in cache? + if (!cache.containsKey(file)) { + + // fill initial cache value. If no file is found, then + // we use it as a marker to indicate 'file has been searched + // but is not there' + cache.put(file, null); + // Try all resource directories + //for (String location : Main.pref.getAllPossiblePreferenceDirs()) + { + String fullPath = new File(srtmFolder, file + HGT_EXT).getPath(); + File f = new File(fullPath); + if (f.exists()) { + // found something: read HGT file... + ShortBuffer data = readHgtFile(fullPath); + // ... and store result in cache + cache.put(file, data); + //break; + } else { + fullPath = new File(srtmFolder, file + ZIP_EXT).getPath(); + f = new File(fullPath); + if (f.exists()) { + ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(f))); + try { + for (; ; ) { + ZipEntry ze = zis.getNextEntry(); + if (ze == null) break; + if (ze.getName().toLowerCase().endsWith(HGT_EXT)) { + // System.out.println("read zip " + ze.getName()); + ShortBuffer data = readHgtStream(zis); + // ... and store result in cache + cache.put(file, data); + break; + } + zis.closeEntry(); + } + } finally { + zis.close(); + } + } + } + } + } + + // read elevation value + return readElevation(lat, lon); + } catch (FileNotFoundException e) { + System.err.println("SRTM Get elevation from HGT " + lat + ", " + lon + " failed: => " + e.getMessage()); + // no problem... file not there + return NO_ELEVATION; + } catch (Exception ioe) { + // oops... + ioe.printStackTrace(System.err); + // fallback + return NO_ELEVATION; + } + } + + @SuppressWarnings("resource") + private static ShortBuffer readHgtFile(String file) throws Exception { + if (file == null) throw new Exception("no srmt file " + file); + + FileChannel fc = null; + ShortBuffer sb = null; + try { + // Eclipse complains here about resource leak on 'fc' - even with 'finally' clause??? + fc = new FileInputStream(file).getChannel(); + // choose the right endianness + + ByteBuffer bb = ByteBuffer.allocateDirect((int) fc.size()); + while (bb.remaining() > 0) fc.read(bb); + + bb.flip(); + //sb = bb.order(ByteOrder.LITTLE_ENDIAN).asShortBuffer(); + sb = bb.order(ByteOrder.BIG_ENDIAN).asShortBuffer(); + } finally { + if (fc != null) fc.close(); + } + + return sb; + } + + // @SuppressWarnings("resource") + private static ShortBuffer readHgtStream(InputStream zis) throws Exception { + if (zis == null) throw new Exception("no srmt stream "); + + ShortBuffer sb = null; + try { + // choose the right endianness + + byte[] bytes = zis.readAllBytes(); + ByteBuffer bb = ByteBuffer.allocate(bytes.length); + bb.put(bytes, 0, bytes.length); + //while (bb.remaining() > 0) zis.read(bb, 0, size); + + //ByteBuffer bb = ByteBuffer.allocate(zis.available()); + //Channels.newChannel(zis).read(bb); + bb.flip(); + //sb = bb.order(ByteOrder.LITTLE_ENDIAN).asShortBuffer(); + sb = bb.order(ByteOrder.BIG_ENDIAN).asShortBuffer(); + } finally { + + } + + return sb; + } + + /** + * Reads the elevation value for the given coordinate. + *

+ * See also stackexchange.com + * + * @param lat, lon the coordinate to get the elevation data for + * @return the elevation value or Double.NaN, if no value is present + */ + public static double readElevation(double lat, double lon) { + String tag = getHgtFileName(lat, lon); + + ShortBuffer sb = cache.get(tag); + + if (sb == null) { + return NO_ELEVATION; + } + + if (DEBUG) System.out.println("SRTM buffer size " + sb.capacity() + " limit " + sb.limit()); + try { + int rowLength = HGT3_ROW_LENGTH; + int resolution = HGT3_RES; + if (sb.capacity() > (HGT3_ROW_LENGTH * HGT3_ROW_LENGTH)) { + rowLength = HGT1_ROW_LENGTH; + resolution = HGT1_RES; + } + // see http://gis.stackexchange.com/questions/43743/how-to-extract-elevation-from-hgt-file + double fLat = frac(lat) * SECONDS_PER_MINUTE; + double fLon = frac(lon) * SECONDS_PER_MINUTE; + + // compute offset within HGT file + int row = (int) Math.round((fLat) * SECONDS_PER_MINUTE / resolution); + int col = (int) Math.round((fLon) * SECONDS_PER_MINUTE / resolution); + if (lon < 0) col = rowLength - col - 1; + if (lat > 0) row = rowLength - row - 1; + + + //row = rowLength - row; + int cell = (rowLength * (row)) + col; + //int cell = ((rowLength * (latitude)) + longitude); + + if (DEBUG) + System.out.println("Read SRTM elevation data from row/col/cell " + row + "," + col + ", " + cell + ", " + sb.limit()); + + // valid position in buffer? + if (cell < sb.limit()) { + short ele = sb.get(cell); + // check for data voids + if (ele == HGT_VOID) { + return NO_ELEVATION; + } else { + return ele; + } + } else { + return NO_ELEVATION; + } + } catch (Exception e) { + System.err.println("error at " + lon + " " + lat + " "); + e.printStackTrace(); + } + return NO_ELEVATION; + } + + /** + * Gets the associated HGT file name for the given way point. Usually the + * format is [N|S]nn[W|E]mmm.hgt where nn is the integral latitude + * without decimals and mmm is the longitude. + * + * @param llat,llon the coordinate to get the filename for + * @return the file name of the HGT file + */ + public static String getHgtFileName(double llat, double llon) { + int lat = (int) llat; + int lon = (int) llon; + + String latPref = "N"; + if (lat < 0) { + latPref = "S"; + lat = -lat + 1; + } + String lonPref = "E"; + if (lon < 0) { + lonPref = "W"; + lon = -lon + 1; + } + + return String.format("%s%02d%s%03d", latPref, lat, lonPref, lon); + } + + public static double frac(double d) { + long iPart; + double fPart; + + // Get user input + iPart = (long) d; + fPart = d - iPart; + return Math.abs(fPart); + } + + public static void clear() { + if (cache != null) { + cache.clear(); + } + } +} diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java b/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java index 2943052..923e912 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java @@ -32,12 +32,31 @@ public class PosUnifier extends MapCreatorBase { private int lastSrtmLatIdx; private SrtmRaster lastSrtmRaster; private String srtmdir; + private HgtReader hgtReader; private CompactLongSet borderNids; public static void main(String[] args) throws Exception { System.out.println("*** PosUnifier: Unify position values and enhance elevation"); - if (args.length != 5) { + if (args.length == 3) { + PosUnifier posu = new PosUnifier(); + posu.srtmdir = (args[0]); + posu.srtmmap = new HashMap<>(); + double lon = Double.parseDouble(args[1]); + double lat = Double.parseDouble(args[2]); + + NodeData n = new NodeData(1, lon, lat); + SrtmRaster srtm = posu.srtmForNode(n.ilon, n.ilat); + short selev = Short.MIN_VALUE; + if (srtm == null) { + selev = posu.hgtForNode(n.ilon, n.ilat); + } else { + selev = srtm.getElevation(n.ilon, n.ilat); + } + posu.resetSrtm(); + System.out.println("-----> selv for " + lat + ", "+ lon + " = " + selev + " = " + (selev/4.)); + return; + } else if (args.length != 5) { System.out.println("usage: java PosUnifier "); return; } @@ -80,7 +99,12 @@ public class PosUnifier extends MapCreatorBase { @Override public void nextNode(NodeData n) throws Exception { SrtmRaster srtm = srtmForNode(n.ilon, n.ilat); - n.selev = srtm == null ? Short.MIN_VALUE : srtm.getElevation(n.ilon, n.ilat); + n.selev = Short.MIN_VALUE; + if (srtm == null) { + n.selev = hgtForNode(n.ilon, n.ilat); + } else { + n.selev = srtm.getElevation(n.ilon, n.ilat); + } findUniquePos(n); @@ -93,6 +117,7 @@ public class PosUnifier extends MapCreatorBase { @Override public void nodeFileEnd(File nodeFile) throws Exception { nodesOutStream.close(); + resetSrtm(); } private boolean checkAdd(int lon, int lat) { @@ -157,7 +182,7 @@ public class PosUnifier extends MapCreatorBase { lastSrtmRaster = srtmmap.get(filename); if (lastSrtmRaster == null && !srtmmap.containsKey(filename)) { File f = new File(new File(srtmdir), filename + ".bef"); - System.out.println("checking: " + f + " ilon=" + ilon + " ilat=" + ilat); + //System.out.println("checking: " + f + " ilon=" + ilon + " ilat=" + ilat); if (f.exists()) { System.out.println("*** reading: " + f); try { @@ -172,7 +197,7 @@ public class PosUnifier extends MapCreatorBase { } f = new File(new File(srtmdir), filename + ".zip"); - System.out.println("reading: " + f + " ilon=" + ilon + " ilat=" + ilat); + // System.out.println("reading: " + f + " ilon=" + ilon + " ilat=" + ilat); if (f.exists()) { try { lastSrtmRaster = new SrtmData(f).getRaster(); @@ -185,11 +210,29 @@ public class PosUnifier extends MapCreatorBase { return lastSrtmRaster; } + private short hgtForNode(int ilon, int ilat) throws Exception { + double lon = (ilon - 180000000)/1000000.; + double lat = (ilat - 90000000)/1000000.; + + try { + if (hgtReader == null) hgtReader = new HgtReader(srtmdir); + double res = hgtReader.getElevationFromHgt(lat, lon); + // System.out.println("**** reading " + res + " ****"); + if (Double.isNaN(res)) return Short.MIN_VALUE; + return (short) (res*4); + } catch (Exception e) { + System.out.println("**** ERROR reading hgt " + lon + " " + lat + " ****"); + } + + return Short.MIN_VALUE; + } + private void resetSrtm() { srtmmap = new HashMap(); lastSrtmLonIdx = -1; lastSrtmLatIdx = -1; lastSrtmRaster = null; + if (hgtReader != null) hgtReader.clear(); } } From a2c5ed68fcfb4aaa98dbc1fbe00651cd53caa584 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Mon, 8 May 2023 16:18:24 +0200 Subject: [PATCH 02/14] change hgt to ConvertLidarTile --- .../btools/mapcreator/ConvertLidarTile.java | 126 +++++++++++++++++- .../java/btools/mapcreator/PosUnifier.java | 69 ++++++---- 2 files changed, 167 insertions(+), 28 deletions(-) diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java b/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java index 65f18aa..d06de33 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java @@ -14,10 +14,14 @@ import java.util.zip.ZipInputStream; public class ConvertLidarTile { public static int NROWS; public static int NCOLS; + public static int ROW_LENGTH; public static final short NODATA2 = -32767; // hgt-formats nodata public static final short NODATA = Short.MIN_VALUE; + public static final int SRTM3_ROW_LENGTH = 1200; // number of elevation values per line + public static final int SRTM1_ROW_LENGTH = 3600; //-- New file resolution is 3601x3601 + static short[] imagePixels; private static void readHgtZip(String filename, int rowOffset, int colOffset) throws Exception { @@ -26,7 +30,7 @@ public class ConvertLidarTile { for (; ; ) { ZipEntry ze = zis.getNextEntry(); if (ze.getName().endsWith(".hgt")) { - readHgtFromStream(zis, rowOffset, colOffset); + readHgtFromStream(zis, rowOffset, colOffset, 1200); return; } } @@ -35,13 +39,40 @@ public class ConvertLidarTile { } } - private static void readHgtFromStream(InputStream is, int rowOffset, int colOffset) + private static void readHgtFromStream(InputStream is, int rowOffset, int colOffset, int row_length) throws Exception { DataInputStream dis = new DataInputStream(new BufferedInputStream(is)); - for (int ir = 0; ir < 1201; ir++) { + for (int ir = 0; ir < row_length + 1; ir++) { int row = rowOffset + ir; - for (int ic = 0; ic < 1201; ic++) { + for (int ic = 0; ic < row_length + 1; ic++) { + int col = colOffset + ic; + + int i1 = dis.read(); // msb first! + int i0 = dis.read(); + + if (i0 == -1 || i1 == -1) + throw new RuntimeException("unexcepted end of file reading hgt entry!"); + + short val = (short) ((i1 << 8) | i0); + + if (val == NODATA2) { + val = NODATA; + } + + setPixel(row, col, val); + } + } + } + + private static void readHgtFromFile(File f, int rowOffset, int colOffset) + throws Exception { + DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(f))); + + for (int ir = 0; ir < ROW_LENGTH + 1; ir++) { + int row = rowOffset + ir; + + for (int ic = 0; ic < ROW_LENGTH + 1; ic++) { int col = colOffset + ic; int i1 = dis.read(); // msb first! @@ -186,4 +217,91 @@ public class ConvertLidarTile { doConvert(args[1], ilon_base, ilat_base, filename30); } + public SrtmRaster getRasterDirect(File f, double lon, double lat) throws Exception { + if (f.length() > ((SRTM3_ROW_LENGTH + 1) * (SRTM3_ROW_LENGTH + 1) * 2)) { + ROW_LENGTH = SRTM1_ROW_LENGTH; + } else { + ROW_LENGTH = SRTM3_ROW_LENGTH; + } + System.out.println("read file " + f + " rl " + ROW_LENGTH); + + // stay a 1x1 raster + NROWS = ROW_LENGTH + 1; + NCOLS = ROW_LENGTH + 1; + + imagePixels = new short[NROWS * NCOLS]; // 650 MB ! + + // prefill as NODATA + for (int row = 0; row < NROWS; row++) { + for (int col = 0; col < NCOLS; col++) { + imagePixels[row * NCOLS + col] = NODATA; + } + } + + readHgtFromFile(f, 0, 0); + + boolean halfCol5 = false; // no halfcol tiles in lidar data (?) + + SrtmRaster raster = new SrtmRaster(); + raster.nrows = NROWS; + raster.ncols = NCOLS; + raster.halfcol = halfCol5; + raster.noDataValue = NODATA; + raster.cellsize = 1. / (double) ROW_LENGTH; + raster.xllcorner = (int) (lon < 0 ? lon - 1 : lon); //onDegreeStart - raster.cellsize; + raster.yllcorner = (int) (lat < 0 ? lat - 1 : lat); //latDegreeStart - raster.cellsize; + raster.eval_array = imagePixels; + + return raster; + } + + public SrtmRaster getRasterZip(File f, double lon, double lat) throws Exception { + + ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(f))); + try { + for (; ; ) { + ZipEntry ze = zis.getNextEntry(); + if (ze.getName().toLowerCase().endsWith(".hgt")) { + if (ze.getSize() > ((SRTM3_ROW_LENGTH + 1) * (SRTM3_ROW_LENGTH + 1) * 2)) { + ROW_LENGTH = SRTM1_ROW_LENGTH; + } else { + ROW_LENGTH = SRTM3_ROW_LENGTH; + } + System.out.println("read file " + f + " rl " + ROW_LENGTH); + // stay a 1x1 raster + NROWS = ROW_LENGTH + 1; + NCOLS = ROW_LENGTH + 1; + + imagePixels = new short[NROWS * NCOLS]; // 650 MB ! + + // prefill as NODATA + for (int row = 0; row < NROWS; row++) { + for (int col = 0; col < NCOLS; col++) { + imagePixels[row * NCOLS + col] = NODATA; + } + } + readHgtFromStream(zis, 0, 0, ROW_LENGTH); + break; + } + } + } finally { + zis.close(); + } + + + boolean halfCol5 = false; // no halfcol tiles in lidar data (?) + + SrtmRaster raster = new SrtmRaster(); + raster.nrows = NROWS; + raster.ncols = NCOLS; + raster.halfcol = halfCol5; + raster.noDataValue = NODATA; + raster.cellsize = 1. / (double) ROW_LENGTH; + raster.xllcorner = (int) (lon < 0 ? lon - 1 : lon); //onDegreeStart - raster.cellsize; + raster.yllcorner = (int) (lat < 0 ? lat - 1 : lat); //latDegreeStart - raster.cellsize; + raster.eval_array = imagePixels; + + return raster; + + } } diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java b/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java index 923e912..22df5e6 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java @@ -32,7 +32,6 @@ public class PosUnifier extends MapCreatorBase { private int lastSrtmLatIdx; private SrtmRaster lastSrtmRaster; private String srtmdir; - private HgtReader hgtReader; private CompactLongSet borderNids; @@ -46,15 +45,14 @@ public class PosUnifier extends MapCreatorBase { double lat = Double.parseDouble(args[2]); NodeData n = new NodeData(1, lon, lat); - SrtmRaster srtm = posu.srtmForNode(n.ilon, n.ilat); + SrtmRaster srtm = posu.hgtForNode(n.ilon, n.ilat); short selev = Short.MIN_VALUE; if (srtm == null) { - selev = posu.hgtForNode(n.ilon, n.ilat); - } else { - selev = srtm.getElevation(n.ilon, n.ilat); + srtm = posu.srtmForNode(n.ilon, n.ilat); } + if (srtm != null) selev = srtm.getElevation(n.ilon, n.ilat); posu.resetSrtm(); - System.out.println("-----> selv for " + lat + ", "+ lon + " = " + selev + " = " + (selev/4.)); + System.out.println("-----> selv for " + lat + ", " + lon + " = " + selev + " = " + (selev / 4.)); return; } else if (args.length != 5) { System.out.println("usage: java PosUnifier "); @@ -98,14 +96,13 @@ public class PosUnifier extends MapCreatorBase { @Override public void nextNode(NodeData n) throws Exception { - SrtmRaster srtm = srtmForNode(n.ilon, n.ilat); n.selev = Short.MIN_VALUE; + SrtmRaster srtm = hgtForNode(n.ilon, n.ilat); if (srtm == null) { - n.selev = hgtForNode(n.ilon, n.ilat); - } else { - n.selev = srtm.getElevation(n.ilon, n.ilat); + srtm = srtmForNode(n.ilon, n.ilat); } + if (srtm != null) n.selev = srtm.getElevation(n.ilon, n.ilat); findUniquePos(n); n.writeTo(nodesOutStream); @@ -182,7 +179,6 @@ public class PosUnifier extends MapCreatorBase { lastSrtmRaster = srtmmap.get(filename); if (lastSrtmRaster == null && !srtmmap.containsKey(filename)) { File f = new File(new File(srtmdir), filename + ".bef"); - //System.out.println("checking: " + f + " ilon=" + ilon + " ilat=" + ilat); if (f.exists()) { System.out.println("*** reading: " + f); try { @@ -201,6 +197,8 @@ public class PosUnifier extends MapCreatorBase { if (f.exists()) { try { lastSrtmRaster = new SrtmData(f).getRaster(); + srtmmap.put(filename, lastSrtmRaster); + return lastSrtmRaster; } catch (Exception e) { System.out.println("**** ERROR reading " + f + " ****"); } @@ -210,21 +208,45 @@ public class PosUnifier extends MapCreatorBase { return lastSrtmRaster; } - private short hgtForNode(int ilon, int ilat) throws Exception { - double lon = (ilon - 180000000)/1000000.; - double lat = (ilat - 90000000)/1000000.; + private SrtmRaster hgtForNode(int ilon, int ilat) throws Exception { + double lon = (ilon - 180000000) / 1000000.; + double lat = (ilat - 90000000) / 1000000.; - try { - if (hgtReader == null) hgtReader = new HgtReader(srtmdir); - double res = hgtReader.getElevationFromHgt(lat, lon); - // System.out.println("**** reading " + res + " ****"); - if (Double.isNaN(res)) return Short.MIN_VALUE; - return (short) (res*4); - } catch (Exception e) { - System.out.println("**** ERROR reading hgt " + lon + " " + lat + " ****"); + String filename = buildHgtFilename(lat, lon); + lastSrtmRaster = srtmmap.get(filename); + if (lastSrtmRaster == null) { + File f = new File(new File(srtmdir), filename + ".hgt"); + if (f.exists()) { + lastSrtmRaster = new ConvertLidarTile().getRasterDirect(f, lon, lat); + srtmmap.put(filename, lastSrtmRaster); + return lastSrtmRaster; + } + f = new File(new File(srtmdir), filename + ".zip"); + if (f.exists()) { + lastSrtmRaster = new ConvertLidarTile().getRasterZip(f, lon, lat); + srtmmap.put(filename, lastSrtmRaster); + return lastSrtmRaster; + } + } + return lastSrtmRaster; + } + + private String buildHgtFilename(double llat, double llon) { + int lat = (int) llat; + int lon = (int) llon; + + String latPref = "N"; + if (lat < 0) { + latPref = "S"; + lat = -lat + 1; + } + String lonPref = "E"; + if (lon < 0) { + lonPref = "W"; + lon = -lon + 1; } - return Short.MIN_VALUE; + return String.format("%s%02d%s%03d", latPref, lat, lonPref, lon); } private void resetSrtm() { @@ -232,7 +254,6 @@ public class PosUnifier extends MapCreatorBase { lastSrtmLonIdx = -1; lastSrtmLatIdx = -1; lastSrtmRaster = null; - if (hgtReader != null) hgtReader.clear(); } } From 2e1722150c24ac1ad74fca9e46f8f7c0328b4af0 Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Tue, 9 May 2023 22:02:44 +0200 Subject: [PATCH 03/14] Collect rules similar to Android Studio inspections --- config/pmd/pmd-ruleset.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/pmd/pmd-ruleset.xml b/config/pmd/pmd-ruleset.xml index b8cd1ed..164198a 100644 --- a/config/pmd/pmd-ruleset.xml +++ b/config/pmd/pmd-ruleset.xml @@ -48,4 +48,11 @@ + + + + + + + From 7a6d3bd9d9264b48378eabce4ad6635483a160af Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Tue, 9 May 2023 22:06:55 +0200 Subject: [PATCH 04/14] Enable PMD rule UseDiamondOperator and fix violations --- .../main/java/btools/codec/MicroCache2.java | 2 +- .../java/btools/codec/StatCoderContext.java | 2 +- .../main/java/btools/codec/TagValueCoder.java | 4 ++-- .../java/btools/router/OsmNogoPolygon.java | 2 +- .../src/main/java/btools/router/OsmTrack.java | 24 +++++++++---------- .../java/btools/router/RoutingContext.java | 4 ++-- .../java/btools/router/RoutingEngine.java | 12 +++++----- .../main/java/btools/router/VoiceHint.java | 2 +- .../java/btools/router/VoiceHintList.java | 2 +- .../btools/router/VoiceHintProcessor.java | 6 ++--- .../expressions/BExpressionContext.java | 16 ++++++------- .../expressions/BExpressionLookupValue.java | 2 +- .../expressions/BExpressionMetaData.java | 2 +- .../btools/mapcreator/MapCreatorBase.java | 2 +- .../main/java/btools/mapcreator/OsmNodeP.java | 6 ++--- .../java/btools/mapcreator/OsmTrafficMap.java | 4 ++-- .../java/btools/mapcreator/PosUnifier.java | 2 +- .../btools/mapcreator/RelationMerger.java | 2 +- .../btools/mapcreator/RelationStatistics.java | 2 +- .../java/btools/mapcreator/WayLinker.java | 10 ++++---- .../java/btools/mapaccess/NodesCache.java | 2 +- .../java/btools/mapaccess/OsmNodePairSet.java | 2 +- .../java/btools/mapaccess/OsmNodesMap.java | 4 ++-- .../btools/mapaccess/WaypointMatcherImpl.java | 2 +- .../btools/routingapp/BInstallerActivity.java | 4 ++-- .../btools/routingapp/BRouterService.java | 4 ++-- .../java/btools/routingapp/BRouterWorker.java | 12 +++++----- .../btools/routingapp/ConfigMigration.java | 4 ++-- .../btools/routingapp/ServiceModeConfig.java | 4 ++-- .../src/main/java/btools/server/Area.java | 4 ++-- .../src/main/java/btools/server/BRouter.java | 4 ++-- .../java/btools/server/IpAccessMonitor.java | 4 ++-- .../src/main/java/btools/server/Polygon.java | 2 +- .../main/java/btools/server/RouteServer.java | 6 ++--- .../java/btools/server/SuspectManager.java | 4 ++-- .../server/request/ProfileUploadHandler.java | 2 +- .../btools/server/request/ServerHandler.java | 8 +++---- .../main/java/btools/util/DenseLongMap.java | 2 +- .../main/java/btools/util/FrozenLongMap.java | 2 +- .../java/btools/util/LazyArrayOfLists.java | 4 ++-- .../test/java/btools/util/CompactMapTest.java | 10 ++++---- .../test/java/btools/util/CompactSetTest.java | 2 +- .../java/btools/util/DenseLongMapTest.java | 4 ++-- .../test/java/btools/util/SortedHeapTest.java | 4 ++-- config/pmd/pmd-ruleset.xml | 2 +- 45 files changed, 105 insertions(+), 105 deletions(-) diff --git a/brouter-codec/src/main/java/btools/codec/MicroCache2.java b/brouter-codec/src/main/java/btools/codec/MicroCache2.java index bf7891e..21aa5c2 100644 --- a/brouter-codec/src/main/java/btools/codec/MicroCache2.java +++ b/brouter-codec/src/main/java/btools/codec/MicroCache2.java @@ -287,7 +287,7 @@ public final class MicroCache2 extends MicroCache { @Override public int encodeMicroCache(byte[] buffer) { - HashMap idMap = new HashMap(); + HashMap idMap = new HashMap<>(); for (int n = 0; n < size; n++) { // loop over nodes idMap.put(Long.valueOf(expandId(faid[n])), Integer.valueOf(n)); } diff --git a/brouter-codec/src/main/java/btools/codec/StatCoderContext.java b/brouter-codec/src/main/java/btools/codec/StatCoderContext.java index ca5f08a..c0254f7 100644 --- a/brouter-codec/src/main/java/btools/codec/StatCoderContext.java +++ b/brouter-codec/src/main/java/btools/codec/StatCoderContext.java @@ -39,7 +39,7 @@ public final class StatCoderContext extends BitCoderContext { public void assignBits(String name) { long bitpos = getWritingBitPosition(); if (statsPerName == null) { - statsPerName = new TreeMap(); + statsPerName = new TreeMap<>(); } long[] stats = statsPerName.get(name); if (stats == null) { diff --git a/brouter-codec/src/main/java/btools/codec/TagValueCoder.java b/brouter-codec/src/main/java/btools/codec/TagValueCoder.java index e8e3235..098ea06 100644 --- a/brouter-codec/src/main/java/btools/codec/TagValueCoder.java +++ b/brouter-codec/src/main/java/btools/codec/TagValueCoder.java @@ -58,7 +58,7 @@ public final class TagValueCoder { TagValueSet dummy = new TagValueSet(nextTagValueSetId++); identityMap.put(dummy, dummy); } - PriorityQueue queue = new PriorityQueue(2 * identityMap.size(), new TagValueSet.FrequencyComparator()); + PriorityQueue queue = new PriorityQueue<>(2 * identityMap.size(), new TagValueSet.FrequencyComparator()); queue.addAll(identityMap.values()); while (queue.size() > 1) { TagValueSet node = new TagValueSet(nextTagValueSetId++); @@ -79,7 +79,7 @@ public final class TagValueCoder { } public TagValueCoder() { - identityMap = new HashMap(); + identityMap = new HashMap<>(); } private Object decodeTree(BitCoderContext bc, DataBuffers buffers, TagValueValidator validator) { diff --git a/brouter-core/src/main/java/btools/router/OsmNogoPolygon.java b/brouter-core/src/main/java/btools/router/OsmNogoPolygon.java index 84663a3..ea828fe 100644 --- a/brouter-core/src/main/java/btools/router/OsmNogoPolygon.java +++ b/brouter-core/src/main/java/btools/router/OsmNogoPolygon.java @@ -24,7 +24,7 @@ public class OsmNogoPolygon extends OsmNodeNamed { } } - public final List points = new ArrayList(); + public final List points = new ArrayList<>(); public final boolean isClosed; diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index c8fbed6..4d8da0d 100644 --- a/brouter-core/src/main/java/btools/router/OsmTrack.java +++ b/brouter-core/src/main/java/btools/router/OsmTrack.java @@ -53,14 +53,14 @@ public final class OsmTrack { public Map params; - public List pois = new ArrayList(); + public List pois = new ArrayList<>(); public static class OsmPathElementHolder { public OsmPathElement node; public OsmPathElementHolder nextHolder; } - public List nodes = new ArrayList(); + public List nodes = new ArrayList<>(); private CompactLongMap nodesMap; @@ -82,7 +82,7 @@ public final class OsmTrack { public void registerDetourForId(long id, OsmPathElement detour) { if (detourMap == null) { - detourMap = new CompactLongMap(); + detourMap = new CompactLongMap<>(); } OsmPathElementHolder nh = new OsmPathElementHolder(); nh.node = detour; @@ -98,12 +98,12 @@ public final class OsmTrack { } public void copyDetours(OsmTrack source) { - detourMap = source.detourMap == null ? null : new FrozenLongMap(source.detourMap); + detourMap = source.detourMap == null ? null : new FrozenLongMap<>(source.detourMap); } public void addDetours(OsmTrack source) { if (detourMap != null) { - CompactLongMap tmpDetourMap = new CompactLongMap(); + CompactLongMap tmpDetourMap = new CompactLongMap<>(); List oldlist = ((FrozenLongMap) detourMap).getValueList(); long[] oldidlist = ((FrozenLongMap) detourMap).getKeyArray(); @@ -124,7 +124,7 @@ public final class OsmTrack { } } } - detourMap = new FrozenLongMap(tmpDetourMap); + detourMap = new FrozenLongMap<>(tmpDetourMap); } } @@ -132,7 +132,7 @@ public final class OsmTrack { public void appendDetours(OsmTrack source) { if (detourMap == null) { - detourMap = source.detourMap == null ? null : new CompactLongMap(); + detourMap = source.detourMap == null ? null : new CompactLongMap<>(); } if (source.detourMap != null) { int pos = nodes.size() - source.nodes.size() + 1; @@ -160,7 +160,7 @@ public final class OsmTrack { } public void buildMap() { - nodesMap = new CompactLongMap(); + nodesMap = new CompactLongMap<>(); for (OsmPathElement node : nodes) { long id = node.getIdFromPos(); OsmPathElementHolder nh = new OsmPathElementHolder(); @@ -175,11 +175,11 @@ public final class OsmTrack { nodesMap.fastPut(id, nh); } } - nodesMap = new FrozenLongMap(nodesMap); + nodesMap = new FrozenLongMap<>(nodesMap); } private List aggregateMessages() { - ArrayList res = new ArrayList(); + ArrayList res = new ArrayList<>(); MessageData current = null; for (OsmPathElement n : nodes) { if (n.message != null && n.message.wayKeyValues != null) { @@ -201,7 +201,7 @@ public final class OsmTrack { } private List aggregateSpeedProfile() { - ArrayList res = new ArrayList(); + ArrayList res = new ArrayList<>(); int vmax = -1; int vmaxe = -1; int vmin = -1; @@ -1289,7 +1289,7 @@ public final class OsmTrack { i = 0; node = nodes.get(nodeNr); - List inputs = new ArrayList(); + List inputs = new ArrayList<>(); while (node != null) { if (node.origin != null) { VoiceHint input = new VoiceHint(); diff --git a/brouter-core/src/main/java/btools/router/RoutingContext.java b/brouter-core/src/main/java/btools/router/RoutingContext.java index 412763b..5d7c8f1 100644 --- a/brouter-core/src/main/java/btools/router/RoutingContext.java +++ b/brouter-core/src/main/java/btools/router/RoutingContext.java @@ -274,7 +274,7 @@ public final class RoutingContext { public void cleanNogoList(List waypoints) { nogopoints_all = nogopoints; if (nogopoints == null) return; - List nogos = new ArrayList(); + List nogos = new ArrayList<>(); for (OsmNodeNamed nogo : nogopoints) { boolean goodGuy = true; for (OsmNode wp : waypoints) { @@ -386,7 +386,7 @@ public final class RoutingContext { public void setWaypoint(OsmNodeNamed wp, OsmNodeNamed pendingEndpoint, boolean endpoint) { keepnogopoints = nogopoints; - nogopoints = new ArrayList(); + nogopoints = new ArrayList<>(); nogopoints.add(wp); if (keepnogopoints != null) nogopoints.addAll(keepnogopoints); isEndpoint = endpoint; diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index 3ce2c46..c731b5c 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -26,7 +26,7 @@ import btools.util.StackSampler; public class RoutingEngine extends Thread { private NodesCache nodesCache; - private SortedHeap openSet = new SortedHeap(); + private SortedHeap openSet = new SortedHeap<>(); private boolean finished = false; protected List waypoints = null; @@ -146,7 +146,7 @@ public class RoutingEngine extends Thread { OsmTrack[] refTracks = new OsmTrack[nsections]; // used ways for alternatives OsmTrack[] lastTracks = new OsmTrack[nsections]; OsmTrack track = null; - ArrayList messageList = new ArrayList(); + ArrayList messageList = new ArrayList<>(); for (int i = 0; ; i++) { track = findTrack(refTracks, lastTracks); track.message = "track-length = " + track.distance + " filtered ascend = " + track.ascend @@ -362,7 +362,7 @@ public class RoutingEngine extends Thread { try { MatchedWaypoint seedPoint = new MatchedWaypoint(); seedPoint.waypoint = waypoints.get(0); - List listOne = new ArrayList(); + List listOne = new ArrayList<>(); listOne.add(seedPoint); matchWaypointsToNodes(listOne); @@ -437,7 +437,7 @@ public class RoutingEngine extends Thread { } if (matchedWaypoints == null) { // could exist from the previous alternative level - matchedWaypoints = new ArrayList(); + matchedWaypoints = new ArrayList<>(); for (int i = 0; i < nUnmatched; i++) { MatchedWaypoint mwp = new MatchedWaypoint(); mwp.waypoint = waypoints.get(i); @@ -993,7 +993,7 @@ public class RoutingEngine extends Thread { private OsmTrack findTrack(String operationName, MatchedWaypoint startWp, MatchedWaypoint endWp, OsmTrack costCuttingTrack, OsmTrack refTrack, boolean fastPartialRecalc) { try { - List wpts2 = new ArrayList(); + List wpts2 = new ArrayList<>(); if (startWp != null) wpts2.add(startWp.waypoint); if (endWp != null) wpts2.add(endWp.waypoint); routingContext.cleanNogoList(wpts2); @@ -1086,7 +1086,7 @@ public class RoutingEngine extends Thread { addToOpenset(startPath1); addToOpenset(startPath2); } - ArrayList openBorderList = new ArrayList(4096); + ArrayList openBorderList = new ArrayList<>(4096); boolean memoryPanicMode = false; boolean needNonPanicProcessing = false; diff --git a/brouter-core/src/main/java/btools/router/VoiceHint.java b/brouter-core/src/main/java/btools/router/VoiceHint.java index 90b34c1..5fea2d7 100644 --- a/brouter-core/src/main/java/btools/router/VoiceHint.java +++ b/brouter-core/src/main/java/btools/router/VoiceHint.java @@ -56,7 +56,7 @@ public class VoiceHint { return; } if (badWays == null) { - badWays = new ArrayList(); + badWays = new ArrayList<>(); } badWays.add(badWay); } diff --git a/brouter-core/src/main/java/btools/router/VoiceHintList.java b/brouter-core/src/main/java/btools/router/VoiceHintList.java index 09eb05e..229f4ab 100644 --- a/brouter-core/src/main/java/btools/router/VoiceHintList.java +++ b/brouter-core/src/main/java/btools/router/VoiceHintList.java @@ -12,7 +12,7 @@ import java.util.List; public class VoiceHintList { private String transportMode; int turnInstructionMode; - List list = new ArrayList(); + List list = new ArrayList<>(); public void setTransportMode(boolean isCar, boolean isBike) { transportMode = isCar ? "car" : (isBike ? "bike" : "foot"); diff --git a/brouter-core/src/main/java/btools/router/VoiceHintProcessor.java b/brouter-core/src/main/java/btools/router/VoiceHintProcessor.java index 867cfb4..6b4f37e 100644 --- a/brouter-core/src/main/java/btools/router/VoiceHintProcessor.java +++ b/brouter-core/src/main/java/btools/router/VoiceHintProcessor.java @@ -55,7 +55,7 @@ public final class VoiceHintProcessor { * @return voice hints, in forward order */ public List process(List inputs) { - List results = new ArrayList(); + List results = new ArrayList<>(); double distance = 0.; float roundAboutTurnAngle = 0.f; // sums up angles in roundabout @@ -202,7 +202,7 @@ public final class VoiceHintProcessor { // go through the hint list again in reverse order (=travel direction) // and filter out non-significant hints and hints too close to its predecessor - List results2 = new ArrayList(); + List results2 = new ArrayList<>(); int i = results.size(); while (i > 0) { VoiceHint hint = results.get(--i); @@ -241,7 +241,7 @@ public final class VoiceHintProcessor { } public List postProcess(List inputs, double catchingRange, double minRange) { - List results = new ArrayList(); + List results = new ArrayList<>(); double distance = 0; VoiceHint inputLast = null; ArrayList tmpList = new ArrayList<>(); diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java b/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java index 83ec562..8f05277 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java @@ -36,10 +36,10 @@ public abstract class BExpressionContext implements IByteArrayUnifier { public String _modelClass; - private Map lookupNumbers = new HashMap(); - private List lookupValues = new ArrayList(); - private List lookupNames = new ArrayList(); - private List lookupHistograms = new ArrayList(); + private Map lookupNumbers = new HashMap<>(); + private List lookupValues = new ArrayList<>(); + private List lookupNames = new ArrayList<>(); + private List lookupHistograms = new ArrayList<>(); private boolean[] lookupIdxUsed; private boolean lookupDataFrozen = false; @@ -50,7 +50,7 @@ public abstract class BExpressionContext implements IByteArrayUnifier { private BitCoderContext ctxEndode = new BitCoderContext(abBuf); private BitCoderContext ctxDecode = new BitCoderContext(new byte[0]); - private Map variableNumbers = new HashMap(); + private Map variableNumbers = new HashMap<>(); private float[] variableData; @@ -223,7 +223,7 @@ public abstract class BExpressionContext implements IByteArrayUnifier { } public List getKeyValueList(boolean inverseDirection, byte[] ab) { - ArrayList res = new ArrayList(); + ArrayList res = new ArrayList<>(); decode(lookupData, inverseDirection, ab); for (int inum = 0; inum < lookupValues.size(); inum++) { // loop over lookup names BExpressionLookupValue[] va = lookupValues.get(inum); @@ -429,7 +429,7 @@ public abstract class BExpressionContext implements IByteArrayUnifier { public void dumpStatistics() { - TreeMap counts = new TreeMap(); + TreeMap counts = new TreeMap<>(); // first count for (String name : lookupNumbers.keySet()) { int cnt = 0; @@ -815,7 +815,7 @@ public abstract class BExpressionContext implements IByteArrayUnifier { private List _parseFile(File file) throws Exception { _br = new BufferedReader(new FileReader(file)); _readerDone = false; - List result = new ArrayList(); + List result = new ArrayList<>(); for (; ; ) { BExpression exp = BExpression.parse(this, 0); if (exp == null) break; diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpressionLookupValue.java b/brouter-expressions/src/main/java/btools/expressions/BExpressionLookupValue.java index e40f314..ce71f15 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpressionLookupValue.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpressionLookupValue.java @@ -26,7 +26,7 @@ final class BExpressionLookupValue { } public void addAlias(String alias) { - if (aliases == null) aliases = new ArrayList(); + if (aliases == null) aliases = new ArrayList<>(); aliases.add(alias); } diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpressionMetaData.java b/brouter-expressions/src/main/java/btools/expressions/BExpressionMetaData.java index 1a125de..fbe9a8a 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpressionMetaData.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpressionMetaData.java @@ -24,7 +24,7 @@ public final class BExpressionMetaData { public short lookupMinorVersion = -1; public short minAppVersion = -1; - private Map listeners = new HashMap(); + private Map listeners = new HashMap<>(); public void registerListener(String context, BExpressionContext ctx) { listeners.put(context, ctx); diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/MapCreatorBase.java b/brouter-map-creator/src/main/java/btools/mapcreator/MapCreatorBase.java index e7092a4..24c69a6 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/MapCreatorBase.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/MapCreatorBase.java @@ -25,7 +25,7 @@ public abstract class MapCreatorBase implements WayListener, NodeListener, Relat protected Map tags; public void putTag(String key, String value) { - if (tags == null) tags = new HashMap(); + if (tags == null) tags = new HashMap<>(); tags.put(key, value); } diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java b/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java index 31cb472..572554e 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java @@ -105,7 +105,7 @@ public class OsmNodeP extends OsmLinkP { } public void checkDuplicateTargets() { - HashMap targets = new HashMap(); + HashMap targets = new HashMap<>(); for (OsmLinkP link0 = getFirstLink(); link0 != null; link0 = link0.getNext(this)) { OsmLinkP link = link0; @@ -165,14 +165,14 @@ public class OsmNodeP extends OsmLinkP { mc.writeVarBytes(getNodeDecsription()); // buffer internal reverse links - ArrayList internalReverse = new ArrayList(); + ArrayList internalReverse = new ArrayList<>(); for (OsmLinkP link0 = getFirstLink(); link0 != null; link0 = link0.getNext(this)) { OsmLinkP link = link0; OsmNodeP origin = this; OsmNodeP target = null; - ArrayList linkNodes = new ArrayList(); + ArrayList linkNodes = new ArrayList<>(); linkNodes.add(this); // first pass just to see if that link is consistent diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/OsmTrafficMap.java b/brouter-map-creator/src/main/java/btools/mapcreator/OsmTrafficMap.java index 146ffd2..ca6d119 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/OsmTrafficMap.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/OsmTrafficMap.java @@ -52,7 +52,7 @@ public class OsmTrafficMap { public OsmTrafficElement next; } - private CompactLongMap map = new CompactLongMap(); + private CompactLongMap map = new CompactLongMap<>(); public void loadAll(File file, int minLon, int minLat, int maxLon, int maxLat, boolean includeMotorways) throws Exception { load(file, minLon, minLat, maxLon, maxLat, includeMotorways); @@ -107,7 +107,7 @@ public class OsmTrafficMap { is.close(); } - map = new FrozenLongMap(map); + map = new FrozenLongMap<>(map); System.out.println("read traffic-elements: " + trafficElements); } diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java b/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java index 2943052..a82398b 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java @@ -186,7 +186,7 @@ public class PosUnifier extends MapCreatorBase { } private void resetSrtm() { - srtmmap = new HashMap(); + srtmmap = new HashMap<>(); lastSrtmLonIdx = -1; lastSrtmLatIdx = -1; lastSrtmRaster = null; diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/RelationMerger.java b/brouter-map-creator/src/main/java/btools/mapcreator/RelationMerger.java index 4defd2f..7715bf8 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/RelationMerger.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/RelationMerger.java @@ -53,7 +53,7 @@ public class RelationMerger extends MapCreatorBase { // expctxStat = new BExpressionContext("way"); // *** read the relation file into sets for each processed tag - routesets = new HashMap(); + routesets = new HashMap<>(); routesetall = new CompactLongSet(); DataInputStream dis = createInStream(relationFileIn); try { diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/RelationStatistics.java b/brouter-map-creator/src/main/java/btools/mapcreator/RelationStatistics.java index 25aef0b..a6d5e04 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/RelationStatistics.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/RelationStatistics.java @@ -25,7 +25,7 @@ public class RelationStatistics extends MapCreatorBase { } public void process(File relationFileIn) throws Exception { - HashMap relstats = new HashMap(); + HashMap relstats = new HashMap<>(); DataInputStream dis = createInStream(relationFileIn); try { diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java b/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java index 37220e3..2e1c273 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java @@ -108,7 +108,7 @@ public class WayLinker extends MapCreatorBase implements Runnable { private void reset() { minLon = -1; minLat = -1; - nodesMap = new CompactLongMap(); + nodesMap = new CompactLongMap<>(); borderSet = new CompactLongSet(); } @@ -231,7 +231,7 @@ public class WayLinker extends MapCreatorBase implements Runnable { new NodeIterator(this, true).processFile(nodeFile); // freeze the nodes-map - FrozenLongMap nodesMapFrozen = new FrozenLongMap(nodesMap); + FrozenLongMap nodesMapFrozen = new FrozenLongMap<>(nodesMap); nodesMap = nodesMapFrozen; File restrictionFile = fileFromTemplate(wayfile, new File(nodeTilesIn.getParentFile(), "restrictions55"), "rt5"); @@ -415,7 +415,7 @@ public class WayLinker extends MapCreatorBase implements Runnable { int nLatSegs = (maxLat - minLat) / 1000000; // sort the nodes into segments - LazyArrayOfLists seglists = new LazyArrayOfLists(nLonSegs * nLatSegs); + LazyArrayOfLists seglists = new LazyArrayOfLists<>(nLonSegs * nLatSegs); for (OsmNodeP n : nodesList) { if (n == null || n.getFirstLink() == null || n.isTransferNode()) continue; @@ -450,7 +450,7 @@ public class WayLinker extends MapCreatorBase implements Runnable { if (seglists.getSize(tileIndex) > 0) { List nlist = seglists.getList(tileIndex); - LazyArrayOfLists subs = new LazyArrayOfLists(ncaches); + LazyArrayOfLists subs = new LazyArrayOfLists<>(ncaches); byte[][] subByteArrays = new byte[ncaches][]; for (int ni = 0; ni < nlist.size(); ni++) { OsmNodeP n = nlist.get(ni); @@ -473,7 +473,7 @@ public class WayLinker extends MapCreatorBase implements Runnable { MicroCache mc = new MicroCache2(size, abBuf2, lonIdxDiv, latIdxDiv, divisor); // sort via treemap - TreeMap sortedList = new TreeMap(); + TreeMap sortedList = new TreeMap<>(); for (OsmNodeP n : subList) { long longId = n.getIdFromPos(); int shrinkid = mc.shrinkId(longId); diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java b/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java index b42a9b9..2e7d0b2 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java @@ -95,7 +95,7 @@ public final class NodesCache { fileRows = new OsmFile[180][]; } } else { - fileCache = new HashMap(4); + fileCache = new HashMap<>(4); fileRows = new OsmFile[180][]; dataBuffers = new DataBuffers(); secondarySegmentsDir = StorageConfigHelper.getSecondarySegmentDir(segmentDir); diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodePairSet.java b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodePairSet.java index 6c1e38e..3fe874e 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodePairSet.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodePairSet.java @@ -50,7 +50,7 @@ public class OsmNodePairSet { private void addPair(long n1, long n2) { if (map == null) { - map = new CompactLongMap(); + map = new CompactLongMap<>(); } npairs++; diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodesMap.java b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodesMap.java index 28a2238..83863d8 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodesMap.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodesMap.java @@ -13,7 +13,7 @@ import java.util.Map; import btools.util.ByteArrayUnifier; public final class OsmNodesMap { - private Map hmap = new HashMap(4096); + private Map hmap = new HashMap<>(4096); private ByteArrayUnifier abUnifier = new ByteArrayUnifier(16384, false); @@ -176,7 +176,7 @@ public final class OsmNodesMap { } public void collectOutreachers() { - nodes2check = new ArrayList(nodesCreated); + nodes2check = new ArrayList<>(nodesCreated); nodesCreated = 0; for (OsmNode n : hmap.values()) { addActiveNode(nodes2check, n); diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java b/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java index 85ab9b5..e70d3be 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java @@ -51,7 +51,7 @@ public final class WaypointMatcherImpl implements WaypointMatcher { } // sort result list - comparator = new Comparator() { + comparator = new Comparator<>() { @Override public int compare(MatchedWaypoint mw1, MatchedWaypoint mw2) { int cmpDist = Double.compare(mw1.radius, mw2.radius); diff --git a/brouter-routing-app/src/main/java/btools/routingapp/BInstallerActivity.java b/brouter-routing-app/src/main/java/btools/routingapp/BInstallerActivity.java index 31e597e..6e7bf5d 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BInstallerActivity.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BInstallerActivity.java @@ -488,11 +488,11 @@ public class BInstallerActivity extends AppCompatActivity { } private void downloadDiffVersionTiles() { - downloadAll(new ArrayList(), DownloadWorker.VALUE_SEGMENT_DIFFS); + downloadAll(new ArrayList<>(), DownloadWorker.VALUE_SEGMENT_DIFFS); } private void dropDiffVersionTiles() { - downloadAll(new ArrayList(), DownloadWorker.VALUE_SEGMENT_DROPDIFFS); + downloadAll(new ArrayList<>(), DownloadWorker.VALUE_SEGMENT_DROPDIFFS); } private boolean isDownloadRunning(Class serviceClass) { diff --git a/brouter-routing-app/src/main/java/btools/routingapp/BRouterService.java b/brouter-routing-app/src/main/java/btools/routingapp/BRouterService.java index eb6a129..b2429a0 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BRouterService.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BRouterService.java @@ -199,8 +199,8 @@ public class BRouterService extends Service { private void readNogos(BRouterWorker worker, String baseDir) throws Exception { // add nogos from waypoint database CoordinateReader cor = CoordinateReader.obtainValidReader(baseDir, true); - worker.nogoList = new ArrayList(cor.nogopoints); - worker.nogoPolygonsList = new ArrayList(); + worker.nogoList = new ArrayList<>(cor.nogopoints); + worker.nogoPolygonsList = new ArrayList<>(); } private boolean fileEqual(byte[] fileBytes, File file) throws Exception { diff --git a/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java b/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java index 4d74130..ec3fce0 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java @@ -126,7 +126,7 @@ public class BRouterWorker { } if (params.containsKey("extraParams")) { // add user params - if (rc.keyValues == null) rc.keyValues = new HashMap(); + if (rc.keyValues == null) rc.keyValues = new HashMap<>(); StringTokenizer tk = new StringTokenizer(extraParams, "?&"); while (tk.hasMoreTokens()) { String t = tk.nextToken(); @@ -212,7 +212,7 @@ public class BRouterWorker { } private List readPositions(Bundle params) { - List wplist = new ArrayList(); + List wplist = new ArrayList<>(); double[] lats = params.getDoubleArray("lats"); double[] lons = params.getDoubleArray("lons"); @@ -235,7 +235,7 @@ public class BRouterWorker { } private List readLonlats(Bundle params) { - List wplist = new ArrayList(); + List wplist = new ArrayList<>(); String lonLats = params.getString("lonlats"); if (lonLats == null) throw new IllegalArgumentException("lonlats parameter not set"); @@ -315,7 +315,7 @@ public class BRouterWorker { String[] lonLatRadList = nogos.split("\\|"); - List nogoList = new ArrayList(); + List nogoList = new ArrayList<>(); for (int i = 0; i < lonLatRadList.length; i++) { String[] lonLatRad = lonLatRadList[i].split(","); String nogoWeight = "NaN"; @@ -344,7 +344,7 @@ public class BRouterWorker { } private List readNogoPolygons(Bundle params) { - List result = new ArrayList(); + List result = new ArrayList<>(); parseNogoPolygons(params.getString("polylines"), result, false); parseNogoPolygons(params.getString("polygons"), result, true); return result.size() > 0 ? result : null; @@ -389,7 +389,7 @@ public class BRouterWorker { String[] lonLatNameList = pois.split("\\|"); - List poisList = new ArrayList(); + List poisList = new ArrayList<>(); for (int i = 0; i < lonLatNameList.length; i++) { String[] lonLatName = lonLatNameList[i].split(","); diff --git a/brouter-routing-app/src/main/java/btools/routingapp/ConfigMigration.java b/brouter-routing-app/src/main/java/btools/routingapp/ConfigMigration.java index 40e9db8..a4e9c02 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/ConfigMigration.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/ConfigMigration.java @@ -33,7 +33,7 @@ public class ConfigMigration { } br.close(); - List lines = new ArrayList(); + List lines = new ArrayList<>(); br = new BufferedReader(new FileReader(dstFile)); for (; ; ) { String line = br.readLine(); @@ -76,7 +76,7 @@ public class ConfigMigration { BufferedReader br = null; BufferedWriter bw = null; File configFile = new File(segmentDir, "storageconfig.txt"); - List lines = new ArrayList(); + List lines = new ArrayList<>(); try { br = new BufferedReader(new FileReader(configFile)); for (; ; ) { diff --git a/brouter-routing-app/src/main/java/btools/routingapp/ServiceModeConfig.java b/brouter-routing-app/src/main/java/btools/routingapp/ServiceModeConfig.java index 63f30ba..20f8ea6 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/ServiceModeConfig.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/ServiceModeConfig.java @@ -19,7 +19,7 @@ public class ServiceModeConfig { profile = tk.nextToken(); if (tk.hasMoreTokens()) params = tk.nextToken(); else params = "noparams"; - nogoVetos = new TreeSet(); + nogoVetos = new TreeSet<>(); while (tk.hasMoreTokens()) { nogoVetos.add(tk.nextToken()); } @@ -29,7 +29,7 @@ public class ServiceModeConfig { this.mode = mode; this.profile = profile; this.params = params; - nogoVetos = new TreeSet(); + nogoVetos = new TreeSet<>(); } public String toLine() { diff --git a/brouter-server/src/main/java/btools/server/Area.java b/brouter-server/src/main/java/btools/server/Area.java index 2c4fbd6..7ca5c92 100644 --- a/brouter-server/src/main/java/btools/server/Area.java +++ b/brouter-server/src/main/java/btools/server/Area.java @@ -8,8 +8,8 @@ import java.util.ArrayList; import java.util.List; public class Area { - private List poslist = new ArrayList(); - private List neglist = new ArrayList(); + private List poslist = new ArrayList<>(); + private List neglist = new ArrayList<>(); public static void main(String[] args) throws IOException { Area a = new Area(new File(args[0])); diff --git a/brouter-server/src/main/java/btools/server/BRouter.java b/brouter-server/src/main/java/btools/server/BRouter.java index 7832f77..90ded9c 100644 --- a/brouter-server/src/main/java/btools/server/BRouter.java +++ b/brouter-server/src/main/java/btools/server/BRouter.java @@ -63,7 +63,7 @@ public class BRouter { maxRunningTime = Integer.parseInt(sMaxRunningTime) * 1000; } - List wplist = new ArrayList(); + List wplist = new ArrayList<>(); wplist.add(from); wplist.add(to); @@ -83,7 +83,7 @@ public class BRouter { System.out.println("usage: java -jar brouter.jar "); return; } - List wplist = new ArrayList(); + List wplist = new ArrayList<>(); wplist.add(readPosition(args, 1, "from")); RoutingEngine re = null; if ("seed".equals(args[3])) { diff --git a/brouter-server/src/main/java/btools/server/IpAccessMonitor.java b/brouter-server/src/main/java/btools/server/IpAccessMonitor.java index d9169bb..b69c737 100644 --- a/brouter-server/src/main/java/btools/server/IpAccessMonitor.java +++ b/brouter-server/src/main/java/btools/server/IpAccessMonitor.java @@ -5,7 +5,7 @@ import java.util.Map; public class IpAccessMonitor { private static Object sync = new Object(); - private static Map ipAccess = new HashMap(); + private static Map ipAccess = new HashMap<>(); private static long MAX_IDLE = 900000; // 15 minutes private static long CLEANUP_INTERVAL = 10000; // 10 seconds private static long lastCleanup; @@ -31,7 +31,7 @@ public class IpAccessMonitor { } private static void cleanup(long t) { - HashMap newMap = new HashMap(ipAccess.size()); + HashMap newMap = new HashMap<>(ipAccess.size()); for (Map.Entry e : ipAccess.entrySet()) { if (t - e.getValue().longValue() <= MAX_IDLE) { newMap.put(e.getKey(), e.getValue()); diff --git a/brouter-server/src/main/java/btools/server/Polygon.java b/brouter-server/src/main/java/btools/server/Polygon.java index 149a1c2..9115ef1 100644 --- a/brouter-server/src/main/java/btools/server/Polygon.java +++ b/brouter-server/src/main/java/btools/server/Polygon.java @@ -15,7 +15,7 @@ public class Polygon { private int maxy = Integer.MIN_VALUE; public Polygon(BufferedReader br) throws IOException { - ArrayList lines = new ArrayList(); + ArrayList lines = new ArrayList<>(); for (; ; ) { String line = br.readLine(); diff --git a/brouter-server/src/main/java/btools/server/RouteServer.java b/brouter-server/src/main/java/btools/server/RouteServer.java index 60009f8..8bd4021 100644 --- a/brouter-server/src/main/java/btools/server/RouteServer.java +++ b/brouter-server/src/main/java/btools/server/RouteServer.java @@ -199,7 +199,7 @@ public class RouteServer extends Thread implements Comparable { rc.forceUseStartDirection = true; } else if (e.getKey().startsWith("profile:")) { if (rc.keyValues == null) { - rc.keyValues = new HashMap(); + rc.keyValues = new HashMap<>(); } rc.keyValues.put(e.getKey().substring(8), e.getValue()); } else if (e.getKey().equals("straight")) { @@ -294,7 +294,7 @@ public class RouteServer extends Thread implements Comparable { ProfileCache.setSize(2 * maxthreads); - PriorityQueue threadQueue = new PriorityQueue(); + PriorityQueue threadQueue = new PriorityQueue<>(); ServerSocket serverSocket = args.length > 5 ? new ServerSocket(Integer.parseInt(args[3]), 100, InetAddress.getByName(args[5])) : new ServerSocket(Integer.parseInt(args[3])); @@ -359,7 +359,7 @@ public class RouteServer extends Thread implements Comparable { private static Map getUrlParams(String url) throws UnsupportedEncodingException { - HashMap params = new HashMap(); + HashMap params = new HashMap<>(); String decoded = URLDecoder.decode(url, "UTF-8"); StringTokenizer tk = new StringTokenizer(decoded, "?&"); while (tk.hasMoreTokens()) { diff --git a/brouter-server/src/main/java/btools/server/SuspectManager.java b/brouter-server/src/main/java/btools/server/SuspectManager.java index 6cecf64..303c699 100644 --- a/brouter-server/src/main/java/btools/server/SuspectManager.java +++ b/brouter-server/src/main/java/btools/server/SuspectManager.java @@ -244,7 +244,7 @@ public class SuspectManager extends Thread { bw.write("\n"); File countryParent = new File("worldpolys" + country); File[] files = countryParent.listFiles(); - TreeSet names = new TreeSet(); + TreeSet names = new TreeSet<>(); for (File f : files) { String name = f.getName(); if (name.endsWith(".poly")) { @@ -580,7 +580,7 @@ public class SuspectManager extends Thread { } } - private static Map allSuspectsMap = new HashMap(); + private static Map allSuspectsMap = new HashMap<>(); private static SuspectList getDailySuspectsIfLoaded() throws IOException { synchronized (allSuspectsMap) { diff --git a/brouter-server/src/main/java/btools/server/request/ProfileUploadHandler.java b/brouter-server/src/main/java/btools/server/request/ProfileUploadHandler.java index 4cc2138..78a39cf 100644 --- a/brouter-server/src/main/java/btools/server/request/ProfileUploadHandler.java +++ b/brouter-server/src/main/java/btools/server/request/ProfileUploadHandler.java @@ -51,7 +51,7 @@ public class ProfileUploadHandler { fileWriter.flush(); //System.out.println("data: |" + sw.toString() + "|"); - Map responseData = new HashMap(); + Map responseData = new HashMap<>(); responseData.put("profileid", CUSTOM_PREFIX + id); validateProfile(id, responseData); diff --git a/brouter-server/src/main/java/btools/server/request/ServerHandler.java b/brouter-server/src/main/java/btools/server/request/ServerHandler.java index 273c3c9..fb8f520 100644 --- a/brouter-server/src/main/java/btools/server/request/ServerHandler.java +++ b/brouter-server/src/main/java/btools/server/request/ServerHandler.java @@ -94,7 +94,7 @@ public class ServerHandler extends RequestHandler { if (coords.length < 2) throw new IllegalArgumentException("we need two lat/lon points at least!"); - List wplist = new ArrayList(); + List wplist = new ArrayList<>(); for (int i = 0; i < coords.length; i++) { String[] lonLat = coords[i].split(","); if (lonLat.length < 2) @@ -213,7 +213,7 @@ public class ServerHandler extends RequestHandler { String[] lonLatNameList = pois.split("\\|"); - List poisList = new ArrayList(); + List poisList = new ArrayList<>(); for (int i = 0; i < lonLatNameList.length; i++) { String[] lonLatName = lonLatNameList[i].split(","); @@ -237,7 +237,7 @@ public class ServerHandler extends RequestHandler { String[] lonLatRadList = nogos.split("\\|"); - List nogoList = new ArrayList(); + List nogoList = new ArrayList<>(); for (int i = 0; i < lonLatRadList.length; i++) { String[] lonLatRad = lonLatRadList[i].split(","); String nogoWeight = "NaN"; @@ -266,7 +266,7 @@ public class ServerHandler extends RequestHandler { } private List readNogoPolygons() { - List result = new ArrayList(); + List result = new ArrayList<>(); parseNogoPolygons(params.get("polylines"), result, false); parseNogoPolygons(params.get("polygons"), result, true); return result.size() > 0 ? result : null; diff --git a/brouter-util/src/main/java/btools/util/DenseLongMap.java b/brouter-util/src/main/java/btools/util/DenseLongMap.java index d0142df..96e6e32 100644 --- a/brouter-util/src/main/java/btools/util/DenseLongMap.java +++ b/brouter-util/src/main/java/btools/util/DenseLongMap.java @@ -17,7 +17,7 @@ import java.util.List; * @author ab */ public class DenseLongMap { - private List blocklist = new ArrayList(4096); + private List blocklist = new ArrayList<>(4096); private int blocksize; // bytes per bitplane in one block private int blocksizeBits; diff --git a/brouter-util/src/main/java/btools/util/FrozenLongMap.java b/brouter-util/src/main/java/btools/util/FrozenLongMap.java index b93f391..35945f3 100644 --- a/brouter-util/src/main/java/btools/util/FrozenLongMap.java +++ b/brouter-util/src/main/java/btools/util/FrozenLongMap.java @@ -20,7 +20,7 @@ public class FrozenLongMap extends CompactLongMap { size = map.size(); faid = new long[size]; - flv = new ArrayList(size); + flv = new ArrayList<>(size); map.moveToFrozenArrays(faid, flv); diff --git a/brouter-util/src/main/java/btools/util/LazyArrayOfLists.java b/brouter-util/src/main/java/btools/util/LazyArrayOfLists.java index 4285738..d8b05a5 100644 --- a/brouter-util/src/main/java/btools/util/LazyArrayOfLists.java +++ b/brouter-util/src/main/java/btools/util/LazyArrayOfLists.java @@ -13,7 +13,7 @@ public class LazyArrayOfLists { private List> lists; public LazyArrayOfLists(int size) { - lists = new ArrayList>(size); + lists = new ArrayList<>(size); for (int i = 0; i < size; i++) { lists.add(null); } @@ -22,7 +22,7 @@ public class LazyArrayOfLists { public List getList(int idx) { ArrayList list = lists.get(idx); if (list == null) { - list = new ArrayList(); + list = new ArrayList<>(); lists.set(idx, list); } return list; diff --git a/brouter-util/src/test/java/btools/util/CompactMapTest.java b/brouter-util/src/test/java/btools/util/CompactMapTest.java index 1dee666..b0a4459 100644 --- a/brouter-util/src/test/java/btools/util/CompactMapTest.java +++ b/brouter-util/src/test/java/btools/util/CompactMapTest.java @@ -22,9 +22,9 @@ public class CompactMapTest { private void hashMapComparison(int mapsize, int trycount) { Random rand = new Random(12345); - HashMap hmap = new HashMap(); - CompactLongMap cmap_slow = new CompactLongMap(); - CompactLongMap cmap_fast = new CompactLongMap(); + HashMap hmap = new HashMap<>(); + CompactLongMap cmap_slow = new CompactLongMap<>(); + CompactLongMap cmap_fast = new CompactLongMap<>(); for (int i = 0; i < mapsize; i++) { String s = "" + i; @@ -40,8 +40,8 @@ public class CompactMapTest { for (int i = 0; i < trycount * 2; i++) { if (i == trycount) { - cmap_slow = new FrozenLongMap(cmap_slow); - cmap_fast = new FrozenLongMap(cmap_fast); + cmap_slow = new FrozenLongMap<>(cmap_slow); + cmap_fast = new FrozenLongMap<>(cmap_fast); } long k = mapsize < 10 ? i : rand.nextInt(20000); Long KK = new Long(k); diff --git a/brouter-util/src/test/java/btools/util/CompactSetTest.java b/brouter-util/src/test/java/btools/util/CompactSetTest.java index fb32366..f36ba9d 100644 --- a/brouter-util/src/test/java/btools/util/CompactSetTest.java +++ b/brouter-util/src/test/java/btools/util/CompactSetTest.java @@ -22,7 +22,7 @@ public class CompactSetTest { private void hashSetComparison(int setsize, int trycount) { Random rand = new Random(12345); - HashSet hset = new HashSet(); + HashSet hset = new HashSet<>(); CompactLongSet cset_slow = new CompactLongSet(); CompactLongSet cset_fast = new CompactLongSet(); diff --git a/brouter-util/src/test/java/btools/util/DenseLongMapTest.java b/brouter-util/src/test/java/btools/util/DenseLongMapTest.java index d9d1803..0befe05 100644 --- a/brouter-util/src/test/java/btools/util/DenseLongMapTest.java +++ b/brouter-util/src/test/java/btools/util/DenseLongMapTest.java @@ -16,7 +16,7 @@ public class DenseLongMapTest { private void hashMapComparison(int mapsize, int trycount, long keyrange) { Random rand = new Random(12345); - HashMap hmap = new HashMap(); + HashMap hmap = new HashMap<>(); DenseLongMap dmap = new DenseLongMap(512); for (int i = 0; i < mapsize; i++) { @@ -48,7 +48,7 @@ public class DenseLongMapTest { int trycount = 100000; Random rand = new Random(12345); - HashSet hset = new HashSet(); + HashSet hset = new HashSet<>(); DenseLongMap dmap = new DenseLongMap(512); for (int i = 0; i < mapputs; i++) { diff --git a/brouter-util/src/test/java/btools/util/SortedHeapTest.java b/brouter-util/src/test/java/btools/util/SortedHeapTest.java index 8022055..75bac5a 100644 --- a/brouter-util/src/test/java/btools/util/SortedHeapTest.java +++ b/brouter-util/src/test/java/btools/util/SortedHeapTest.java @@ -8,7 +8,7 @@ import java.util.Random; public class SortedHeapTest { @Test public void sortedHeapTest1() { - SortedHeap sh = new SortedHeap(); + SortedHeap sh = new SortedHeap<>(); Random rnd = new Random(); for (int i = 0; i < 100000; i++) { int val = rnd.nextInt(1000000); @@ -34,7 +34,7 @@ public class SortedHeapTest { @Test public void sortedHeapTest2() { - SortedHeap sh = new SortedHeap(); + SortedHeap sh = new SortedHeap<>(); Random rnd = new Random(); for (int i = 0; i < 100000; i++) { sh.add(i, "" + i); diff --git a/config/pmd/pmd-ruleset.xml b/config/pmd/pmd-ruleset.xml index 164198a..bc415a8 100644 --- a/config/pmd/pmd-ruleset.xml +++ b/config/pmd/pmd-ruleset.xml @@ -50,7 +50,7 @@ - + From 28f205c1adcfbef6f43f216a5192b8c49e7bc17a Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Tue, 9 May 2023 22:13:57 +0200 Subject: [PATCH 05/14] Enable PMD rule PrimitiveWrapperInstantiation and fix violations --- .../src/main/java/btools/codec/MicroCache2.java | 4 ++-- .../src/main/java/btools/router/SuspectInfo.java | 2 +- .../java/btools/expressions/BExpressionContext.java | 4 ++-- .../main/java/btools/mapcreator/RelationMerger.java | 2 +- .../src/main/java/btools/mapcreator/WayLinker.java | 2 +- .../src/main/java/btools/routingapp/BRouterWorker.java | 2 +- .../src/main/java/btools/server/IpAccessMonitor.java | 2 +- .../src/main/java/btools/server/RouteServer.java | 4 ++-- .../src/test/java/btools/util/CompactMapTest.java | 4 ++-- .../src/test/java/btools/util/CompactSetTest.java | 4 ++-- .../src/test/java/btools/util/DenseLongMapTest.java | 10 +++++----- config/pmd/pmd-ruleset.xml | 1 - 12 files changed, 20 insertions(+), 21 deletions(-) diff --git a/brouter-codec/src/main/java/btools/codec/MicroCache2.java b/brouter-codec/src/main/java/btools/codec/MicroCache2.java index 21aa5c2..c7b6878 100644 --- a/brouter-codec/src/main/java/btools/codec/MicroCache2.java +++ b/brouter-codec/src/main/java/btools/codec/MicroCache2.java @@ -289,7 +289,7 @@ public final class MicroCache2 extends MicroCache { public int encodeMicroCache(byte[] buffer) { HashMap idMap = new HashMap<>(); for (int n = 0; n < size; n++) { // loop over nodes - idMap.put(Long.valueOf(expandId(faid[n])), Integer.valueOf(n)); + idMap.put(expandId(faid[n]), n); } IntegerFifo3Pass linkCounts = new IntegerFifo3Pass(256); @@ -404,7 +404,7 @@ public final class MicroCache2 extends MicroCache { } long link64 = ((long) ilonlink) << 32 | ilatlink; - Integer idx = idMap.get(Long.valueOf(link64)); + Integer idx = idMap.get(link64); boolean isInternal = idx != null; if (isReverse && isInternal) { diff --git a/brouter-core/src/main/java/btools/router/SuspectInfo.java b/brouter-core/src/main/java/btools/router/SuspectInfo.java index b1f4cfe..34bc621 100644 --- a/brouter-core/src/main/java/btools/router/SuspectInfo.java +++ b/brouter-core/src/main/java/btools/router/SuspectInfo.java @@ -17,7 +17,7 @@ public class SuspectInfo { public int triggers; public static void addSuspect(Map map, long id, int prio, int trigger) { - Long iD = Long.valueOf(id); + Long iD = id; SuspectInfo info = map.get(iD); if (info == null) { info = new SuspectInfo(); diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java b/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java index 8f05277..2bfd2f0 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java @@ -528,7 +528,7 @@ public abstract class BExpressionContext implements IByteArrayUnifier { } // unknown name, create - num = Integer.valueOf(lookupValues.size()); + num = lookupValues.size(); lookupNumbers.put(name, num); lookupNames.add(name); lookupValues.add(new BExpressionLookupValue[]{new BExpressionLookupValue("") @@ -855,7 +855,7 @@ public abstract class BExpressionContext implements IByteArrayUnifier { Integer num = variableNumbers.get(name); if (num == null) { if (create) { - num = Integer.valueOf(variableNumbers.size()); + num = variableNumbers.size(); variableNumbers.put(name, num); } else { return -1; diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/RelationMerger.java b/brouter-map-creator/src/main/java/btools/mapcreator/RelationMerger.java index 7715bf8..8279d41 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/RelationMerger.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/RelationMerger.java @@ -130,7 +130,7 @@ public class RelationMerger extends MapCreatorBase { if (routeset.contains(data.wid)) { int sepIdx = key.lastIndexOf('_'); String tagname = key.substring(0, sepIdx); - int val = Integer.valueOf(key.substring(sepIdx + 1)); + int val = Integer.parseInt(key.substring(sepIdx + 1)); expctxReport.addSmallestLookupValue(tagname, val); } } diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java b/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java index 2e1c273..91c70a9 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java @@ -480,7 +480,7 @@ public class WayLinker extends MapCreatorBase implements Runnable { if (mc.expandId(shrinkid) != longId) { throw new IllegalArgumentException("inconstistent shrinking: " + longId); } - sortedList.put(Integer.valueOf(shrinkid), n); + sortedList.put(shrinkid, n); } for (OsmNodeP n : sortedList.values()) { diff --git a/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java b/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java index ec3fce0..4543b8d 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java @@ -107,7 +107,7 @@ public class BRouterWorker { String straight = params.getString("straight"); String[] sa = straight.split(","); for (int i = 0; i < sa.length; i++) { - int v = Integer.valueOf(sa[i]); + int v = Integer.parseInt(sa[i]); if (waypoints.size() > v) waypoints.get(v).direct = true; } } catch (NumberFormatException e) { diff --git a/brouter-server/src/main/java/btools/server/IpAccessMonitor.java b/brouter-server/src/main/java/btools/server/IpAccessMonitor.java index b69c737..a9413e2 100644 --- a/brouter-server/src/main/java/btools/server/IpAccessMonitor.java +++ b/brouter-server/src/main/java/btools/server/IpAccessMonitor.java @@ -14,7 +14,7 @@ public class IpAccessMonitor { long t = System.currentTimeMillis(); synchronized (sync) { Long lastTime = ipAccess.get(ip); - ipAccess.put(ip, Long.valueOf(t)); + ipAccess.put(ip, t); return lastTime == null || t - lastTime.longValue() > MAX_IDLE; } } diff --git a/brouter-server/src/main/java/btools/server/RouteServer.java b/brouter-server/src/main/java/btools/server/RouteServer.java index 8bd4021..9ac91d9 100644 --- a/brouter-server/src/main/java/btools/server/RouteServer.java +++ b/brouter-server/src/main/java/btools/server/RouteServer.java @@ -195,7 +195,7 @@ public class RouteServer extends Thread implements Comparable { if ("timode".equals(e.getKey())) { rc.turnInstructionMode = Integer.parseInt(e.getValue()); } else if ("heading".equals(e.getKey())) { - rc.startDirection = Integer.valueOf(Integer.parseInt(e.getValue())); + rc.startDirection = Integer.parseInt(e.getValue()); rc.forceUseStartDirection = true; } else if (e.getKey().startsWith("profile:")) { if (rc.keyValues == null) { @@ -205,7 +205,7 @@ public class RouteServer extends Thread implements Comparable { } else if (e.getKey().equals("straight")) { String[] sa = e.getValue().split(","); for (int i = 0; i < sa.length; i++) { - int v = Integer.valueOf(sa[i]); + int v = Integer.parseInt(sa[i]); if (wplist.size() > v) wplist.get(v).direct = true; } } diff --git a/brouter-util/src/test/java/btools/util/CompactMapTest.java b/brouter-util/src/test/java/btools/util/CompactMapTest.java index b0a4459..1217497 100644 --- a/brouter-util/src/test/java/btools/util/CompactMapTest.java +++ b/brouter-util/src/test/java/btools/util/CompactMapTest.java @@ -29,7 +29,7 @@ public class CompactMapTest { for (int i = 0; i < mapsize; i++) { String s = "" + i; long k = mapsize < 10 ? i : rand.nextInt(20000); - Long KK = new Long(k); + Long KK = k; if (!hmap.containsKey(KK)) { hmap.put(KK, s); @@ -44,7 +44,7 @@ public class CompactMapTest { cmap_fast = new FrozenLongMap<>(cmap_fast); } long k = mapsize < 10 ? i : rand.nextInt(20000); - Long KK = new Long(k); + Long KK = k; String s = hmap.get(KK); boolean contained = hmap.containsKey(KK); diff --git a/brouter-util/src/test/java/btools/util/CompactSetTest.java b/brouter-util/src/test/java/btools/util/CompactSetTest.java index f36ba9d..e0f5340 100644 --- a/brouter-util/src/test/java/btools/util/CompactSetTest.java +++ b/brouter-util/src/test/java/btools/util/CompactSetTest.java @@ -28,7 +28,7 @@ public class CompactSetTest { for (int i = 0; i < setsize; i++) { long k = setsize < 10 ? i : rand.nextInt(20000); - Long KK = new Long(k); + Long KK = k; if (!hset.contains(KK)) { hset.add(KK); @@ -43,7 +43,7 @@ public class CompactSetTest { cset_fast = new FrozenLongSet(cset_fast); } long k = setsize < 10 ? i : rand.nextInt(20000); - Long KK = new Long(k); + Long KK = k; boolean contained = hset.contains(KK); Assert.assertEquals("contains missmatch (slow)", contained, cset_slow.contains(k)); diff --git a/brouter-util/src/test/java/btools/util/DenseLongMapTest.java b/brouter-util/src/test/java/btools/util/DenseLongMapTest.java index 0befe05..57e867a 100644 --- a/brouter-util/src/test/java/btools/util/DenseLongMapTest.java +++ b/brouter-util/src/test/java/btools/util/DenseLongMapTest.java @@ -22,15 +22,15 @@ public class DenseLongMapTest { for (int i = 0; i < mapsize; i++) { int value = i % 255; long k = (long) (rand.nextDouble() * keyrange); - Long KK = new Long(k); + Long KK = k; - hmap.put(KK, new Integer(value)); + hmap.put(KK, value); dmap.put(k, value); // duplicate puts allowed! } for (int i = 0; i < trycount; i++) { long k = (long) (rand.nextDouble() * keyrange); - Long KK = new Long(k); + Long KK = k; Integer VV = hmap.get(KK); int hvalue = VV == null ? -1 : VV.intValue(); int dvalue = dmap.getInt(k); @@ -53,12 +53,12 @@ public class DenseLongMapTest { DenseLongMap dmap = new DenseLongMap(512); for (int i = 0; i < mapputs; i++) { long k = (long) (rand.nextDouble() * keyrange); - hset.add(new Long(k)); + hset.add(k); dmap.put(k, 0); } for (int i = 0; i < trycount; i++) { long k = (long) (rand.nextDouble() * keyrange); - boolean hcontains = hset.contains(new Long(k)); + boolean hcontains = hset.contains(k); boolean dcontains = dmap.getInt(k) == 0; if (hcontains != dcontains) { diff --git a/config/pmd/pmd-ruleset.xml b/config/pmd/pmd-ruleset.xml index bc415a8..787e663 100644 --- a/config/pmd/pmd-ruleset.xml +++ b/config/pmd/pmd-ruleset.xml @@ -28,7 +28,6 @@ - From c20b2ba686dd1b85bcd319c9c3640671ff05c8d6 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Wed, 10 May 2023 12:56:21 +0200 Subject: [PATCH 06/14] update to one routine --- .../btools/mapcreator/ConvertLidarTile.java | 149 +++++++----------- .../java/btools/mapcreator/PosUnifier.java | 9 +- 2 files changed, 61 insertions(+), 97 deletions(-) diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java b/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java index d06de33..65307ce 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java @@ -29,6 +29,7 @@ public class ConvertLidarTile { try { for (; ; ) { ZipEntry ze = zis.getNextEntry(); + if (ze == null) break; if (ze.getName().endsWith(".hgt")) { readHgtFromStream(zis, rowOffset, colOffset, 1200); return; @@ -65,34 +66,6 @@ public class ConvertLidarTile { } } - private static void readHgtFromFile(File f, int rowOffset, int colOffset) - throws Exception { - DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(f))); - - for (int ir = 0; ir < ROW_LENGTH + 1; ir++) { - int row = rowOffset + ir; - - for (int ic = 0; ic < ROW_LENGTH + 1; ic++) { - int col = colOffset + ic; - - int i1 = dis.read(); // msb first! - int i0 = dis.read(); - - if (i0 == -1 || i1 == -1) - throw new RuntimeException("unexcepted end of file reading hgt entry!"); - - short val = (short) ((i1 << 8) | i0); - - if (val == NODATA2) { - val = NODATA; - } - - setPixel(row, col, val); - } - } - } - - private static void setPixel(int row, int col, short val) { if (row >= 0 && row < NROWS && col >= 0 && col < NCOLS) { imagePixels[row * NCOLS + col] = val; @@ -217,78 +190,67 @@ public class ConvertLidarTile { doConvert(args[1], ilon_base, ilat_base, filename30); } - public SrtmRaster getRasterDirect(File f, double lon, double lat) throws Exception { - if (f.length() > ((SRTM3_ROW_LENGTH + 1) * (SRTM3_ROW_LENGTH + 1) * 2)) { - ROW_LENGTH = SRTM1_ROW_LENGTH; - } else { - ROW_LENGTH = SRTM3_ROW_LENGTH; - } - System.out.println("read file " + f + " rl " + ROW_LENGTH); + public SrtmRaster getRaster(File f, double lon, double lat) throws Exception { - // stay a 1x1 raster - NROWS = ROW_LENGTH + 1; - NCOLS = ROW_LENGTH + 1; - - imagePixels = new short[NROWS * NCOLS]; // 650 MB ! - - // prefill as NODATA - for (int row = 0; row < NROWS; row++) { - for (int col = 0; col < NCOLS; col++) { - imagePixels[row * NCOLS + col] = NODATA; - } - } - - readHgtFromFile(f, 0, 0); - - boolean halfCol5 = false; // no halfcol tiles in lidar data (?) - - SrtmRaster raster = new SrtmRaster(); - raster.nrows = NROWS; - raster.ncols = NCOLS; - raster.halfcol = halfCol5; - raster.noDataValue = NODATA; - raster.cellsize = 1. / (double) ROW_LENGTH; - raster.xllcorner = (int) (lon < 0 ? lon - 1 : lon); //onDegreeStart - raster.cellsize; - raster.yllcorner = (int) (lat < 0 ? lat - 1 : lat); //latDegreeStart - raster.cellsize; - raster.eval_array = imagePixels; - - return raster; - } - - public SrtmRaster getRasterZip(File f, double lon, double lat) throws Exception { - - ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(f))); - try { - for (; ; ) { - ZipEntry ze = zis.getNextEntry(); - if (ze.getName().toLowerCase().endsWith(".hgt")) { - if (ze.getSize() > ((SRTM3_ROW_LENGTH + 1) * (SRTM3_ROW_LENGTH + 1) * 2)) { - ROW_LENGTH = SRTM1_ROW_LENGTH; - } else { - ROW_LENGTH = SRTM3_ROW_LENGTH; - } - System.out.println("read file " + f + " rl " + ROW_LENGTH); - // stay a 1x1 raster - NROWS = ROW_LENGTH + 1; - NCOLS = ROW_LENGTH + 1; - - imagePixels = new short[NROWS * NCOLS]; // 650 MB ! - - // prefill as NODATA - for (int row = 0; row < NROWS; row++) { - for (int col = 0; col < NCOLS; col++) { - imagePixels[row * NCOLS + col] = NODATA; + if (f.getName().toLowerCase().endsWith(".zip")) { + ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(f))); + try { + for (; ; ) { + ZipEntry ze = zis.getNextEntry(); + if (ze == null) break; + if (ze.getName().toLowerCase().endsWith(".hgt")) { + if (ze.getSize() > ((SRTM3_ROW_LENGTH + 1) * (SRTM3_ROW_LENGTH + 1) * 2)) { + ROW_LENGTH = SRTM1_ROW_LENGTH; + } else { + ROW_LENGTH = SRTM3_ROW_LENGTH; } + // stay a 1x1 raster + NROWS = ROW_LENGTH + 1; + NCOLS = ROW_LENGTH + 1; + + imagePixels = new short[NROWS * NCOLS]; // 650 MB ! + + // prefill as NODATA + for (int row = 0; row < NROWS; row++) { + for (int col = 0; col < NCOLS; col++) { + imagePixels[row * NCOLS + col] = NODATA; + } + } + readHgtFromStream(zis, 0, 0, ROW_LENGTH); + break; } - readHgtFromStream(zis, 0, 0, ROW_LENGTH); - break; + } + } finally { + zis.close(); + } + } else { + if (f.length() > ((SRTM3_ROW_LENGTH + 1) * (SRTM3_ROW_LENGTH + 1) * 2)) { + ROW_LENGTH = SRTM1_ROW_LENGTH; + } else { + ROW_LENGTH = SRTM3_ROW_LENGTH; + } + // stay a 1x1 raster + NROWS = ROW_LENGTH + 1; + NCOLS = ROW_LENGTH + 1; + + imagePixels = new short[NROWS * NCOLS]; // 650 MB ! + + // prefill as NODATA + for (int row = 0; row < NROWS; row++) { + for (int col = 0; col < NCOLS; col++) { + imagePixels[row * NCOLS + col] = NODATA; } } - } finally { - zis.close(); + FileInputStream dis = new FileInputStream(f); + try { + readHgtFromStream(dis, 0, 0, ROW_LENGTH); + } finally { + dis.close(); + } } - + System.out.println("read file " + f + " rl " + ROW_LENGTH); + boolean halfCol5 = false; // no halfcol tiles in lidar data (?) SrtmRaster raster = new SrtmRaster(); @@ -304,4 +266,5 @@ public class ConvertLidarTile { return raster; } + } diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java b/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java index 22df5e6..6fade10 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/PosUnifier.java @@ -7,6 +7,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import btools.util.CompactLongSet; @@ -217,13 +218,13 @@ public class PosUnifier extends MapCreatorBase { if (lastSrtmRaster == null) { File f = new File(new File(srtmdir), filename + ".hgt"); if (f.exists()) { - lastSrtmRaster = new ConvertLidarTile().getRasterDirect(f, lon, lat); + lastSrtmRaster = new ConvertLidarTile().getRaster(f, lon, lat); srtmmap.put(filename, lastSrtmRaster); return lastSrtmRaster; } f = new File(new File(srtmdir), filename + ".zip"); if (f.exists()) { - lastSrtmRaster = new ConvertLidarTile().getRasterZip(f, lon, lat); + lastSrtmRaster = new ConvertLidarTile().getRaster(f, lon, lat); srtmmap.put(filename, lastSrtmRaster); return lastSrtmRaster; } @@ -246,11 +247,11 @@ public class PosUnifier extends MapCreatorBase { lon = -lon + 1; } - return String.format("%s%02d%s%03d", latPref, lat, lonPref, lon); + return String.format(Locale.US, "%s%02d%s%03d", latPref, lat, lonPref, lon); } private void resetSrtm() { - srtmmap = new HashMap(); + srtmmap = new HashMap<>(); lastSrtmLonIdx = -1; lastSrtmLatIdx = -1; lastSrtmRaster = null; From 8c6be0422854011d177005eb15258c739501ddde Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Mon, 15 May 2023 14:17:22 +0200 Subject: [PATCH 07/14] Delete HgtReader --- .../java/btools/mapcreator/HgtReader.java | 269 ------------------ 1 file changed, 269 deletions(-) delete mode 100644 brouter-map-creator/src/main/java/btools/mapcreator/HgtReader.java diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/HgtReader.java b/brouter-map-creator/src/main/java/btools/mapcreator/HgtReader.java deleted file mode 100644 index b232bf3..0000000 --- a/brouter-map-creator/src/main/java/btools/mapcreator/HgtReader.java +++ /dev/null @@ -1,269 +0,0 @@ -// License: GPL. For details, see LICENSE file. -package btools.mapcreator; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.ShortBuffer; -import java.nio.channels.FileChannel; -import java.util.HashMap; -import java.util.Map; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -/** - * adapted from https://github.com/JOSM/josm-plugins/blob/master/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/HgtReader.java - *

- * Class HgtReader reads data from SRTM HGT files. Currently this class is restricted to a resolution of 3 arc seconds. - *

- * SRTM data files are available at the NASA SRTM site - * - * @author Oliver Wieland <oliver.wieland@online.de> - */ -public class HgtReader { - final static boolean DEBUG = false; - - private static final int SECONDS_PER_MINUTE = 60; - - public static final String HGT_EXT = ".hgt"; - public static final String ZIP_EXT = ".zip"; - - // alter these values for different SRTM resolutions - public static final int HGT3_RES = 3; // resolution in arc seconds - public static final int HGT3_ROW_LENGTH = 1201; // number of elevation values per line - public static final int HGT_VOID = -32768; // magic number which indicates 'void data' in HGT file - public static final int HGT1_RES = 1; // <<- The new SRTM is 1-ARCSEC - public static final int HGT1_ROW_LENGTH = 3601; //-- New file resolution is 3601x3601 - /** - * The 'no elevation' data magic. - */ - public static double NO_ELEVATION = Double.NaN; - - private static String srtmFolder = ""; - - private static final Map cache = new HashMap<>(); - - public HgtReader(String folder) { - srtmFolder = folder; - } - - public static double getElevationFromHgt(double lat, double lon) { - try { - String file = getHgtFileName(lat, lon); - if (DEBUG) System.out.println("SRTM buffer " + file + " for " + lat + " " + lon); - - // given area in cache? - if (!cache.containsKey(file)) { - - // fill initial cache value. If no file is found, then - // we use it as a marker to indicate 'file has been searched - // but is not there' - cache.put(file, null); - // Try all resource directories - //for (String location : Main.pref.getAllPossiblePreferenceDirs()) - { - String fullPath = new File(srtmFolder, file + HGT_EXT).getPath(); - File f = new File(fullPath); - if (f.exists()) { - // found something: read HGT file... - ShortBuffer data = readHgtFile(fullPath); - // ... and store result in cache - cache.put(file, data); - //break; - } else { - fullPath = new File(srtmFolder, file + ZIP_EXT).getPath(); - f = new File(fullPath); - if (f.exists()) { - ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(f))); - try { - for (; ; ) { - ZipEntry ze = zis.getNextEntry(); - if (ze == null) break; - if (ze.getName().toLowerCase().endsWith(HGT_EXT)) { - // System.out.println("read zip " + ze.getName()); - ShortBuffer data = readHgtStream(zis); - // ... and store result in cache - cache.put(file, data); - break; - } - zis.closeEntry(); - } - } finally { - zis.close(); - } - } - } - } - } - - // read elevation value - return readElevation(lat, lon); - } catch (FileNotFoundException e) { - System.err.println("SRTM Get elevation from HGT " + lat + ", " + lon + " failed: => " + e.getMessage()); - // no problem... file not there - return NO_ELEVATION; - } catch (Exception ioe) { - // oops... - ioe.printStackTrace(System.err); - // fallback - return NO_ELEVATION; - } - } - - @SuppressWarnings("resource") - private static ShortBuffer readHgtFile(String file) throws Exception { - if (file == null) throw new Exception("no srmt file " + file); - - FileChannel fc = null; - ShortBuffer sb = null; - try { - // Eclipse complains here about resource leak on 'fc' - even with 'finally' clause??? - fc = new FileInputStream(file).getChannel(); - // choose the right endianness - - ByteBuffer bb = ByteBuffer.allocateDirect((int) fc.size()); - while (bb.remaining() > 0) fc.read(bb); - - bb.flip(); - //sb = bb.order(ByteOrder.LITTLE_ENDIAN).asShortBuffer(); - sb = bb.order(ByteOrder.BIG_ENDIAN).asShortBuffer(); - } finally { - if (fc != null) fc.close(); - } - - return sb; - } - - // @SuppressWarnings("resource") - private static ShortBuffer readHgtStream(InputStream zis) throws Exception { - if (zis == null) throw new Exception("no srmt stream "); - - ShortBuffer sb = null; - try { - // choose the right endianness - - byte[] bytes = zis.readAllBytes(); - ByteBuffer bb = ByteBuffer.allocate(bytes.length); - bb.put(bytes, 0, bytes.length); - //while (bb.remaining() > 0) zis.read(bb, 0, size); - - //ByteBuffer bb = ByteBuffer.allocate(zis.available()); - //Channels.newChannel(zis).read(bb); - bb.flip(); - //sb = bb.order(ByteOrder.LITTLE_ENDIAN).asShortBuffer(); - sb = bb.order(ByteOrder.BIG_ENDIAN).asShortBuffer(); - } finally { - - } - - return sb; - } - - /** - * Reads the elevation value for the given coordinate. - *

- * See also stackexchange.com - * - * @param lat, lon the coordinate to get the elevation data for - * @return the elevation value or Double.NaN, if no value is present - */ - public static double readElevation(double lat, double lon) { - String tag = getHgtFileName(lat, lon); - - ShortBuffer sb = cache.get(tag); - - if (sb == null) { - return NO_ELEVATION; - } - - if (DEBUG) System.out.println("SRTM buffer size " + sb.capacity() + " limit " + sb.limit()); - try { - int rowLength = HGT3_ROW_LENGTH; - int resolution = HGT3_RES; - if (sb.capacity() > (HGT3_ROW_LENGTH * HGT3_ROW_LENGTH)) { - rowLength = HGT1_ROW_LENGTH; - resolution = HGT1_RES; - } - // see http://gis.stackexchange.com/questions/43743/how-to-extract-elevation-from-hgt-file - double fLat = frac(lat) * SECONDS_PER_MINUTE; - double fLon = frac(lon) * SECONDS_PER_MINUTE; - - // compute offset within HGT file - int row = (int) Math.round((fLat) * SECONDS_PER_MINUTE / resolution); - int col = (int) Math.round((fLon) * SECONDS_PER_MINUTE / resolution); - if (lon < 0) col = rowLength - col - 1; - if (lat > 0) row = rowLength - row - 1; - - - //row = rowLength - row; - int cell = (rowLength * (row)) + col; - //int cell = ((rowLength * (latitude)) + longitude); - - if (DEBUG) - System.out.println("Read SRTM elevation data from row/col/cell " + row + "," + col + ", " + cell + ", " + sb.limit()); - - // valid position in buffer? - if (cell < sb.limit()) { - short ele = sb.get(cell); - // check for data voids - if (ele == HGT_VOID) { - return NO_ELEVATION; - } else { - return ele; - } - } else { - return NO_ELEVATION; - } - } catch (Exception e) { - System.err.println("error at " + lon + " " + lat + " "); - e.printStackTrace(); - } - return NO_ELEVATION; - } - - /** - * Gets the associated HGT file name for the given way point. Usually the - * format is [N|S]nn[W|E]mmm.hgt where nn is the integral latitude - * without decimals and mmm is the longitude. - * - * @param llat,llon the coordinate to get the filename for - * @return the file name of the HGT file - */ - public static String getHgtFileName(double llat, double llon) { - int lat = (int) llat; - int lon = (int) llon; - - String latPref = "N"; - if (lat < 0) { - latPref = "S"; - lat = -lat + 1; - } - String lonPref = "E"; - if (lon < 0) { - lonPref = "W"; - lon = -lon + 1; - } - - return String.format("%s%02d%s%03d", latPref, lat, lonPref, lon); - } - - public static double frac(double d) { - long iPart; - double fPart; - - // Get user input - iPart = (long) d; - fPart = d - iPart; - return Math.abs(fPart); - } - - public static void clear() { - if (cache != null) { - cache.clear(); - } - } -} From 7c184a03f984743660beff7f09431e105460991d Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Mon, 15 May 2023 14:30:28 +0200 Subject: [PATCH 08/14] Deduplicate code --- .../btools/mapcreator/ConvertLidarTile.java | 110 +++++++----------- 1 file changed, 45 insertions(+), 65 deletions(-) diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java b/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java index 65307ce..ddd8bae 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java @@ -5,22 +5,25 @@ import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; +import java.util.Arrays; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ConvertLidarTile { - public static int NROWS; - public static int NCOLS; - public static int ROW_LENGTH; + private static int NROWS; + private static int NCOLS; public static final short NODATA2 = -32767; // hgt-formats nodata public static final short NODATA = Short.MIN_VALUE; - public static final int SRTM3_ROW_LENGTH = 1200; // number of elevation values per line - public static final int SRTM1_ROW_LENGTH = 3600; //-- New file resolution is 3601x3601 + private static final int SRTM_BORDER_OVERLAP = 1; + private static final int SRTM3_ROW_LENGTH = 1201; // 3 arc second resolution (90m) + private static final int SRTM3_FILE_SIZE = SRTM3_ROW_LENGTH * SRTM3_ROW_LENGTH * Short.BYTES; + private static final int SRTM1_ROW_LENGTH = 3601; // 1 arc second resolution (30m) static short[] imagePixels; @@ -31,7 +34,7 @@ public class ConvertLidarTile { ZipEntry ze = zis.getNextEntry(); if (ze == null) break; if (ze.getName().endsWith(".hgt")) { - readHgtFromStream(zis, rowOffset, colOffset, 1200); + readHgtFromStream(zis, rowOffset, colOffset, SRTM3_ROW_LENGTH); return; } } @@ -40,13 +43,13 @@ public class ConvertLidarTile { } } - private static void readHgtFromStream(InputStream is, int rowOffset, int colOffset, int row_length) + private static void readHgtFromStream(InputStream is, int rowOffset, int colOffset, int rowLength) throws Exception { DataInputStream dis = new DataInputStream(new BufferedInputStream(is)); - for (int ir = 0; ir < row_length + 1; ir++) { + for (int ir = 0; ir < rowLength; ir++) { int row = rowOffset + ir; - for (int ic = 0; ic < row_length + 1; ic++) { + for (int ic = 0; ic < rowLength; ic++) { int col = colOffset + ic; int i1 = dis.read(); // msb first! @@ -191,80 +194,57 @@ public class ConvertLidarTile { } public SrtmRaster getRaster(File f, double lon, double lat) throws Exception { + long fileSize; + InputStream inputStream; if (f.getName().toLowerCase().endsWith(".zip")) { + String HGT_FILE_EXT = ".hgt"; ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(f))); - try { - for (; ; ) { - ZipEntry ze = zis.getNextEntry(); - if (ze == null) break; - if (ze.getName().toLowerCase().endsWith(".hgt")) { - if (ze.getSize() > ((SRTM3_ROW_LENGTH + 1) * (SRTM3_ROW_LENGTH + 1) * 2)) { - ROW_LENGTH = SRTM1_ROW_LENGTH; - } else { - ROW_LENGTH = SRTM3_ROW_LENGTH; - } - // stay a 1x1 raster - NROWS = ROW_LENGTH + 1; - NCOLS = ROW_LENGTH + 1; - - imagePixels = new short[NROWS * NCOLS]; // 650 MB ! - - // prefill as NODATA - for (int row = 0; row < NROWS; row++) { - for (int col = 0; col < NCOLS; col++) { - imagePixels[row * NCOLS + col] = NODATA; - } - } - readHgtFromStream(zis, 0, 0, ROW_LENGTH); - break; - } + for (; ; ) { + ZipEntry ze = zis.getNextEntry(); + if (ze == null) { + throw new FileNotFoundException(f.getName() + " doesn't contain a " + HGT_FILE_EXT + " file."); + } + if (ze.getName().toLowerCase().endsWith(HGT_FILE_EXT)) { + fileSize = ze.getSize(); + inputStream = zis; + break; } - } finally { - zis.close(); } } else { - if (f.length() > ((SRTM3_ROW_LENGTH + 1) * (SRTM3_ROW_LENGTH + 1) * 2)) { - ROW_LENGTH = SRTM1_ROW_LENGTH; - } else { - ROW_LENGTH = SRTM3_ROW_LENGTH; - } - // stay a 1x1 raster - NROWS = ROW_LENGTH + 1; - NCOLS = ROW_LENGTH + 1; - - imagePixels = new short[NROWS * NCOLS]; // 650 MB ! - - // prefill as NODATA - for (int row = 0; row < NROWS; row++) { - for (int col = 0; col < NCOLS; col++) { - imagePixels[row * NCOLS + col] = NODATA; - } - } - FileInputStream dis = new FileInputStream(f); - try { - readHgtFromStream(dis, 0, 0, ROW_LENGTH); - } finally { - dis.close(); - } + fileSize = f.length(); + inputStream = new FileInputStream(f); } - System.out.println("read file " + f + " rl " + ROW_LENGTH); - - boolean halfCol5 = false; // no halfcol tiles in lidar data (?) + int rowLength; + if (fileSize > SRTM3_FILE_SIZE) { + rowLength = SRTM1_ROW_LENGTH; + } else { + rowLength = SRTM3_ROW_LENGTH; + } + + // stay at 1 deg * 1 deg raster + NROWS = rowLength; + NCOLS = rowLength; + + imagePixels = new short[NROWS * NCOLS]; + + // prefill as NODATA + Arrays.fill(imagePixels, NODATA); + readHgtFromStream(inputStream, 0, 0, rowLength); + inputStream.close(); SrtmRaster raster = new SrtmRaster(); raster.nrows = NROWS; raster.ncols = NCOLS; - raster.halfcol = halfCol5; + raster.halfcol = false; // assume full resolution raster.noDataValue = NODATA; - raster.cellsize = 1. / (double) ROW_LENGTH; + raster.cellsize = 1. / (double) (rowLength - SRTM_BORDER_OVERLAP); raster.xllcorner = (int) (lon < 0 ? lon - 1 : lon); //onDegreeStart - raster.cellsize; raster.yllcorner = (int) (lat < 0 ? lat - 1 : lat); //latDegreeStart - raster.cellsize; raster.eval_array = imagePixels; return raster; - } } From 53a5f4464577e372ecd26052d0cf3b853339c5f1 Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Mon, 15 May 2023 21:45:21 +0200 Subject: [PATCH 09/14] Rename SRTM variables because it's not SRTM specific --- .../btools/mapcreator/ConvertLidarTile.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java b/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java index ddd8bae..46f9c57 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/ConvertLidarTile.java @@ -20,10 +20,11 @@ public class ConvertLidarTile { public static final short NODATA2 = -32767; // hgt-formats nodata public static final short NODATA = Short.MIN_VALUE; - private static final int SRTM_BORDER_OVERLAP = 1; - private static final int SRTM3_ROW_LENGTH = 1201; // 3 arc second resolution (90m) - private static final int SRTM3_FILE_SIZE = SRTM3_ROW_LENGTH * SRTM3_ROW_LENGTH * Short.BYTES; - private static final int SRTM1_ROW_LENGTH = 3601; // 1 arc second resolution (30m) + private static final String HGT_FILE_EXT = ".hgt"; + private static final int HGT_BORDER_OVERLAP = 1; + private static final int HGT_3ASEC_ROWS = 1201; // 3 arc second resolution (90m) + private static final int HGT_3ASEC_FILE_SIZE = HGT_3ASEC_ROWS * HGT_3ASEC_ROWS * Short.BYTES; + private static final int HGT_1ASEC_ROWS = 3601; // 1 arc second resolution (30m) static short[] imagePixels; @@ -33,8 +34,8 @@ public class ConvertLidarTile { for (; ; ) { ZipEntry ze = zis.getNextEntry(); if (ze == null) break; - if (ze.getName().endsWith(".hgt")) { - readHgtFromStream(zis, rowOffset, colOffset, SRTM3_ROW_LENGTH); + if (ze.getName().toLowerCase().endsWith(HGT_FILE_EXT)) { + readHgtFromStream(zis, rowOffset, colOffset, HGT_3ASEC_ROWS); return; } } @@ -56,7 +57,7 @@ public class ConvertLidarTile { int i0 = dis.read(); if (i0 == -1 || i1 == -1) - throw new RuntimeException("unexcepted end of file reading hgt entry!"); + throw new RuntimeException("unexpected end of file reading hgt entry!"); short val = (short) ((i1 << 8) | i0); @@ -198,7 +199,6 @@ public class ConvertLidarTile { InputStream inputStream; if (f.getName().toLowerCase().endsWith(".zip")) { - String HGT_FILE_EXT = ".hgt"; ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(f))); for (; ; ) { ZipEntry ze = zis.getNextEntry(); @@ -217,10 +217,10 @@ public class ConvertLidarTile { } int rowLength; - if (fileSize > SRTM3_FILE_SIZE) { - rowLength = SRTM1_ROW_LENGTH; + if (fileSize > HGT_3ASEC_FILE_SIZE) { + rowLength = HGT_1ASEC_ROWS; } else { - rowLength = SRTM3_ROW_LENGTH; + rowLength = HGT_3ASEC_ROWS; } // stay at 1 deg * 1 deg raster @@ -239,7 +239,7 @@ public class ConvertLidarTile { raster.ncols = NCOLS; raster.halfcol = false; // assume full resolution raster.noDataValue = NODATA; - raster.cellsize = 1. / (double) (rowLength - SRTM_BORDER_OVERLAP); + raster.cellsize = 1. / (double) (rowLength - HGT_BORDER_OVERLAP); raster.xllcorner = (int) (lon < 0 ? lon - 1 : lon); //onDegreeStart - raster.cellsize; raster.yllcorner = (int) (lat < 0 ? lat - 1 : lat); //latDegreeStart - raster.cellsize; raster.eval_array = imagePixels; From 2b8270f07558dbdb3e43fc9982ee3c703bf8197f Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Tue, 16 May 2023 08:01:31 +0200 Subject: [PATCH 10/14] Update bundle & bundler --- docs/Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 8d15574..e50be30 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -86,7 +86,7 @@ GEM activesupport (>= 2) nokogiri (>= 1.4) http_parser.rb (0.8.0) - i18n (1.12.0) + i18n (1.13.0) concurrent-ruby (~> 1.0) jekyll (3.9.3) addressable (~> 2.4) @@ -210,7 +210,7 @@ GEM jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) minitest (5.18.0) - nokogiri (1.14.3-x86_64-linux) + nokogiri (1.15.0-x86_64-linux) racc (~> 1.4) octokit (4.25.1) faraday (>= 1, < 3) @@ -258,4 +258,4 @@ DEPENDENCIES wdm (~> 0.1.1) BUNDLED WITH - 2.2.32 + 2.4.12 From 78f33ee4791e567d66c8e5de15e049358a95876e Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Sat, 9 Oct 2021 08:05:52 +0200 Subject: [PATCH 11/14] Use pbfparser instead of XML parser in map-creator --- brouter-map-creator/build.gradle | 5 +- .../btools/mapcreator}/BPbfBlobDecoder.java | 20 +- .../btools/mapcreator}/BPbfFieldDecoder.java | 0 .../java/btools/mapcreator/OsmParser.java | 241 +++++++----------- .../btools/mapcreator/MapcreatorTest.java | 2 + misc/pbfparser/OsmParser.java | 136 ---------- 6 files changed, 108 insertions(+), 296 deletions(-) rename {misc/pbfparser => brouter-map-creator/src/main/java/btools/mapcreator}/BPbfBlobDecoder.java (96%) rename {misc/pbfparser => brouter-map-creator/src/main/java/btools/mapcreator}/BPbfFieldDecoder.java (100%) delete mode 100644 misc/pbfparser/OsmParser.java diff --git a/brouter-map-creator/build.gradle b/brouter-map-creator/build.gradle index 609bb50..7c48259 100644 --- a/brouter-map-creator/build.gradle +++ b/brouter-map-creator/build.gradle @@ -2,11 +2,12 @@ plugins { id 'java-library' } - dependencies { implementation project(':brouter-codec') implementation project(':brouter-util') implementation project(':brouter-expressions') - + + implementation group: 'org.openstreetmap.osmosis', name: 'osmosis-osm-binary', version: '0.48.3' + testImplementation('junit:junit:4.13.1') } diff --git a/misc/pbfparser/BPbfBlobDecoder.java b/brouter-map-creator/src/main/java/btools/mapcreator/BPbfBlobDecoder.java similarity index 96% rename from misc/pbfparser/BPbfBlobDecoder.java rename to brouter-map-creator/src/main/java/btools/mapcreator/BPbfBlobDecoder.java index 9ada4f5..bf26671 100644 --- a/misc/pbfparser/BPbfBlobDecoder.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/BPbfBlobDecoder.java @@ -5,14 +5,18 @@ import com.google.protobuf.InvalidProtocolBufferException; import org.openstreetmap.osmosis.osmbinary.Fileformat; import org.openstreetmap.osmosis.osmbinary.Osmformat; -import btools.util.LongList; - import java.io.IOException; -import java.util.*; -import java.util.logging.Level; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.zip.DataFormatException; import java.util.zip.Inflater; +import btools.util.LongList; + /** * Converts PBF block data into decoded entities ready to be passed into an Osmosis pipeline. This * class is designed to be passed into a pool of worker threads to allow multi-threaded decoding. @@ -82,8 +86,8 @@ public class BPbfBlobDecoder { // Build the list of active and unsupported features in the file. List supportedFeatures = Arrays.asList("OsmSchema-V0.6", "DenseNodes"); - List activeFeatures = new ArrayList(); - List unsupportedFeatures = new ArrayList(); + List activeFeatures = new ArrayList<>(); + List unsupportedFeatures = new ArrayList<>(); for (String feature : header.getRequiredFeaturesList()) { if (supportedFeatures.contains(feature)) { activeFeatures.add(feature); @@ -106,7 +110,7 @@ public class BPbfBlobDecoder { Iterator keyIterator = keys.iterator(); Iterator valueIterator = values.iterator(); if (keyIterator.hasNext()) { - Map tags = new HashMap(); + Map tags = new HashMap<>(); while (keyIterator.hasNext()) { String key = fieldDecoder.decodeString(keyIterator.next()); String value = fieldDecoder.decodeString(valueIterator.next()); @@ -155,7 +159,7 @@ public class BPbfBlobDecoder { int valueIndex = keysValuesIterator.next(); if (tags == null) { - tags = new HashMap(); + tags = new HashMap<>(); } tags.put(fieldDecoder.decodeString(keyIndex), fieldDecoder.decodeString(valueIndex)); diff --git a/misc/pbfparser/BPbfFieldDecoder.java b/brouter-map-creator/src/main/java/btools/mapcreator/BPbfFieldDecoder.java similarity index 100% rename from misc/pbfparser/BPbfFieldDecoder.java rename to brouter-map-creator/src/main/java/btools/mapcreator/BPbfFieldDecoder.java diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/OsmParser.java b/brouter-map-creator/src/main/java/btools/mapcreator/OsmParser.java index 9539a51..3fde438 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/OsmParser.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/OsmParser.java @@ -1,10 +1,17 @@ package btools.mapcreator; +import org.openstreetmap.osmosis.osmbinary.Fileformat; + +import java.io.BufferedInputStream; import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.EOFException; import java.io.File; import java.io.FileInputStream; -import java.io.InputStreamReader; -import java.util.zip.GZIPInputStream; +import java.util.HashMap; +import java.util.Map; + +import btools.util.LongList; /** * Parser for OSM data @@ -22,179 +29,113 @@ public class OsmParser extends MapCreatorBase { NodeListener nListener, WayListener wListener, RelationListener rListener) throws Exception { - this.nListener = nListener; this.wListener = wListener; this.rListener = rListener; - if (mapFile == null) { - _br = new BufferedReader(new InputStreamReader(System.in)); - } else { - if (mapFile.getName().endsWith(".gz")) { - _br = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(mapFile)))); - } else { - _br = new BufferedReader(new InputStreamReader(new FileInputStream(mapFile))); - } + System.out.println("*** PBF Parsing: " + mapFile); + + // once more for testing + int rawBlobCount = 0; + + long bytesRead = 0L; + + // wait for file to become available + while (!mapFile.exists()) { + System.out.println("--- waiting for " + mapFile + " to become available"); + Thread.sleep(10000); } + long currentSize = mapFile.length(); + long currentSizeTime = System.currentTimeMillis(); + + DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(mapFile))); + + for (; ; ) { - String line = _br.readLine(); - if (line == null) break; - - if (checkNode(line)) continue; - if (checkWay(line)) continue; - if (checkRelation(line)) continue; - if (checkChangeset(line)) continue; - } - - if (mapFile != null) { - _br.close(); - } - } - - - private boolean checkNode(String line) throws Exception { - int idx0 = line.indexOf("")) { - // read additional tags - for (; ; ) { - String l2 = _br.readLine(); - if (l2 == null) return false; - - int i2; - if ((i2 = l2.indexOf("= 0) { // property-tag - i2 += 8; - int ri2 = l2.indexOf('"', i2); - String key = l2.substring(i2, ri2); - i2 = l2.indexOf(" v=\"", ri2); - if (i2 >= 0) { - i2 += 4; - int ri3 = l2.indexOf('"', i2); - String value = l2.substring(i2, ri3); - - n.putTag(key, value); - } - } else if (l2.indexOf("") >= 0) { // end-tag + // continue reading if either more then a 100 MB unread, or the current-size is known for more then 2 Minutes + while (currentSize - bytesRead < 100000000L) { + long newSize = mapFile.length(); + if (newSize != currentSize) { + currentSize = newSize; + currentSizeTime = System.currentTimeMillis(); + } else if (System.currentTimeMillis() - currentSizeTime > 120000) { break; } - } - } - nListener.nextNode(n); - return true; - } - - - private boolean checkWay(String line) throws Exception { - int idx0 = line.indexOf("= 0) { // node reference - i2 += 9; - int ri2 = l2.indexOf('"', i2); - long nid = Long.parseLong(l2.substring(i2, ri2)); - w.nodes.add(nid); - } else if ((i2 = l2.indexOf("= 0) { // property-tag - i2 += 8; - int ri2 = l2.indexOf('"', i2); - String key = l2.substring(i2, ri2); - i2 = l2.indexOf(" v=\"", ri2); - if (i2 >= 0) { - i2 += 4; - int ri3 = l2.indexOf('"', i2); - String value = l2.substring(i2, ri3); - w.putTag(key, value); + if (currentSize - bytesRead < 100000000L) { + System.out.println("--- waiting for more data, currentSize=" + currentSize + " bytesRead=" + bytesRead); + Thread.sleep(10000); } - } else if (l2.indexOf("") >= 0) { // end-tag + } + + int headerLength; + try { + headerLength = dis.readInt(); + bytesRead += 4; + } catch (EOFException e) { break; } + + byte[] headerBuffer = new byte[headerLength]; + dis.readFully(headerBuffer); + bytesRead += headerLength; + Fileformat.BlobHeader blobHeader = Fileformat.BlobHeader.parseFrom(headerBuffer); + + byte[] blobData = new byte[blobHeader.getDatasize()]; + dis.readFully(blobData); + bytesRead += blobData.length; + + new BPbfBlobDecoder(blobHeader.getType(), blobData, this).process(); + + rawBlobCount++; } - wListener.nextWay(w); - return true; + dis.close(); + System.out.println("read raw blobs: " + rawBlobCount); } - private boolean checkChangeset(String line) throws Exception { - int idx0 = line.indexOf("")) { - int loopcheck = 0; - for (; ; ) { - String l2 = _br.readLine(); - if (l2.indexOf("") >= 0 || ++loopcheck > 10000) break; - } + public void addNode(long nid, Map tags, double lat, double lon) { + NodeData n = new NodeData(nid, lon, lat); + n.setTags((HashMap) tags); + try { + nListener.nextNode(n); + } catch (Exception e) { + throw new RuntimeException("error writing node: " + e); } - return true; } - private boolean checkRelation(String line) throws Exception { - int idx0 = line.indexOf(" tags, LongList nodes) { + WayData w = new WayData(wid, nodes); + w.setTags((HashMap) tags); - idx0 += 14; - int idx1 = line.indexOf('"', idx0); - long rid = Long.parseLong(line.substring(idx0, idx1)); + try { + wListener.nextWay(w); + } catch (Exception e) { + throw new RuntimeException("error writing way: " + e); + } + } - RelationData r = new RelationData(rid); + public void addRelation(long rid, Map tags, LongList wayIds, LongList fromWid, LongList toWid, LongList viaNid) { + RelationData r = new RelationData(rid, wayIds); + r.setTags((HashMap) tags); - // read the nodes - for (; ; ) { - String l2 = _br.readLine(); - if (l2 == null) return false; - - int i2; - if ((i2 = l2.indexOf("= 0) { // node reference - i2 += 24; - int ri2 = l2.indexOf('"', i2); - long wid = Long.parseLong(l2.substring(i2, ri2)); - r.ways.add(wid); - } else if ((i2 = l2.indexOf("= 0) { // property-tag - i2 += 8; - int ri2 = l2.indexOf('"', i2); - String key = l2.substring(i2, ri2); - i2 = l2.indexOf(" v=\"", ri2); - if (i2 >= 0) { - i2 += 4; - int ri3 = l2.indexOf('"', i2); - String value = l2.substring(i2, ri3); - r.putTag(key, value); + try { + rListener.nextRelation(r); + if (fromWid == null || toWid == null || viaNid == null || viaNid.size() != 1) { + // dummy-TR for each viaNid + for (int vi = 0; vi < (viaNid == null ? 0 : viaNid.size()); vi++) { + rListener.nextRestriction(r, 0L, 0L, viaNid.get(vi)); } - } else if (l2.indexOf("") >= 0) { // end-tag - break; + return; } + for (int fi = 0; fi < fromWid.size(); fi++) { + for (int ti = 0; ti < toWid.size(); ti++) { + rListener.nextRestriction(r, fromWid.get(fi), toWid.get(ti), viaNid.get(0)); + } + } + } catch (Exception e) { + throw new RuntimeException("error writing relation", e); } - rListener.nextRelation(r); - return true; } } diff --git a/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java b/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java index 5daae74..82348e4 100644 --- a/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java +++ b/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java @@ -1,12 +1,14 @@ package btools.mapcreator; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import java.io.File; import java.net.URL; public class MapcreatorTest { + @Ignore("Fails with PBF parser") @Test public void mapcreatorTest() throws Exception { URL mapurl = this.getClass().getResource("/dreieich.osm.gz"); diff --git a/misc/pbfparser/OsmParser.java b/misc/pbfparser/OsmParser.java deleted file mode 100644 index ce5f8a4..0000000 --- a/misc/pbfparser/OsmParser.java +++ /dev/null @@ -1,136 +0,0 @@ -package btools.mapcreator; - -import java.io.*; -import java.util.*; -import java.util.zip.*; - -import btools.util.*; - -import org.openstreetmap.osmosis.osmbinary.Fileformat; - -/** - * Parser for OSM data - * - * @author ab - */ -public class OsmParser extends MapCreatorBase { - private BufferedReader _br; - - private NodeListener nListener; - private WayListener wListener; - private RelationListener rListener; - - public void readMap(File mapFile, - NodeListener nListener, - WayListener wListener, - RelationListener rListener) throws Exception { - this.nListener = nListener; - this.wListener = wListener; - this.rListener = rListener; - - System.out.println("*** PBF Parsing: " + mapFile); - - // once more for testing - int rawBlobCount = 0; - - long bytesRead = 0L; - - // wait for file to become available - while (!mapFile.exists()) { - System.out.println("--- waiting for " + mapFile + " to become available"); - Thread.sleep(10000); - } - - long currentSize = mapFile.length(); - long currentSizeTime = System.currentTimeMillis(); - - DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(mapFile))); - - - for (; ; ) { - // continue reading if either more then a 100 MB unread, or the current-size is known for more then 2 Minutes - while (currentSize - bytesRead < 100000000L) { - long newSize = mapFile.length(); - if (newSize != currentSize) { - currentSize = newSize; - currentSizeTime = System.currentTimeMillis(); - } else if (System.currentTimeMillis() - currentSizeTime > 120000) { - break; - } - if (currentSize - bytesRead < 100000000L) { - System.out.println("--- waiting for more data, currentSize=" + currentSize + " bytesRead=" + bytesRead); - Thread.sleep(10000); - } - } - - int headerLength; - try { - headerLength = dis.readInt(); - bytesRead += 4; - } catch (EOFException e) { - break; - } - - byte[] headerBuffer = new byte[headerLength]; - dis.readFully(headerBuffer); - bytesRead += headerLength; - Fileformat.BlobHeader blobHeader = Fileformat.BlobHeader.parseFrom(headerBuffer); - - byte[] blobData = new byte[blobHeader.getDatasize()]; - dis.readFully(blobData); - bytesRead += blobData.length; - - new BPbfBlobDecoder(blobHeader.getType(), blobData, this).process(); - - rawBlobCount++; - } - dis.close(); - System.out.println("read raw blobs: " + rawBlobCount); - } - - - public void addNode(long nid, Map tags, double lat, double lon) { - NodeData n = new NodeData(nid, lon, lat); - n.setTags(tags); - try { - nListener.nextNode(n); - } catch (Exception e) { - throw new RuntimeException("error writing node: " + e); - } - } - - public void addWay(long wid, Map tags, LongList nodes) { - WayData w = new WayData(wid, nodes); - w.setTags((HashMap) tags); - - try { - wListener.nextWay(w); - } catch (Exception e) { - throw new RuntimeException("error writing way: " + e); - } - } - - public void addRelation(long rid, Map tags, LongList wayIds, LongList fromWid, LongList toWid, LongList viaNid) { - RelationData r = new RelationData(rid, wayIds); - r.setTags((HashMap) tags); - - try { - rListener.nextRelation(r); - if (fromWid == null || toWid == null || viaNid == null || viaNid.size() != 1) { - // dummy-TR for each viaNid - for (int vi = 0; vi < (viaNid == null ? 0 : viaNid.size()); vi++) { - rListener.nextRestriction(r, 0L, 0L, viaNid.get(vi)); - } - return; - } - for (int fi = 0; fi < fromWid.size(); fi++) { - for (int ti = 0; ti < toWid.size(); ti++) { - rListener.nextRestriction(r, fromWid.get(fi), toWid.get(ti), viaNid.get(0)); - } - } - } catch (Exception e) { - throw new RuntimeException("error writing relation", e); - } - } - -} From 93c2d676d0dd9f9b6bd92312ab43af96279d12a6 Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Sat, 9 Oct 2021 08:07:07 +0200 Subject: [PATCH 12/14] Convert testfile to pbf --- .../java/btools/mapcreator/MapcreatorTest.java | 4 ++-- .../src/test/resources/dreieich.pbf | Bin 0 -> 283576 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 brouter-map-creator/src/test/resources/dreieich.pbf diff --git a/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java b/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java index 82348e4..d44d6e1 100644 --- a/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java +++ b/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java @@ -11,8 +11,8 @@ public class MapcreatorTest { @Ignore("Fails with PBF parser") @Test public void mapcreatorTest() throws Exception { - URL mapurl = this.getClass().getResource("/dreieich.osm.gz"); - Assert.assertNotNull("test-osm-map dreieich.osm not found", mapurl); + URL mapurl = this.getClass().getResource("/dreieich.pbf"); + Assert.assertNotNull("test-osm-map dreieich.pbf not found", mapurl); File mapFile = new File(mapurl.getFile()); File workingDir = mapFile.getParentFile(); File profileDir = new File(workingDir, "/../../../../misc/profiles2"); diff --git a/brouter-map-creator/src/test/resources/dreieich.pbf b/brouter-map-creator/src/test/resources/dreieich.pbf new file mode 100644 index 0000000000000000000000000000000000000000..0fe39277c6a3de88e9fa0d988e6fcfc5accf5ac0 GIT binary patch literal 283576 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%0DSar5#I3O7U9`c8zxT>(5AMBs< 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

3!f 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

    Rb~>M}w`gW@Ws=iS6Xj;_q)?DCE6a> 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

    kz4a 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 By!?xj2(Jd$RP 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

    yF9>G)+9ZcGu%f4gi{uITM(qhbZ` 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 literal 0 HcmV?d00001 From c058cc57eff7855489bb87164895c3280d562ee2 Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Fri, 19 Aug 2022 06:50:18 +0200 Subject: [PATCH 13/14] Configurable map polling --- .../java/btools/mapcreator/OsmParser.java | 37 +++++++++++-------- .../btools/mapcreator/MapcreatorTest.java | 4 +- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/OsmParser.java b/brouter-map-creator/src/main/java/btools/mapcreator/OsmParser.java index 3fde438..f188031 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/OsmParser.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/OsmParser.java @@ -39,11 +39,14 @@ public class OsmParser extends MapCreatorBase { int rawBlobCount = 0; long bytesRead = 0L; + Boolean avoidMapPolling = Boolean.getBoolean("avoidMapPolling"); - // wait for file to become available - while (!mapFile.exists()) { - System.out.println("--- waiting for " + mapFile + " to become available"); - Thread.sleep(10000); + if (!avoidMapPolling) { + // wait for file to become available + while (!mapFile.exists()) { + System.out.println("--- waiting for " + mapFile + " to become available"); + Thread.sleep(10000); + } } long currentSize = mapFile.length(); @@ -53,18 +56,20 @@ public class OsmParser extends MapCreatorBase { for (; ; ) { - // continue reading if either more then a 100 MB unread, or the current-size is known for more then 2 Minutes - while (currentSize - bytesRead < 100000000L) { - long newSize = mapFile.length(); - if (newSize != currentSize) { - currentSize = newSize; - currentSizeTime = System.currentTimeMillis(); - } else if (System.currentTimeMillis() - currentSizeTime > 120000) { - break; - } - if (currentSize - bytesRead < 100000000L) { - System.out.println("--- waiting for more data, currentSize=" + currentSize + " bytesRead=" + bytesRead); - Thread.sleep(10000); + if (!avoidMapPolling) { + // continue reading if either more then a 100 MB unread, or the current-size is known for more than 2 Minutes + while (currentSize - bytesRead < 100000000L) { + long newSize = mapFile.length(); + if (newSize != currentSize) { + currentSize = newSize; + currentSizeTime = System.currentTimeMillis(); + } else if (System.currentTimeMillis() - currentSizeTime > 120000) { + break; + } + if (currentSize - bytesRead < 100000000L) { + System.out.println("--- waiting for more data, currentSize=" + currentSize + " bytesRead=" + bytesRead); + Thread.sleep(10000); + } } } diff --git a/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java b/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java index d44d6e1..562d4d2 100644 --- a/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java +++ b/brouter-map-creator/src/test/java/btools/mapcreator/MapcreatorTest.java @@ -1,16 +1,16 @@ package btools.mapcreator; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import java.io.File; import java.net.URL; public class MapcreatorTest { - @Ignore("Fails with PBF parser") @Test public void mapcreatorTest() throws Exception { + System.setProperty("avoidMapPolling", "true"); + URL mapurl = this.getClass().getResource("/dreieich.pbf"); Assert.assertNotNull("test-osm-map dreieich.pbf not found", mapurl); File mapFile = new File(mapurl.getFile()); From c0245df07b79bc191b8c439898316b21c9aee0d5 Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Wed, 17 May 2023 20:04:56 +0200 Subject: [PATCH 14/14] Adapt scripts & documentation --- docs/developers/build_segments.md | 37 ------------------- misc/pbfparser/.gitignore | 3 -- misc/pbfparser/README.txt | 23 ------------ misc/pbfparser/compile_parser.bat | 1 - .../scripts/mapcreation/process_pbf_planet.sh | 7 +--- .../process_pbf_planet_production.sh | 2 +- 6 files changed, 3 insertions(+), 70 deletions(-) delete mode 100644 misc/pbfparser/.gitignore delete mode 100644 misc/pbfparser/README.txt delete mode 100644 misc/pbfparser/compile_parser.bat diff --git a/docs/developers/build_segments.md b/docs/developers/build_segments.md index 604d8eb..513fab5 100644 --- a/docs/developers/build_segments.md +++ b/docs/developers/build_segments.md @@ -13,43 +13,6 @@ also build them yourself from an OSM dump (e.g. planet or [GeoFabrik extract](https://download.geofabrik.de/)) -## Build the pbfparser - -First, there are two file formats available to download OSM data: `bzip`-ed -XML files (very large) and `.pbf` -([Protobuf](https://github.com/protocolbuffers/protobuf) format) which is much -more efficient. If you want to use the latter one, you will have to build the -`pbfparser` (located in `misc/pbfparser` first): - -* Download [the latest - version](https://github.com/openstreetmap/osmosis/releases) - of [Osmosis](https://wiki.openstreetmap.org/wiki/Osmosis) and unzip it - somewhere. -* Copy the `lib/default/protobuf-java-*.jar` and - `lib/default/osmosis-osm-binary-*.jar` files from the unzipped Osmosis - archive to `misc/pbfparser/protobuf.jar` and `misc/pbfparser/osmosis.jar`. -* Build BRouter and copy - `brouter-server/build/libs/brouter-*-all.jar` to - `misc/pbfparser/brouter.jar`. -* You can build the `pbfparser` using, in the `misc/pbfparser/` - folder, - -``` -javac -d . -cp "brouter.jar:protobuf.jar:osmosis.jar" *.java -``` - -* Finally, you can build a `jar` file from these files using - -``` -jar cf pbfparser.jar btools/**/*.class -``` - -_Note:_ If the `jar` file is not properly created, everything else will seem -to work normally but there will not be any data extracted from the OSM data -dump. You can check what is actually inside the built `jar` file using -`jar tf pbfparser.jar`. - - ## Run the map creation script If you want to have elevation information in the generated segments files, you diff --git a/misc/pbfparser/.gitignore b/misc/pbfparser/.gitignore deleted file mode 100644 index 4dd82da..0000000 --- a/misc/pbfparser/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.jar -*.BAK -btools/ diff --git a/misc/pbfparser/README.txt b/misc/pbfparser/README.txt deleted file mode 100644 index b43e019..0000000 --- a/misc/pbfparser/README.txt +++ /dev/null @@ -1,23 +0,0 @@ -The pbf-parse is not included in the regular source tree -to avoid the library dependencies to "osmosis" and "protobuf" - -In order to run the mapcreator from a pbf-file (as it is -done in the process_pbf_planet.sh script included in -the git-repo), you have to build yourself the "pbfparser.jar" -by doing the following: - --> get osmosis from https://bretth.dev.openstreetmap.org/osmosis-build/osmosis-latest.zip --> copy lib/default/osmosis-osm-binary-*.jar in the archive to osmosis.jar in -this folder --> copy lib/default/protobuf-java-*.jar in the archive to protobuf.jar in this -folder --> copy the brouter-server/build/libs/brouter-...-all.jar to -brouter.jar in this folder --> compile the PBF-Parser using: - javac -d . -cp protobuf.jar:osmosis.jar:brouter.jar *.java --> pack all the compiled class files together in a jar -"pbfparser.jar" with "jar cf pbfparser.jar btools/**/*.class" - -Alternatively, just for testing you can run the Mapcreator against a *xml.bz2 Database-Extract, -then you don't need the pbf-parser. However, the XML-Parser does not (yet) parse -Turn-Restrictions, so really just for testing... diff --git a/misc/pbfparser/compile_parser.bat b/misc/pbfparser/compile_parser.bat deleted file mode 100644 index 7a5452b..0000000 --- a/misc/pbfparser/compile_parser.bat +++ /dev/null @@ -1 +0,0 @@ -javac -d . -cp pbfparser.jar;brouter.jar BPbfFieldDecoder.java BPbfBlobDecoder.java OsmParser.java diff --git a/misc/scripts/mapcreation/process_pbf_planet.sh b/misc/scripts/mapcreation/process_pbf_planet.sh index 2ad173d..d3b190e 100755 --- a/misc/scripts/mapcreation/process_pbf_planet.sh +++ b/misc/scripts/mapcreation/process_pbf_planet.sh @@ -24,14 +24,11 @@ touch lastmaprun.date rm -rf /var/www/brouter/segments4_lastrun -JAVA='/java/bin/java -Xmx2600m -Xms2600m -Xmn32m' +JAVA='java -Xmx2600m -Xms2600m -Xmn32m' BROUTER_PROFILES=$(realpath "../../profiles2") BROUTER_JAR=$(realpath $(ls ../../../brouter-server/build/libs/brouter-*-all.jar)) -OSMOSIS_JAR=$(realpath "../../pbfparser/osmosis.jar") -PROTOBUF_JAR=$(realpath "../../pbfparser/protobuf.jar") -PBFPARSER_JAR=$(realpath "../../pbfparser/pbfparser.jar") PLANET_FILE=${PLANET_FILE:-$(realpath "./planet-latest.osm.pbf")} # Download SRTM zip files from @@ -43,7 +40,7 @@ SRTM_PATH="/private-backup/srtm" mkdir tmp cd tmp mkdir nodetiles -${JAVA} -cp "${OSMOSIS_JAR}:${PROTOBUF_JAR}:${PBFPARSER_JAR}:${BROUTER_JAR}" btools.mapcreator.OsmCutter ${BROUTER_PROFILES}/lookups.dat nodetiles ways.dat relations.dat restrictions.dat ${BROUTER_PROFILES}/all.brf ${PLANET_FILE} +${JAVA} -cp ${BROUTER_JAR} -DavoidMapPolling=true btools.mapcreator.OsmCutter ${BROUTER_PROFILES}/lookups.dat nodetiles ways.dat relations.dat restrictions.dat ${BROUTER_PROFILES}/all.brf ${PLANET_FILE} mkdir ftiles ${JAVA} -cp ${BROUTER_JAR} -Ddeletetmpfiles=true -DuseDenseMaps=true btools.mapcreator.NodeFilter nodetiles ways.dat ftiles diff --git a/misc/scripts/mapcreation/process_pbf_planet_production.sh b/misc/scripts/mapcreation/process_pbf_planet_production.sh index 4da46f6..f9a6deb 100644 --- a/misc/scripts/mapcreation/process_pbf_planet_production.sh +++ b/misc/scripts/mapcreation/process_pbf_planet_production.sh @@ -15,7 +15,7 @@ mkdir waytiles mkdir waytiles55 mkdir nodes55 -../../jdk8/bin/java -Xmx6144M -Xms6144M -Xmn256M -cp ../pbfparser.jar:../brouter_fc.jar -Ddeletetmpfiles=true -DuseDenseMaps=true btools.util.StackSampler btools.mapcreator.OsmFastCutter ../lookups.dat nodetiles waytiles nodes55 waytiles55 bordernids.dat relations.dat restrictions.dat ../all.brf ../trekking.brf ../softaccess.brf ../planet-new.osm.pbf +../../jdk8/bin/java -Xmx6144M -Xms6144M -Xmn256M -cp ../brouter_fc.jar -Ddeletetmpfiles=true -DuseDenseMaps=true btools.util.StackSampler btools.mapcreator.OsmFastCutter ../lookups.dat nodetiles waytiles nodes55 waytiles55 bordernids.dat relations.dat restrictions.dat ../all.brf ../trekking.brf ../softaccess.brf ../planet-new.osm.pbf mv ../planet-latest.osm.pbf ../planet-old.osm.pbf mv ../planet-new.osm.pbf ../planet-latest.osm.pbf