/******************************************************************************* * 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.program.atlascreators; import java.awt.geom.Point2D; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import mobac.exceptions.MapCreationException; import mobac.mapsources.mapspace.MercatorPower2MapSpace; import mobac.program.annotations.AtlasCreatorName; import mobac.program.annotations.SupportedParameters; import mobac.program.atlascreators.impl.MapTileBuilder; import mobac.program.atlascreators.impl.MapTileWriter; import mobac.program.atlascreators.tileprovider.CacheTileProvider; import mobac.program.atlascreators.tileprovider.TileProvider; import mobac.program.interfaces.LayerInterface; import mobac.program.interfaces.MapInterface; import mobac.program.interfaces.MapSource; import mobac.program.interfaces.MapSpace; import mobac.program.interfaces.MapSpace.ProjectionCategory; import mobac.program.model.TileImageFormat; import mobac.program.model.TileImageParameters; import mobac.program.model.TileImageParameters.Name; import mobac.program.tiledatawriter.TileImagePngDataWriter; import mobac.utilities.Utilities; @AtlasCreatorName(value = "nfComPass") @SupportedParameters(names = { Name.height, Name.width }) public class NFComPass extends AtlasCreator { private File layerDir; private File mapDir; @Override public void initializeMap(MapInterface map, TileProvider mapTileProvider) { super.initializeMap(map, mapTileProvider); LayerInterface layer = map.getLayer(); layerDir = new File(atlasDir, layer.getName()); mapDir = new File(layerDir, map.getName()); if (parameters == null) { parameters = new TileImageParameters(64, 64, TileImageFormat.PNG); } } @Override public boolean testMapSource(MapSource mapSource) { MapSpace mapSpace = mapSource.getMapSpace(); return (mapSpace instanceof MercatorPower2MapSpace && ProjectionCategory.SPHERE.equals(mapSpace .getProjectionCategory())); } @Override public void initLayerCreation(LayerInterface layer) throws IOException { super.initLayerCreation(layer); if (layer.getMapCount() == 0) return; int lastZoom = layer.getMap(0).getZoom(); Writer w = new BufferedWriter(new FileWriter(new File(atlasDir, "nfComPass.dat"), true)); w.append("[" + layer.getName() + "]\r\n"); w.append("SIZEXY = extern\r\n"); w.append("MAPPATH =\r\n"); w.append("VMAX = 160\r\n"); w.append("WIDTH = 5\r\n"); w.append("LASTZOOM = " + lastZoom + "\r\n\r\n"); w.flush(); w.close(); } @Override public void createMap() throws MapCreationException, InterruptedException { try { Utilities.mkDirs(mapDir); } catch (IOException e) { throw new MapCreationException(map, e); } createKalFile(map); CacheTileProvider ctp = new CacheTileProvider(mapDlTileProvider); try { mapDlTileProvider = ctp; MapTileBuilder mapTileBuilder = new MapTileBuilder(this, new TileImagePngDataWriter(), new NFCompassTileWriter(), true); atlasProgress.initMapCreation(mapTileBuilder.getCustomTileCount()); mapTileBuilder.createTiles(); } finally { ctp.cleanup(); } } protected void createKalFile(MapInterface map) throws MapCreationException { Writer w = null; MapSpace mapSpace = map.getMapSource().getMapSpace(); //double longitudeMin = mapSpace.cXToLon(xMin * tileSize, zoom); //double longitudeMax = mapSpace.cXToLon((xMax + 1) * tileSize - 1, zoom); //double latitudeMin = mapSpace.cYToLat((yMax + 1) * tileSize - 1, zoom); //double latitudeMax = mapSpace.cYToLat(yMin * tileSize, zoom); Point2D.Double p1 = mapSpace.cXYToLonLat(xMin * tileSize, yMin * tileSize, zoom); Point2D.Double p2 = mapSpace.cXYToLonLat((xMax + 1) * tileSize - 1, (yMax + 1) * tileSize - 1, zoom); double longitudeMin = p1.x; double longitudeMax = p2.x; double latitudeMin = p2.y; double latitudeMax = p1.y; int width = (xMax - xMin + 1) * tileSize; int height = (yMax - yMin + 1) * tileSize; try { w = new BufferedWriter(new FileWriter(new File(mapDir, map.getName() + ".kal"), true)); w.append("[" + map.getName() + "]\r\n"); w.append(String.format("TILEXY = %dx%d\r\n", parameters.getWidth(), parameters.getHeight())); w.append("X0LON = " + longitudeMin + "\r\n"); w.append("Y0LAT = " + latitudeMax + "\r\n"); w.append("X1LON = " + longitudeMax + "\r\n"); w.append("Y1LAT = " + latitudeMin + "\r\n"); w.append(String.format("SIZEXY = %dx%d\r\n", width, height)); w.flush(); } catch (IOException e) { throw new MapCreationException(map, e); } finally { Utilities.closeWriter(w); } } public class NFCompassTileWriter implements MapTileWriter { int tileHeight = 256; int tileWidth = 256; int ff_x; int ff_y; public NFCompassTileWriter() { super(); if (parameters != null) { tileHeight = parameters.getHeight(); tileWidth = parameters.getWidth(); } int highest_bit_x = Utilities.getHighestBitSet(tileWidth) + 2; int highest_bit_y = Utilities.getHighestBitSet(tileHeight) + 2; ff_x = Integer.MAX_VALUE << (highest_bit_x); ff_y = Integer.MAX_VALUE << (highest_bit_y); } public void writeTile(int tilex, int tiley, String tileType, byte[] tileData) throws IOException { int x = tilex * tileWidth; int y = tiley * tileHeight; String folderName = String.format("%dx%d", (x & ff_x), (y & ff_y)); String tileFileName = String.format("%d_%d.png", x, y); File folder = new File(mapDir, folderName); Utilities.mkDir(folder); File f = new File(folder, tileFileName); FileOutputStream out = new FileOutputStream(f); try { out.write(tileData); } finally { Utilities.closeStream(out); } } public void finalizeMap() throws IOException { } } }