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