/******************************************************************************* * Copyright (c) MOBAC developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package mobac.utilities; import java.awt.Point; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; import mobac.gui.mapview.JMapViewer; import mobac.mapsources.mapspace.MercatorPower2MapSpace; import mobac.program.interfaces.MapSpace; public class MapDataFileParser { private static final String K = "[\\s ]*,[\\s ]*"; private static final String HEAD_REGEX = "^OziExplorer Map Data File Version (\\d\\.\\d)"; private static final String POINT_REGEX = "^Point(\\d\\d)@xy@(\\d+)@(\\d+)@in@deg@" + "(\\d+)@(\\d+(?:\\.\\d+)?)@(N|S)@(\\d+)@(\\d+(?:\\.\\d+)?)@(E|W)@grid@@@" + ".*"; private static final String MMPLL_REGEX = "^MMPLL,(\\d)@(\\d+\\.\\d+)@(\\d+\\.\\d+)"; public MapDataFileParser(File mapFile) throws IOException, MapFileFormatException { this(new FileInputStream(mapFile)); } public MapDataFileParser(InputStream in) throws IOException, MapFileFormatException { BufferedReader br = new BufferedReader(new InputStreamReader(in)); String line = br.readLine(); Matcher m = Pattern.compile(HEAD_REGEX).matcher(line); if (!m.matches()) throw new MapFileFormatException("OziExplorer Map Data File Version not found"); String fileVersion = m.group(1); line = br.readLine(); // System.out.println(POINT_REGEX.replace("@", K)); Pattern pointP = Pattern.compile(POINT_REGEX.replaceAll("\\@", K)); Pattern mmpllP = Pattern.compile(MMPLL_REGEX.replaceAll("\\@", K)); ArrayList<MapPoint> mapPoints = new ArrayList<MapPoint>(); while (line != null) { String cLine = line; line = br.readLine(); m = pointP.matcher(cLine); if (m.matches()) { MapPoint p = new MapPoint(); // p.num = Integer.parseInt(m.group(1)); p.x = Integer.parseInt(m.group(2)); p.y = Integer.parseInt(m.group(3)); double lat = Integer.parseInt(m.group(4)) + (Double.parseDouble(m.group(5)) / 60.0); if ("S".equalsIgnoreCase(m.group(6))) lat = -lat; p.lat = lat; double lon = Integer.parseInt(m.group(7)) + (Double.parseDouble(m.group(8)) / 60.0); if ("W".equalsIgnoreCase(m.group(9))) lon = -lon; p.lon = lon; mapPoints.add(p); // System.out.println(m.group(0)); continue; } m = mmpllP.matcher(cLine); if (m.matches()) { MapPoint p = new MapPoint(); p.lon = Double.parseDouble(m.group(2)); p.lat = Double.parseDouble(m.group(3)); mapPoints.add(p); } } System.out.println("File version: " + fileVersion); // System.out.println("Callibration / map border points:"); double lat_max = Double.MIN_VALUE; double lon_max = Double.MIN_VALUE; double lat_min = Double.MAX_VALUE; double lon_min = Double.MAX_VALUE; for (MapPoint p : mapPoints) { // System.out.println("\t" + p); lat_max = Math.max(lat_max, p.lat); lon_max = Math.max(lon_max, p.lon); lat_min = Math.min(lat_min, p.lat); lon_min = Math.min(lon_min, p.lon); } System.out.println(String.format("Max point (lat/lon): %4f %4f", lat_max, lon_max)); System.out.println(String.format("Min point (lat/lon): %4f %4f", lat_min, lon_min)); MapSpace ms = MercatorPower2MapSpace.INSTANCE_256; //int x1 = ms.cLonToX(lon_max, JMapViewer.MAX_ZOOM); //int x2 = ms.cLonToX(lon_min, JMapViewer.MAX_ZOOM); Point p1 = ms.cLonLatToXY(lon_max, lat_max, JMapViewer.MAX_ZOOM); Point p2 = ms.cLonLatToXY(lon_min, lat_min, JMapViewer.MAX_ZOOM); int x1 = p1.x; int x2 = p2.x; int diff = Math.abs(x1 - x2); for (int i = 1; i < 10; i++) { System.out.println((JMapViewer.MAX_ZOOM - i) + " : " + diff); diff /= 2; } br.close(); } public static class MapPoint { // int num; int x; int y; double lat; double lon; public String toString() { return String.format("%6f %6f", lat, lon); } } public static class MapFileFormatException extends Exception { private static final long serialVersionUID = 1L; public MapFileFormatException(String message, Throwable cause) { super(message, cause); } public MapFileFormatException(String message) { super(message); } } public static void main(String[] args) { try { File f = new File("atlases/Test_2009-10-01_164148/Test1/Test1 14/Test1 14.map"); MapDataFileParser p = new MapDataFileParser(f); System.out.println(p); } catch (Exception e) { e.printStackTrace(); } } }