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 /** Constant for Google Maps */
26 public static final int MAP_SOURCE_GOOGLE = 0;
27 /** Constant for Open Street Maps */
28 public static final int MAP_SOURCE_OSM = 1;
29 /** Constant for Mapquest */
30 public static final int MAP_SOURCE_MAPQUEST = 2;
31 /** Constant for Yahoo */
32 public static final int MAP_SOURCE_YAHOO = 3;
33 /** Constant for Bing */
34 public static final int MAP_SOURCE_BING = 4;
37 * Generate a URL for the given source and track info
38 * @param inSource source to use, either google or openstreetmap
39 * @param inTrackInfo track info
42 public static String generateUrl(int inSource, TrackInfo inTrackInfo)
44 if (inSource == MAP_SOURCE_GOOGLE) {
45 return generateGoogleUrl(inTrackInfo);
47 else if (inSource == MAP_SOURCE_MAPQUEST) {
48 return generateMapquestUrl(inTrackInfo);
50 else if (inSource == MAP_SOURCE_YAHOO) {
51 return generateYahooUrl(inTrackInfo);
53 else if (inSource == MAP_SOURCE_BING) {
54 return generateBingUrl(inTrackInfo);
56 return generateOpenStreetMapUrl(inTrackInfo);
60 * Generate a url for Google maps
61 * @param inTrackInfo track information
64 private static String generateGoogleUrl(TrackInfo inTrackInfo)
66 // Check if any data to display
67 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
71 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
72 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
73 double latSpan = getSpan(inTrackInfo.getTrack().getLatRange());
74 double lonSpan = getSpan(inTrackInfo.getTrack().getLonRange());
75 // Build basic url with centre position and span
76 String url = "http://" + I18nManager.getText("url.googlemaps")
77 + "/?ll=" + FIVE_DP.format(medianLat) + "," + FIVE_DP.format(medianLon)
78 + "&spn=" + FIVE_DP.format(latSpan) + "," + FIVE_DP.format(lonSpan);
79 DataPoint currPoint = inTrackInfo.getCurrentPoint();
80 // Add selected point, if any
81 if (currPoint != null) {
82 url = url + "&q=" + FIVE_DP.format(currPoint.getLatitude().getDouble()) + ","
83 + FIVE_DP.format(currPoint.getLongitude().getDouble());
84 if (currPoint.getWaypointName() != null) {
85 url = url + "(" + currPoint.getWaypointName() + ")";
92 * Generate a url for Open Street Map
93 * @param inTrackInfo track information
96 private static String generateOpenStreetMapUrl(TrackInfo inTrackInfo)
98 // Check if any data to display
99 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
103 DoubleRange latRange = inTrackInfo.getTrack().getLatRange();
104 DoubleRange lonRange = inTrackInfo.getTrack().getLonRange();
105 // Build basic url using min and max lat and long
106 String url = "http://openstreetmap.org/?minlat=" + FIVE_DP.format(latRange.getMinimum())
107 + "&maxlat=" + FIVE_DP.format(latRange.getMaximum())
108 + "&minlon=" + FIVE_DP.format(lonRange.getMinimum()) + "&maxlon=" + FIVE_DP.format(lonRange.getMaximum());
109 DataPoint currPoint = inTrackInfo.getCurrentPoint();
110 // Add selected point, if any (no way to add point name?)
111 if (currPoint != null) {
112 url = url + "&mlat=" + FIVE_DP.format(currPoint.getLatitude().getDouble())
113 + "&mlon=" + FIVE_DP.format(currPoint.getLongitude().getDouble());
119 * Generate a url for Mapquest maps
120 * @param inTrackInfo track information
123 private static String generateMapquestUrl(TrackInfo inTrackInfo)
125 // Check if any data to display
126 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
130 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
131 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
132 // Build basic url with centre position
133 String url = "http://atlas.mapquest.com/maps/map.adp?latlongtype=decimal&latitude="
134 + FIVE_DP.format(medianLat) + "&longitude=" + FIVE_DP.format(medianLon);
140 * Generate a url for Yahoo maps
141 * @param inTrackInfo track information
144 private static String generateYahooUrl(TrackInfo inTrackInfo)
146 // Check if any data to display
147 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
151 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
152 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
153 // Build basic url with centre position
154 String url = "http://maps.yahoo.com/#lat=" + FIVE_DP.format(medianLat)
155 + "&lon=" + FIVE_DP.format(medianLon) + "&zoom=13";
160 * Generate a url for Bing maps
161 * @param inTrackInfo track information
164 private static String generateBingUrl(TrackInfo inTrackInfo)
166 // Check if any data to display
167 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
171 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
172 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
173 // Build basic url with centre position
174 String latStr = FIVE_DP.format(medianLat);
175 String lonStr = FIVE_DP.format(medianLon);
176 String url = "http://bing.com/maps/default.aspx?cp=" + latStr + "~" + lonStr
177 + "&where1=" + latStr + "%2C%20" + lonStr;
183 * Get the median value from the given lat/long range
184 * @param inRange range of values
185 * @return median value
187 private static double getMedianValue(DoubleRange inRange)
189 return (inRange.getMaximum() + inRange.getMinimum()) / 2.0;
193 * Get the span of the given lat/long range
194 * @param inRange range of values
197 private static double getSpan(DoubleRange inRange)
199 return inRange.getMaximum() - inRange.getMinimum();