X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Ffunction%2Fbrowser%2FUrlGenerator.java;h=7c923d3a698d3ad9f1ead4df4c5b59f4f4529304;hb=92dad5df664287acb51728e9ea599f150765d34a;hp=14d15776a8be3d19213cf0419ea240349146b9d6;hpb=54b9d8bc8f0025ccf97a67d9dd217ef1f9cf082f;p=GpsPrune.git diff --git a/tim/prune/function/browser/UrlGenerator.java b/tim/prune/function/browser/UrlGenerator.java index 14d1577..7c923d3 100644 --- a/tim/prune/function/browser/UrlGenerator.java +++ b/tim/prune/function/browser/UrlGenerator.java @@ -22,35 +22,42 @@ public abstract class UrlGenerator if (FIVE_DP instanceof DecimalFormat) ((DecimalFormat) FIVE_DP).applyPattern("0.00000"); } - /** Constant for Google Maps */ - public static final int MAP_SOURCE_GOOGLE = 0; - /** Constant for Open Street Maps */ - public static final int MAP_SOURCE_OSM = 1; - /** Constant for Mapquest */ - public static final int MAP_SOURCE_MAPQUEST = 2; - /** Constant for Yahoo */ - public static final int MAP_SOURCE_YAHOO = 3; - - // TODO: Add other map sources, eg MSN, search.ch ? + public enum WebService + { + MAP_SOURCE_GOOGLE, /* Google maps */ + MAP_SOURCE_OSM, /* OpenStreetMap */ + MAP_SOURCE_MAPQUEST, /* Mapquest */ + MAP_SOURCE_YAHOO, /* Yahoo */ + MAP_SOURCE_BING, /* Bing */ + MAP_SOURCE_PEAKFINDER, /* PeakFinder */ + MAP_SOURCE_GEOHACK, /* Geohack */ + } /** * Generate a URL for the given source and track info - * @param inSource source to use, either google or openstreetmap + * @param inSource source to use, from the enum in UrlGenerator * @param inTrackInfo track info * @return url for map */ - public static String generateUrl(int inSource, TrackInfo inTrackInfo) + public static String generateUrl(WebService inSource, TrackInfo inTrackInfo) { - if (inSource == MAP_SOURCE_GOOGLE) { - return generateGoogleUrl(inTrackInfo); - } - else if (inSource == MAP_SOURCE_MAPQUEST) { - return generateMapquestUrl(inTrackInfo); - } - else if (inSource == MAP_SOURCE_YAHOO) { - return generateYahooUrl(inTrackInfo); + switch (inSource) + { + case MAP_SOURCE_GOOGLE: + return generateGoogleUrl(inTrackInfo); + case MAP_SOURCE_MAPQUEST: + return generateMapquestUrl(inTrackInfo); + case MAP_SOURCE_YAHOO: + return generateYahooUrl(inTrackInfo); + case MAP_SOURCE_BING: + return generateBingUrl(inTrackInfo); + case MAP_SOURCE_PEAKFINDER: + case MAP_SOURCE_GEOHACK: + return generateUrlForPoint(inSource, inTrackInfo); + case MAP_SOURCE_OSM: + default: + return generateOpenStreetMapUrl(inTrackInfo); } - return generateOpenStreetMapUrl(inTrackInfo); } /** @@ -82,43 +89,36 @@ public abstract class UrlGenerator url = url + "(" + currPoint.getWaypointName() + ")"; } } - //System.out.println(url); return url; } /** - * Generate a url for Open Street Map + * Generate a url for Mapquest maps * @param inTrackInfo track information * @return URL */ - private static String generateOpenStreetMapUrl(TrackInfo inTrackInfo) + private static String generateMapquestUrl(TrackInfo inTrackInfo) { // Check if any data to display if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1) { return null; } - DoubleRange latRange = inTrackInfo.getTrack().getLatRange(); - DoubleRange lonRange = inTrackInfo.getTrack().getLonRange(); - // Build basic url using min and max lat and long - String url = "http://openstreetmap.org/?minlat=" + FIVE_DP.format(latRange.getMinimum()) - + "&maxlat=" + FIVE_DP.format(latRange.getMaximum()) - + "&minlon=" + FIVE_DP.format(lonRange.getMinimum()) + "&maxlon=" + FIVE_DP.format(lonRange.getMaximum()); - DataPoint currPoint = inTrackInfo.getCurrentPoint(); - // Add selected point, if any (no way to add point name?) - if (currPoint != null) { - url = url + "&mlat=" + FIVE_DP.format(currPoint.getLatitude().getDouble()) - + "&mlon=" + FIVE_DP.format(currPoint.getLongitude().getDouble()); - } + double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange()); + double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange()); + // Build basic url with centre position + String url = "http://atlas.mapquest.com/maps/map.adp?latlongtype=decimal&latitude=" + + FIVE_DP.format(medianLat) + "&longitude=" + FIVE_DP.format(medianLon); return url; } + /** - * Generate a url for Mapquest maps + * Generate a url for Yahoo maps * @param inTrackInfo track information * @return URL */ - private static String generateMapquestUrl(TrackInfo inTrackInfo) + private static String generateYahooUrl(TrackInfo inTrackInfo) { // Check if any data to display if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1) @@ -128,18 +128,17 @@ public abstract class UrlGenerator double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange()); double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange()); // Build basic url with centre position - String url = "http://atlas.mapquest.com/maps/map.adp?latlongtype=decimal&latitude=" - + FIVE_DP.format(medianLat) + "&longitude=" + FIVE_DP.format(medianLon); + String url = "http://maps.yahoo.com/#lat=" + FIVE_DP.format(medianLat) + + "&lon=" + FIVE_DP.format(medianLon) + "&zoom=13"; return url; } - /** - * Generate a url for Yahoo maps + * Generate a url for Bing maps * @param inTrackInfo track information * @return URL */ - private static String generateYahooUrl(TrackInfo inTrackInfo) + private static String generateBingUrl(TrackInfo inTrackInfo) { // Check if any data to display if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1) @@ -149,12 +148,96 @@ public abstract class UrlGenerator double medianLat = getMedianValue(inTrackInfo.getTrack().getLatRange()); double medianLon = getMedianValue(inTrackInfo.getTrack().getLonRange()); // Build basic url with centre position - String url = "http://maps.yahoo.com/#lat=" + FIVE_DP.format(medianLat) - + "&lon=" + FIVE_DP.format(medianLon) + "&zoom=13"; + String latStr = FIVE_DP.format(medianLat); + String lonStr = FIVE_DP.format(medianLon); + String url = "http://bing.com/maps/default.aspx?cp=" + latStr + "~" + lonStr + + "&where1=" + latStr + "%2C%20" + lonStr; return url; } -/** + /** + * Generate a url for Open Street Map + * @param inTrackInfo track information + * @return URL + */ + private static String generateOpenStreetMapUrl(TrackInfo inTrackInfo) + { + // Check if any data to display + if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1) + { + return null; + } + DoubleRange latRange = inTrackInfo.getTrack().getLatRange(); + DoubleRange lonRange = inTrackInfo.getTrack().getLonRange(); + // Build basic url using min and max lat and long + String url = "http://openstreetmap.org/?minlat=" + FIVE_DP.format(latRange.getMinimum()) + + "&maxlat=" + FIVE_DP.format(latRange.getMaximum()) + + "&minlon=" + FIVE_DP.format(lonRange.getMinimum()) + "&maxlon=" + FIVE_DP.format(lonRange.getMaximum()); + DataPoint currPoint = inTrackInfo.getCurrentPoint(); + // Add selected point, if any (no way to add point name?) + if (currPoint != null) { + url = url + "&mlat=" + FIVE_DP.format(currPoint.getLatitude().getDouble()) + + "&mlon=" + FIVE_DP.format(currPoint.getLongitude().getDouble()); + } + return url; + } + + /** + * Generate a URL which only needs the current point + * This is just a helper method to simplify the calls to the service-specific methods + * @param inSource service to call + * @param inTrackInfo track info + * @return URL if available, or null + */ + private static String generateUrlForPoint(WebService inService, TrackInfo inTrackInfo) + { + if (inTrackInfo == null || inTrackInfo.getTrack() == null || inTrackInfo.getTrack().getNumPoints() < 1) + { + return null; + } + // Need a current point + DataPoint currPoint = inTrackInfo.getCurrentPoint(); + if (currPoint == null) + { + return null; + } + switch (inService) + { + case MAP_SOURCE_PEAKFINDER: + return generatePeakfinderUrl(currPoint); + case MAP_SOURCE_GEOHACK: + return generateGeohackUrl(currPoint); + default: + return null; + } + } + + + /** + * Generate a url for PeakFinder + * @param inPoint current point, not null + * @return URL + */ + private static String generatePeakfinderUrl(DataPoint inPoint) + { + return "http://peakfinder.org/?lat=" + FIVE_DP.format(inPoint.getLatitude().getDouble()) + + "&lng=" + FIVE_DP.format(inPoint.getLongitude().getDouble()); + } + + /** + * Generate a url for Geohack + * @param inPoint current point, not null + * @return URL + */ + private static String generateGeohackUrl(DataPoint inPoint) + { + return "https://tools.wmflabs.org/geohack/geohack.php?params=" + FIVE_DP.format(inPoint.getLatitude().getDouble()) + + "_N_" + FIVE_DP.format(inPoint.getLongitude().getDouble()) + "_E"; + // TODO: Could use absolute values and S, W but this seems to work + } + + + /** * Get the median value from the given lat/long range * @param inRange range of values * @return median value