]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/function/browser/UrlGenerator.java
Version 18, July 2015
[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                 MAP_SOURCE_PANORAMIO,  /* Panoramio */
35                 MAP_SOURCE_OPENCACHINGCOM, /* Opencaching.com */
36         }
37
38         /**
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
42          * @return url for map
43          */
44         public static String generateUrl(WebService inSource, TrackInfo inTrackInfo)
45         {
46                 switch (inSource)
47                 {
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);
54                         case MAP_SOURCE_BING:
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);
61                         case MAP_SOURCE_OSM:
62                         default:
63                                 return generateOpenStreetMapUrl(inTrackInfo);
64                 }
65         }
66
67         /**
68          * Generate a url for Google maps
69          * @param inTrackInfo track information
70          * @return URL
71          */
72         private static String generateGoogleUrl(TrackInfo inTrackInfo)
73         {
74                 // Check if any data to display
75                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
76                 {
77                         return null;
78                 }
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() + ")";
94                         }
95                 }
96                 return url;
97         }
98
99         /**
100          * Generate a url for Mapquest maps
101          * @param inTrackInfo track information
102          * @return URL
103          */
104         private static String generateMapquestUrl(TrackInfo inTrackInfo)
105         {
106                 // Check if any data to display
107                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
108                 {
109                         return null;
110                 }
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);
116                 return url;
117         }
118
119
120         /**
121          * Generate a url for Yahoo maps
122          * @param inTrackInfo track information
123          * @return URL
124          */
125         private static String generateYahooUrl(TrackInfo inTrackInfo)
126         {
127                 // Check if any data to display
128                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
129                 {
130                         return null;
131                 }
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";
137                 return url;
138         }
139
140         /**
141          * Generate a url for Bing maps
142          * @param inTrackInfo track information
143          * @return URL
144          */
145         private static String generateBingUrl(TrackInfo inTrackInfo)
146         {
147                 // Check if any data to display
148                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
149                 {
150                         return null;
151                 }
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;
159                 return url;
160         }
161
162         /**
163          * Generate a url for Open Street Map
164          * @param inTrackInfo track information
165          * @return URL
166          */
167         private static String generateOpenStreetMapUrl(TrackInfo inTrackInfo)
168         {
169                 // Check if any data to display
170                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
171                 {
172                         return null;
173                 }
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());
185                 }
186                 return url;
187         }
188
189         /**
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
195          */
196         private static String generateUrlForPoint(WebService inService, TrackInfo inTrackInfo)
197         {
198                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
199                 {
200                         return null;
201                 }
202                 // Need a current point
203                 DataPoint currPoint = inTrackInfo.getCurrentPoint();
204                 if (currPoint == null)
205                 {
206                         return null;
207                 }
208                 switch (inService)
209                 {
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);
218                         default:
219                                 return null;
220                 }
221         }
222
223
224         /**
225          * Generate a url for PeakFinder
226          * @param inPoint current point, not null
227          * @return URL
228          */
229         private static String generatePeakfinderUrl(DataPoint inPoint)
230         {
231                 return "http://peakfinder.org/?lat=" + FIVE_DP.format(inPoint.getLatitude().getDouble())
232                         + "&lng=" + FIVE_DP.format(inPoint.getLongitude().getDouble());
233         }
234
235         /**
236          * Generate a url for Geohack
237          * @param inPoint current point, not null
238          * @return URL
239          */
240         private static String generateGeohackUrl(DataPoint inPoint)
241         {
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
245         }
246
247         /**
248          * Generate a url for Panoramio.com
249          * @param inPoint current point, not null
250          * @return URL
251          */
252         private static String generatePanoramioUrl(DataPoint inPoint)
253         {
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";
256         }
257
258
259         /**
260          * Generate a url for OpenCaching.com
261          * @param inPoint current point, not null
262          * @return URL
263          */
264         private static String generateOpencachingComUrl(DataPoint inPoint)
265         {
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());
270                 return url;
271         }
272
273
274         /**
275          * Get the median value from the given lat/long range
276          * @param inRange range of values
277          * @return median value
278          */
279         private static double getMedianValue(DoubleRange inRange)
280         {
281                 return (inRange.getMaximum() + inRange.getMinimum()) / 2.0;
282         }
283
284         /**
285          * Get the span of the given lat/long range
286          * @param inRange range of values
287          * @return span
288          */
289         private static double getSpan(DoubleRange inRange)
290         {
291                 return inRange.getMaximum() - inRange.getMinimum();
292         }
293 }