]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/function/browser/UrlGenerator.java
Version 9, February 2010
[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         /** 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;
35
36         /**
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
40          * @return url for map
41          */
42         public static String generateUrl(int inSource, TrackInfo inTrackInfo)
43         {
44                 if (inSource == MAP_SOURCE_GOOGLE) {
45                         return generateGoogleUrl(inTrackInfo);
46                 }
47                 else if (inSource == MAP_SOURCE_MAPQUEST) {
48                         return generateMapquestUrl(inTrackInfo);
49                 }
50                 else if (inSource == MAP_SOURCE_YAHOO) {
51                         return generateYahooUrl(inTrackInfo);
52                 }
53                 else if (inSource == MAP_SOURCE_BING) {
54                         return generateBingUrl(inTrackInfo);
55                 }
56                 return generateOpenStreetMapUrl(inTrackInfo);
57         }
58
59         /**
60          * Generate a url for Google maps
61          * @param inTrackInfo track information
62          * @return URL
63          */
64         private static String generateGoogleUrl(TrackInfo inTrackInfo)
65         {
66                 // Check if any data to display
67                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
68                 {
69                         return null;
70                 }
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() + ")";
86                         }
87                 }
88                 return url;
89         }
90
91         /**
92          * Generate a url for Open Street Map
93          * @param inTrackInfo track information
94          * @return URL
95          */
96         private static String generateOpenStreetMapUrl(TrackInfo inTrackInfo)
97         {
98                 // Check if any data to display
99                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
100                 {
101                         return null;
102                 }
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());
114                 }
115                 return url;
116         }
117
118         /**
119          * Generate a url for Mapquest maps
120          * @param inTrackInfo track information
121          * @return URL
122          */
123         private static String generateMapquestUrl(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://atlas.mapquest.com/maps/map.adp?latlongtype=decimal&latitude="
134                         + FIVE_DP.format(medianLat) + "&longitude=" + FIVE_DP.format(medianLon);
135                 return url;
136         }
137
138
139         /**
140          * Generate a url for Yahoo maps
141          * @param inTrackInfo track information
142          * @return URL
143          */
144         private static String generateYahooUrl(TrackInfo inTrackInfo)
145         {
146                 // Check if any data to display
147                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
148                 {
149                         return null;
150                 }
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";
156                 return url;
157         }
158
159         /**
160          * Generate a url for Bing maps
161          * @param inTrackInfo track information
162          * @return URL
163          */
164         private static String generateBingUrl(TrackInfo inTrackInfo)
165         {
166                 // Check if any data to display
167                 if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1)
168                 {
169                         return null;
170                 }
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;
178                 return url;
179         }
180
181
182         /**
183          * Get the median value from the given lat/long range
184          * @param inRange range of values
185          * @return median value
186          */
187         private static double getMedianValue(DoubleRange inRange)
188         {
189                 return (inRange.getMaximum() + inRange.getMinimum()) / 2.0;
190         }
191
192         /**
193          * Get the span of the given lat/long range
194          * @param inRange range of values
195          * @return span
196          */
197         private static double getSpan(DoubleRange inRange)
198         {
199                 return inRange.getMaximum() - inRange.getMinimum();
200         }
201 }