157 lines
4.9 KiB
Java
157 lines
4.9 KiB
Java
/*
|
|
* Copyright 2013 Hannes Janetzek
|
|
*
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
package org.oscim.gdx.client;
|
|
|
|
import org.oscim.backend.CanvasAdapter;
|
|
import org.oscim.backend.GL20;
|
|
import org.oscim.backend.GLAdapter;
|
|
import org.oscim.core.MapPosition;
|
|
import org.oscim.core.MercatorProjection;
|
|
import org.oscim.gdx.GdxMap;
|
|
import org.oscim.layers.tile.BitmapTileLayer;
|
|
import org.oscim.renderer.MapRenderer;
|
|
import org.oscim.tiling.TileSource;
|
|
import org.oscim.tiling.source.bitmap.DefaultSources.NaturalEarth;
|
|
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import com.badlogic.gdx.Gdx;
|
|
import com.badlogic.gdx.backends.gwt.GwtApplication;
|
|
import com.google.gwt.user.client.Timer;
|
|
import com.google.gwt.user.client.Window;
|
|
|
|
class GwtGdxMap extends GdxMap {
|
|
static final Logger log = LoggerFactory.getLogger(GwtGdxMap.class);
|
|
|
|
SearchBox mSearchBox;
|
|
|
|
@Override
|
|
public void create() {
|
|
MapConfig c = MapConfig.get();
|
|
|
|
// stroke text takes about 70% cpu time in firefox:
|
|
// https://bug568526.bugzilla.mozilla.org/attachment.cgi?id=447932
|
|
// <- circle/stroke test 800ms firefox, 80ms chromium..
|
|
// TODO use texture atlas to avoid drawing text-textures
|
|
if (GwtApplication.agentInfo().isLinux() && GwtApplication.agentInfo().isFirefox())
|
|
GwtCanvasAdapter.NO_STROKE_TEXT = true;
|
|
|
|
CanvasAdapter.g = GwtCanvasAdapter.INSTANCE;
|
|
CanvasAdapter.textScale = 0.7f;
|
|
GLAdapter.g = (GL20) Gdx.graphics.getGL20();
|
|
GLAdapter.GDX_WEBGL_QUIRKS = true;
|
|
MapRenderer.setBackgroundColor(0xffffff);
|
|
//Gdx.app.setLogLevel(Application.LOG_DEBUG);
|
|
|
|
super.create();
|
|
|
|
double lat = c.getLatitude();
|
|
double lon = c.getLongitude();
|
|
int zoom = c.getZoom();
|
|
|
|
float tilt = 0;
|
|
float rotation = 0;
|
|
|
|
if (Window.Location.getHash() != null) {
|
|
String hash = Window.Location.getHash();
|
|
|
|
hash = hash.substring(1);
|
|
String[] pairs = hash.split(",");
|
|
|
|
for (String p : pairs) {
|
|
try {
|
|
if (p.startsWith("lat="))
|
|
lat = Double.parseDouble(p.substring(4));
|
|
else if (p.startsWith("lon="))
|
|
lon = Double.parseDouble(p.substring(4));
|
|
else if (p.startsWith("scale="))
|
|
zoom = Integer.parseInt(p.substring(6));
|
|
else if (p.startsWith("rot="))
|
|
rotation = Float.parseFloat(p.substring(4));
|
|
else if (p.startsWith("tilt="))
|
|
tilt = Float.parseFloat(p.substring(5));
|
|
} catch (NumberFormatException e) {
|
|
|
|
}
|
|
}
|
|
}
|
|
MapPosition p = new MapPosition();
|
|
p.setZoomLevel(zoom);
|
|
p.setPosition(lat, lon);
|
|
log.debug("map position: " + p.x + "/" + p.y + " " + lat + "/" + lon);
|
|
|
|
p.bearing = rotation;
|
|
p.tilt = tilt;
|
|
mMap.setMapPosition(p);
|
|
|
|
//mMap.getViewport().setTilt(tilt);
|
|
//mMap.getViewport().setRotation(rotation);
|
|
|
|
String url = c.getTileUrl();
|
|
String sourceName = c.getTileSource();
|
|
|
|
TileSource tileSource;
|
|
tileSource = new OSciMap4TileSource(url);
|
|
|
|
initDefaultLayers(tileSource, false, true, true);
|
|
|
|
if ("naturalearth".equals(c.getBackgroundLayer()))
|
|
mMap.setBackgroundMap(new BitmapTileLayer(mMap, new NaturalEarth()));
|
|
|
|
mSearchBox = new SearchBox(mMap);
|
|
|
|
// update URL hash to current position, every 5 seconds
|
|
Timer timer = new Timer() {
|
|
private int curLon, curLat, curZoom, curTilt, curRot;
|
|
private MapPosition pos = new MapPosition();
|
|
|
|
public void run() {
|
|
mMap.viewport().getMapPosition(pos);
|
|
int lat = (int) (MercatorProjection.toLatitude(pos.y) * 1000);
|
|
int lon = (int) (MercatorProjection.toLongitude(pos.x) * 1000);
|
|
int rot = (int) (pos.bearing);
|
|
rot = (int) (pos.bearing) % 360;
|
|
//rot = rot < 0 ? -rot : rot;
|
|
|
|
if (curZoom != pos.zoomLevel || curLat != lat || curLon != lon
|
|
|| curTilt != rot || curRot != (int) (pos.bearing)) {
|
|
|
|
curLat = lat;
|
|
curLon = lon;
|
|
curZoom = pos.zoomLevel;
|
|
curTilt = (int) pos.tilt;
|
|
curRot = rot;
|
|
|
|
String newURL = Window.Location
|
|
.createUrlBuilder()
|
|
.setHash("scale=" + pos.zoomLevel + ",rot=" + curRot
|
|
+ ",tilt=" + curTilt + ",lat=" + (curLat / 1000f)
|
|
+ ",lon=" + (curLon / 1000f))
|
|
.buildString();
|
|
Window.Location.replace(newURL);
|
|
}
|
|
}
|
|
};
|
|
timer.scheduleRepeating(5000);
|
|
}
|
|
|
|
@Override
|
|
protected void createLayers() {
|
|
}
|
|
}
|