1 package tim.prune.function.browser;
3 import java.text.DecimalFormat;
4 import java.text.NumberFormat;
5 import java.util.Locale;
7 import tim.prune.I18nManager;
8 import tim.prune.data.DataPoint;
9 import tim.prune.data.DoubleRange;
10 import tim.prune.data.TrackInfo;
13 * Class to manage the generation of map urls
14 * for display in an external browser
16 public abstract class UrlGenerator
18 /** Number formatter for five dp */
19 private static final NumberFormat FIVE_DP = NumberFormat.getNumberInstance(Locale.UK);
20 // Select the UK locale for this formatter so that decimal point is always used (not comma)
22 if (FIVE_DP instanceof DecimalFormat) ((DecimalFormat) FIVE_DP).applyPattern("0.00000");
25 public enum WebService
27 MAP_SOURCE_GOOGLE, /* Google maps */
28 MAP_SOURCE_OSM, /* OpenStreetMap */
29 MAP_SOURCE_MAPQUEST, /* Mapquest */
30 MAP_SOURCE_YAHOO, /* Yahoo */
31 MAP_SOURCE_BING, /* Bing */
32 MAP_SOURCE_PEAKFINDER, /* PeakFinder */
33 MAP_SOURCE_GEOHACK, /* Geohack */
34 MAP_SOURCE_PANORAMIO, /* Panoramio */
35 MAP_SOURCE_OPENCACHINGCOM, /* Opencaching.com */
39 * Generate a URL for the given source and track info
40 * @param inSource source to use, from the enum in UrlGenerator
41 * @param inTrackInfo track info
44 public static String generateUrl(WebService inSource, TrackInfo inTrackInfo)
48 case MAP_SOURCE_GOOGLE:
49 return generateGoogleUrl(inTrackInfo);
50 case MAP_SOURCE_MAPQUEST:
51 return generateMapquestUrl(inTrackInfo);
52 case MAP_SOURCE_YAHOO:
53 return generateYahooUrl(inTrackInfo);
55 return generateBingUrl(inTrackInfo);
56 case MAP_SOURCE_PEAKFINDER:
57 case MAP_SOURCE_GEOHACK:
58 case MAP_SOURCE_PANORAMIO:
59 case MAP_SOURCE_OPENCACHINGCOM:
60 return generateUrlForPoint(inSource, inTrackInfo);
63 return generateOpenStreetMapUrl(inTrackInfo);
68 * Generate a url for Google maps
69 * @param inTrackInfo track information
72 private static String generateGoogleUrl(TrackInfo inTrackInfo)
74 // Check if any data to display
75 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
79 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
80 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
81 double latSpan = getSpan(inTrackInfo.getTrack().getLatRange());
82 double lonSpan = getSpan(inTrackInfo.getTrack().getLonRange());
83 // Build basic url with centre position and span
84 String url = "http://" + I18nManager.getText("url.googlemaps")
85 + "/?ll=" + FIVE_DP.format(medianLat) + "," + FIVE_DP.format(medianLon)
86 + "&spn=" + FIVE_DP.format(latSpan) + "," + FIVE_DP.format(lonSpan);
87 DataPoint currPoint = inTrackInfo.getCurrentPoint();
88 // Add selected point, if any
89 if (currPoint != null) {
90 url = url + "&q=" + FIVE_DP.format(currPoint.getLatitude().getDouble()) + ","
91 + FIVE_DP.format(currPoint.getLongitude().getDouble());
92 if (currPoint.getWaypointName() != null) {
93 url = url + "(" + currPoint.getWaypointName() + ")";
100 * Generate a url for Mapquest maps
101 * @param inTrackInfo track information
104 private static String generateMapquestUrl(TrackInfo inTrackInfo)
106 // Check if any data to display
107 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
111 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
112 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
113 // Build basic url with centre position
114 String url = "http://atlas.mapquest.com/maps/map.adp?latlongtype=decimal&latitude="
115 + FIVE_DP.format(medianLat) + "&longitude=" + FIVE_DP.format(medianLon);
121 * Generate a url for Yahoo maps
122 * @param inTrackInfo track information
125 private static String generateYahooUrl(TrackInfo inTrackInfo)
127 // Check if any data to display
128 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
132 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
133 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
134 // Build basic url with centre position
135 String url = "http://maps.yahoo.com/#lat=" + FIVE_DP.format(medianLat)
136 + "&lon=" + FIVE_DP.format(medianLon) + "&zoom=13";
141 * Generate a url for Bing maps
142 * @param inTrackInfo track information
145 private static String generateBingUrl(TrackInfo inTrackInfo)
147 // Check if any data to display
148 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
152 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
153 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
154 // Build basic url with centre position
155 String latStr = FIVE_DP.format(medianLat);
156 String lonStr = FIVE_DP.format(medianLon);
157 String url = "http://bing.com/maps/default.aspx?cp=" + latStr + "~" + lonStr
158 + "&where1=" + latStr + "%2C%20" + lonStr;
163 * Generate a url for Open Street Map
164 * @param inTrackInfo track information
167 private static String generateOpenStreetMapUrl(TrackInfo inTrackInfo)
169 // Check if any data to display
170 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
174 DoubleRange latRange = inTrackInfo.getTrack().getLatRange();
175 DoubleRange lonRange = inTrackInfo.getTrack().getLonRange();
176 // Build basic url using min and max lat and long
177 String url = "http://openstreetmap.org/?minlat=" + FIVE_DP.format(latRange.getMinimum())
178 + "&maxlat=" + FIVE_DP.format(latRange.getMaximum())
179 + "&minlon=" + FIVE_DP.format(lonRange.getMinimum()) + "&maxlon=" + FIVE_DP.format(lonRange.getMaximum());
180 DataPoint currPoint = inTrackInfo.getCurrentPoint();
181 // Add selected point, if any (no way to add point name?)
182 if (currPoint != null) {
183 url = url + "&mlat=" + FIVE_DP.format(currPoint.getLatitude().getDouble())
184 + "&mlon=" + FIVE_DP.format(currPoint.getLongitude().getDouble());
190 * Generate a URL which only needs the current point
191 * This is just a helper method to simplify the calls to the service-specific methods
192 * @param inSource service to call
193 * @param inTrackInfo track info
194 * @return URL if available, or null
196 private static String generateUrlForPoint(WebService inService, TrackInfo inTrackInfo)
198 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
202 // Need a current point
203 DataPoint currPoint = inTrackInfo.getCurrentPoint();
204 if (currPoint == null)
210 case MAP_SOURCE_PEAKFINDER:
211 return generatePeakfinderUrl(currPoint);
212 case MAP_SOURCE_GEOHACK:
213 return generateGeohackUrl(currPoint);
214 case MAP_SOURCE_PANORAMIO:
215 return generatePanoramioUrl(currPoint);
216 case MAP_SOURCE_OPENCACHINGCOM:
217 return generateOpencachingComUrl(currPoint);
225 * Generate a url for PeakFinder
226 * @param inPoint current point, not null
229 private static String generatePeakfinderUrl(DataPoint inPoint)
231 return "http://peakfinder.org/?lat=" + FIVE_DP.format(inPoint.getLatitude().getDouble())
232 + "&lng=" + FIVE_DP.format(inPoint.getLongitude().getDouble());
236 * Generate a url for Geohack
237 * @param inPoint current point, not null
240 private static String generateGeohackUrl(DataPoint inPoint)
242 return "https://tools.wmflabs.org/geohack/geohack.php?params=" + FIVE_DP.format(inPoint.getLatitude().getDouble())
243 + "_N_" + FIVE_DP.format(inPoint.getLongitude().getDouble()) + "_E";
244 // TODO: Could use absolute values and S, W but this seems to work
248 * Generate a url for Panoramio.com
249 * @param inPoint current point, not null
252 private static String generatePanoramioUrl(DataPoint inPoint)
254 return "http://panoramio.com/map/#lt=" + FIVE_DP.format(inPoint.getLatitude().getDouble())
255 + "&ln=" + FIVE_DP.format(inPoint.getLongitude().getDouble()) + "&z=1&k=0";
260 * Generate a url for OpenCaching.com
261 * @param inPoint current point, not null
264 private static String generateOpencachingComUrl(DataPoint inPoint)
266 final String occLang = I18nManager.getText("webservice.opencachingcom.lang");
267 final String url = "http://www.opencaching.com/" + occLang
268 + "/#find?&loc=" + FIVE_DP.format(inPoint.getLatitude().getDouble())
269 + "," + FIVE_DP.format(inPoint.getLongitude().getDouble());
275 * Get the median value from the given lat/long range
276 * @param inRange range of values
277 * @return median value
279 private static double getMedianValue(DoubleRange inRange)
281 return (inRange.getMaximum() + inRange.getMinimum()) / 2.0;
285 * Get the span of the given lat/long range
286 * @param inRange range of values
289 private static double getSpan(DoubleRange inRange)
291 return inRange.getMaximum() - inRange.getMinimum();