*
* 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; version 2 of the License.
+ * 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
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_10;
+package org.altusmetrum.altoslib_13;
import java.io.*;
import java.net.*;
int status;
- public int status() {
+ private static File map_file(AltosLatLon center, int zoom, int maptype, int px_size, int scale) {
+ double lat = center.lat;
+ double lon = center.lon;
+ char chlat = lat < 0 ? 'S' : 'N';
+ char chlon = lon < 0 ? 'W' : 'E';
+
+ if (lat < 0) lat = -lat;
+ if (lon < 0) lon = -lon;
+ String maptype_string = String.format("%s-", AltosMap.maptype_names[maptype]);
+ String format_string;
+ if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain)
+ format_string = "jpg";
+ else
+ format_string = "png";
+ return new File(AltosPreferences.mapdir(),
+ String.format("map-%c%.6f,%c%.6f-%s%d%s.%s",
+ chlat, lat, chlon, lon, maptype_string, zoom, scale == 1 ? "" : String.format("-%d", scale), format_string));
+ }
+
+ public static String google_maps_api_key = null;
+
+ private static String google_map_url(AltosLatLon center, int zoom, int maptype, int px_size, int scale, String format_string) {
+ return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&scale=%d&sensor=false&maptype=%s&format=%s&key=%s",
+ center.lat, center.lon, zoom, px_size, px_size, scale,
+ AltosMap.maptype_names[maptype], format_string, google_maps_api_key);
+ }
+
+ private static String altos_map_url(AltosLatLon center, int zoom, int maptype, int px_size, int scale, String format_string) {
+ return String.format("https://maps.altusmetrum.org/altos-map?center=%.6f,%.6f&zoom=%d",
+ center.lat, center.lon, zoom);
+ }
+
+ private static String map_url(AltosLatLon center, int zoom, int maptype, int px_size, int scale) {
+ String format_string;
+
+ if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain)
+ format_string = "jpg";
+ else
+ format_string = "png32";
+
+ for (int s = 1; s < scale; s <<= 1)
+ zoom--;
+
+ px_size /= scale;
+
+ if (google_maps_api_key != null)
+ return google_map_url(center, zoom, maptype, px_size, scale, format_string);
+ else
+ return altos_map_url(center, zoom, maptype, px_size, scale, format_string);
+ }
+
+ public synchronized int status() {
return status;
}
static Object forbidden_lock = new Object();
static long forbidden_time;
static boolean forbidden_set;
+ public static int forbidden_response;
private int fetch_url() {
URL u;
synchronized (forbidden_lock) {
forbidden_time = System.nanoTime();
forbidden_set = true;
+ forbidden_response = response;
return AltosMapTile.forbidden;
}
}
int new_status;
- if (!AltosVersion.has_google_maps_api_key()) {
- synchronized (fetch_lock) {
- long startTime = System.nanoTime();
- new_status = fetch_url();
- if (new_status == AltosMapTile.fetched) {
- long duration_ms = (System.nanoTime() - startTime) / 1000000;
- if (duration_ms < google_maps_ratelimit_ms) {
- try {
- Thread.sleep(google_maps_ratelimit_ms - duration_ms);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- }
- }
- }
- } else {
- new_status = fetch_url();
- }
+ new_status = fetch_url();
+
notify_listeners(new_status);
} finally {
finish_fetcher();
static HashMap<String,AltosMapStore> stores = new HashMap<String,AltosMapStore>();
- public static AltosMapStore get(String url, File file) {
+ public static AltosMapStore get(AltosLatLon center, int zoom, int maptype, int px_size, int scale) {
+ String url = map_url(center, zoom, maptype, px_size, scale);
+
AltosMapStore store;
synchronized(stores) {
if (stores.containsKey(url)) {
store = stores.get(url);
} else {
- store = new AltosMapStore(url, file);
+ store = new AltosMapStore(url, map_file(center, zoom, maptype, px_size, scale));
stores.put(url, store);
}
}
return store;
}
+
}