/* * Copyright 2016-2019 devemux86 * Copyright 2018-2019 Gustl22 * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software * Foundation, either version 3 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with * this program. If not, see . */ package org.oscim.test; import org.oscim.core.MapPosition; import org.oscim.core.Tile; import org.oscim.event.Event; import org.oscim.gdx.GdxMapApp; import org.oscim.gdx.poi3d.Poi3DLayer; import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.buildings.S3DBLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.map.Map; import org.oscim.renderer.BitmapRenderer; import org.oscim.renderer.ExtrusionRenderer; import org.oscim.renderer.GLViewport; import org.oscim.scalebar.DefaultMapScaleBar; import org.oscim.scalebar.ImperialUnitAdapter; import org.oscim.scalebar.MapScaleBar; import org.oscim.scalebar.MapScaleBarLayer; import org.oscim.scalebar.MetricUnitAdapter; import org.oscim.theme.VtmThemes; import org.oscim.tiling.source.mapfile.MapFileTileSource; import org.oscim.tiling.source.mapfile.MapInfo; import java.io.File; import java.util.Calendar; public class MapsforgeTest extends GdxMapApp { private static final boolean SHADOWS = false; private File mapFile; private boolean poi3d; private boolean s3db; MapsforgeTest(File mapFile) { this(mapFile, false, false); } MapsforgeTest(File mapFile, boolean s3db, boolean poi3d) { this.mapFile = mapFile; this.s3db = s3db; this.poi3d = poi3d; } @Override public void createLayers() { MapFileTileSource tileSource = new MapFileTileSource(); tileSource.setMapFile(mapFile.getAbsolutePath()); //tileSource.setPreferredLanguage("en"); VectorTileLayer l = mMap.setBaseMap(tileSource); loadTheme(null); BuildingLayer buildingLayer = s3db ? new S3DBLayer(mMap, l, SHADOWS) : new BuildingLayer(mMap, l, false, SHADOWS); mMap.layers().add(buildingLayer); if (poi3d) mMap.layers().add(new Poi3DLayer(mMap, l)); mMap.layers().add(new LabelLayer(mMap, l)); DefaultMapScaleBar mapScaleBar = new DefaultMapScaleBar(mMap); mapScaleBar.setScaleBarMode(DefaultMapScaleBar.ScaleBarMode.BOTH); mapScaleBar.setDistanceUnitAdapter(MetricUnitAdapter.INSTANCE); mapScaleBar.setSecondaryDistanceUnitAdapter(ImperialUnitAdapter.INSTANCE); mapScaleBar.setScaleBarPosition(MapScaleBar.ScaleBarPosition.BOTTOM_LEFT); MapScaleBarLayer mapScaleBarLayer = new MapScaleBarLayer(mMap, mapScaleBar); BitmapRenderer renderer = mapScaleBarLayer.getRenderer(); renderer.setPosition(GLViewport.Position.BOTTOM_LEFT); renderer.setOffset(5, 0); mMap.layers().add(mapScaleBarLayer); MapPosition pos = MapPreferences.getMapPosition(); MapInfo info = tileSource.getMapInfo(); if (pos == null || !info.boundingBox.contains(pos.getGeoPoint())) { pos = new MapPosition(); pos.setByBoundingBox(info.boundingBox, Tile.SIZE * 4, Tile.SIZE * 4); } mMap.setMapPosition(pos); if (SHADOWS) { final ExtrusionRenderer extrusionRenderer = buildingLayer.getExtrusionRenderer(); mMap.events.bind(new Map.UpdateListener() { Calendar date = Calendar.getInstance(); long prevTime = System.currentTimeMillis(); @Override public void onMapEvent(Event e, MapPosition mapPosition) { long curTime = System.currentTimeMillis(); int diff = (int) (curTime - prevTime); prevTime = curTime; date.add(Calendar.MILLISECOND, diff * 60 * 60); // Every second equates to one hour //extrusionRenderer.getSun().setProgress((curTime % 2000) / 1000f); extrusionRenderer.getSun().setProgress(date.get(Calendar.HOUR_OF_DAY), date.get(Calendar.MINUTE), date.get(Calendar.SECOND)); extrusionRenderer.getSun().updatePosition(); extrusionRenderer.getSun().updateColor(); // only relevant for shadow implementation mMap.updateMap(true); } }); } } @Override public void dispose() { MapPreferences.saveMapPosition(mMap.getMapPosition()); super.dispose(); } static File getMapFile(String[] args) { if (args.length == 0) { throw new IllegalArgumentException("missing argument: "); } File file = new File(args[0]); if (!file.exists()) { throw new IllegalArgumentException("file does not exist: " + file); } else if (!file.isFile()) { throw new IllegalArgumentException("not a file: " + file); } else if (!file.canRead()) { throw new IllegalArgumentException("cannot read file: " + file); } return file; } protected void loadTheme(final String styleId) { mMap.setTheme(VtmThemes.DEFAULT); } public static void main(String[] args) { GdxMapApp.init(); GdxMapApp.run(new MapsforgeTest(getMapFile(args))); } }