]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/function/browser/UrlGenerator.java
7c923d3a698d3ad9f1ead4df4c5b59f4f4529304
[GpsPrune.git] / tim / prune / function / browser / UrlGenerator.java
1 package tim.prune.function.browser;
2
3 import java.text.DecimalFormat;
4 import java.text.NumberFormat;
5 import java.util.Locale;
6
7 import tim.prune.I18nManager;
8 import tim.prune.data.DataPoint;
9 import tim.prune.data.DoubleRange;
10 import tim.prune.data.TrackInfo;
11
12 /**
13  * Class to manage the generation of map urls
14  * for display in an external browser
15  */
16 public abstract class UrlGenerator
17 {
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)
21         static {
22                 if (FIVE_DP instanceof DecimalFormat) ((DecimalFormat) FIVE_DP).applyPattern("0.00000");
23         }
24
25         public enum WebService
26         {
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         }
35
36         /**
37          * Generate a URL for the given source and track info
38          * @param inSource source to use, from the enum in UrlGenerator
39          * @param inTrackInfo track info
40          * @return url for map
41          */
42         public static String generateUrl(WebService inSource, TrackInfo inTrackInfo)
43         {
44                 switch (inSource)
45                 {
46                         case MAP_SOURCE_GOOGLE:
47                                 return generateGoogleUrl(inTrackInfo);
48                         case MAP_SOURCE_MAPQUEST:
49                                 return generateMapquestUrl(inTrackInfo);
50                         case MAP_SOURCE_YAHOO:
51                                 return generateYahooUrl(inTrackInfo);
52                         case MAP_SOURCE_BING:
53                                 return generateBingUrl(inTrackInfo);
54                         case MAP_SOURCE_PEAKFINDER:
55                         case MAP_SOURCE_GEOHACK:
56                                 return generateUrlForPoint(inSource, inTrackInfo);
57                         case MAP_SOURCE_OSM:
58                         default:
59                                 return generateOpenStreetMapUrl(inTrackInfo);
60                 }
61         }
62
63         /**
64          * Generate a url for Google maps
65          * @param inTrackInfo track information
66          * @return URL
67          */
68         private static String generateGoogleUrl(TrackInfo inTrackInfo)
69         {
70                 // Check if any data to display
71                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
72                 {
73                         return null;
74                 }
75                 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
76                 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
77                 double latSpan = getSpan(inTrackInfo.getTrack().getLatRange());
78                 double lonSpan = getSpan(inTrackInfo.getTrack().getLonRange());
79                 // Build basic url with centre position and span
80                 String url = "http://" + I18nManager.getText("url.googlemaps")
81                         + "/?ll=" + FIVE_DP.format(medianLat) + "," + FIVE_DP.format(medianLon)
82                         + "&spn=" + FIVE_DP.format(latSpan) + "," + FIVE_DP.format(lonSpan);
83                 DataPoint currPoint = inTrackInfo.getCurrentPoint();
84                 // Add selected point, if any
85                 if (currPoint != null) {
86                         url = url + "&q=" + FIVE_DP.format(currPoint.getLatitude().getDouble()) + ","
87                                 + FIVE_DP.format(currPoint.getLongitude().getDouble());
88                         if (currPoint.getWaypointName() != null) {
89                                 url = url + "(" + currPoint.getWaypointName() + ")";
90                         }
91                 }
92                 return url;
93         }
94
95         /**
96          * Generate a url for Mapquest maps
97          * @param inTrackInfo track information
98          * @return URL
99          */
100         private static String generateMapquestUrl(TrackInfo inTrackInfo)
101         {
102                 // Check if any data to display
103                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
104                 {
105                         return null;
106                 }
107                 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
108                 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
109                 // Build basic url with centre position
110                 String url = "http://atlas.mapquest.com/maps/map.adp?latlongtype=decimal&latitude="
111                         + FIVE_DP.format(medianLat) + "&longitude=" + FIVE_DP.format(medianLon);
112                 return url;
113         }
114
115
116         /**
117          * Generate a url for Yahoo maps
118          * @param inTrackInfo track information
119          * @return URL
120          */
121         private static String generateYahooUrl(TrackInfo inTrackInfo)
122         {
123                 // Check if any data to display
124                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
125                 {
126                         return null;
127                 }
128                 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
129                 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
130                 // Build basic url with centre position
131                 String url = "http://maps.yahoo.com/#lat=" + FIVE_DP.format(medianLat)
132                         + "&lon=" + FIVE_DP.format(medianLon) + "&zoom=13";
133                 return url;
134         }
135
136         /**
137          * Generate a url for Bing maps
138          * @param inTrackInfo track information
139          * @return URL
140          */
141         private static String generateBingUrl(TrackInfo inTrackInfo)
142         {
143                 // Check if any data to display
144                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
145                 {
146                         return null;
147                 }
148                 double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange());
149                 double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange());
150                 // Build basic url with centre position
151                 String latStr = FIVE_DP.format(medianLat);
152                 String lonStr = FIVE_DP.format(medianLon);
153                 String url = "http://bing.com/maps/default.aspx?cp=" + latStr + "~" + lonStr
154                         + "&where1=" + latStr + "%2C%20" + lonStr;
155                 return url;
156         }
157
158         /**
159          * Generate a url for Open Street Map
160          * @param inTrackInfo track information
161          * @return URL
162          */
163         private static String generateOpenStreetMapUrl(TrackInfo inTrackInfo)
164         {
165                 // Check if any data to display
166                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
167                 {
168                         return null;
169                 }
170                 DoubleRange latRange = inTrackInfo.getTrack().getLatRange();
171                 DoubleRange lonRange = inTrackInfo.getTrack().getLonRange();
172                 // Build basic url using min and max lat and long
173                 String url = "http://openstreetmap.org/?minlat=" + FIVE_DP.format(latRange.getMinimum())
174                         + "&maxlat=" + FIVE_DP.format(latRange.getMaximum())
175                         + "&minlon=" + FIVE_DP.format(lonRange.getMinimum()) + "&maxlon=" + FIVE_DP.format(lonRange.getMaximum());
176                 DataPoint currPoint = inTrackInfo.getCurrentPoint();
177                 // Add selected point, if any (no way to add point name?)
178                 if (currPoint != null) {
179                         url = url + "&mlat=" + FIVE_DP.format(currPoint.getLatitude().getDouble())
180                                 + "&mlon=" + FIVE_DP.format(currPoint.getLongitude().getDouble());
181                 }
182                 return url;
183         }
184
185         /**
186          * Generate a URL which only needs the current point
187          * This is just a helper method to simplify the calls to the service-specific methods
188          * @param inSource service to call
189          * @param inTrackInfo track info
190          * @return URL if available, or null
191          */
192         private static String generateUrlForPoint(WebService inService, TrackInfo inTrackInfo)
193         {
194                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
195                 {
196                         return null;
197                 }
198                 // Need a current point
199                 DataPoint currPoint = inTrackInfo.getCurrentPoint();
200                 if (currPoint == null)
201                 {
202                         return null;
203                 }
204                 switch (inService)
205                 {
206                         case MAP_SOURCE_PEAKFINDER:
207                                 return generatePeakfinderUrl(currPoint);
208                         case MAP_SOURCE_GEOHACK:
209                                 return generateGeohackUrl(currPoint);
210                         default:
211                                 return null;
212                 }
213         }
214
215
216         /**
217          * Generate a url for PeakFinder
218          * @param inPoint current point, not null
219          * @return URL
220          */
221         private static String generatePeakfinderUrl(DataPoint inPoint)
222         {
223                 return "http://peakfinder.org/?lat=" + FIVE_DP.format(inPoint.getLatitude().getDouble())
224                         + "&lng=" + FIVE_DP.format(inPoint.getLongitude().getDouble());
225         }
226
227         /**
228          * Generate a url for Geohack
229          * @param inPoint current point, not null
230          * @return URL
231          */
232         private static String generateGeohackUrl(DataPoint inPoint)
233         {
234                 return "https://tools.wmflabs.org/geohack/geohack.php?params=" + FIVE_DP.format(inPoint.getLatitude().getDouble())
235                         + "_N_" + FIVE_DP.format(inPoint.getLongitude().getDouble()) + "_E";
236                 // TODO: Could use absolute values and S, W but this seems to work
237         }
238
239
240         /**
241          * Get the median value from the given lat/long range
242          * @param inRange range of values
243          * @return median value
244          */
245         private static double getMedianValue(DoubleRange inRange)
246         {
247                 return (inRange.getMaximum() + inRange.getMinimum()) / 2.0;
248         }
249
250         /**
251          * Get the span of the given lat/long range
252          * @param inRange range of values
253          * @return span
254          */
255         private static double getSpan(DoubleRange inRange)
256         {
257                 return inRange.getMaximum() - inRange.getMinimum();
258         }
259 }