X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Ffunction%2FGetWikipediaFunction.java;h=804ba714bbf1db0acc86fa36e1e65514c4498b27;hb=ff33ebba6b7c62834f6dae16ce33eb2c710b160e;hp=0e6d9eb5ae432454b505cc8fb8ba4a200b2bf57c;hpb=4d5796d02a15808311c09448d79e6e7d1de9d636;p=GpsPrune.git diff --git a/tim/prune/function/GetWikipediaFunction.java b/tim/prune/function/GetWikipediaFunction.java index 0e6d9eb..804ba71 100644 --- a/tim/prune/function/GetWikipediaFunction.java +++ b/tim/prune/function/GetWikipediaFunction.java @@ -1,6 +1,8 @@ package tim.prune.function; +import java.io.BufferedReader; import java.io.InputStream; +import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; @@ -10,14 +12,16 @@ import javax.xml.parsers.SAXParserFactory; import tim.prune.App; import tim.prune.I18nManager; import tim.prune.data.DataPoint; +import tim.prune.data.Distance; import tim.prune.data.Field; import tim.prune.data.Latitude; import tim.prune.data.Longitude; -import tim.prune.function.gpsies.GenericDownloaderFunction; -import tim.prune.function.gpsies.GpsiesTrack; +import tim.prune.data.UnitSetLibrary; +import tim.prune.function.search.GenericDownloaderFunction; +import tim.prune.function.search.SearchResult; /** - * Function to load nearby point information from Wikipedia + * Function to load nearby point information from Wikipedia (and Wikimedia) * according to the currently viewed area */ public class GetWikipediaFunction extends GenericDownloaderFunction @@ -57,7 +61,7 @@ public class GetWikipediaFunction extends GenericDownloaderFunction /** - * Run method to call geonames in separate thread + * Run method to get the nearby points in a separate thread */ public void run() { @@ -71,21 +75,51 @@ public class GetWikipediaFunction extends GenericDownloaderFunction lat = (coords[0] + coords[2]) / 2.0; lon = (coords[1] + coords[3]) / 2.0; } - else { + else + { lat = point.getLatitude().getDouble(); lon = point.getLongitude().getDouble(); } - String descMessage = ""; - InputStream inStream = null; + // Before we ask geonames online, let's get wikimedia galleries first + searchWikimediaGalleries(lat, lon); + + // For geonames, firstly try the local language + String lang = I18nManager.getText("wikipedia.lang"); + submitSearch(lat, lon, lang); + // If we didn't get anything, try a secondary language + if (_trackListModel.isEmpty() && _errorMessage == null && lang.equals("als")) { + submitSearch(lat, lon, "de"); + } + // If still nothing then try english + if (_trackListModel.isEmpty() && _errorMessage == null && !lang.equals("en")) { + submitSearch(lat, lon, "en"); + } + + // Set status label according to error or "none found", leave blank if ok + if (_errorMessage == null && _trackListModel.isEmpty()) { + _errorMessage = I18nManager.getText("dialog.wikipedia.nonefound"); + } + _statusLabel.setText(_errorMessage == null ? "" : _errorMessage); + } + /** + * Submit the search for the given parameters + * @param inLat latitude + * @param inLon longitude + * @param inLang language code to use, such as en or de + */ + private void submitSearch(double inLat, double inLon, String inLang) + { // Example http://api.geonames.org/findNearbyWikipedia?lat=47&lng=9 String urlString = "http://api.geonames.org/findNearbyWikipedia?lat=" + - lat + "&lng=" + lon + "&maxRows=" + MAX_RESULTS - + "&radius=" + MAX_DISTANCE + "&lang=" + I18nManager.getText("wikipedia.lang") + inLat + "&lng=" + inLon + "&maxRows=" + MAX_RESULTS + + "&radius=" + MAX_DISTANCE + "&lang=" + inLang + "&username=" + GEONAMES_USERNAME; // Parse the returned XML with a special handler GetWikipediaXmlHandler xmlHandler = new GetWikipediaXmlHandler(); + InputStream inStream = null; + try { URL url = new URL(urlString); @@ -94,31 +128,28 @@ public class GetWikipediaFunction extends GenericDownloaderFunction saxParser.parse(inStream, xmlHandler); } catch (Exception e) { - descMessage = e.getClass().getName() + " - " + e.getMessage(); + _errorMessage = e.getClass().getName() + " - " + e.getMessage(); } // Close stream and ignore errors try { inStream.close(); } catch (Exception e) {} // Add track list to model - ArrayList trackList = xmlHandler.getTrackList(); - _trackListModel.addTracks(trackList); + ArrayList trackList = xmlHandler.getTrackList(); + _trackListModel.addTracks(trackList, true); - // Set status label according to error or "none found", leave blank if ok - if (descMessage.equals("") && (trackList == null || trackList.size() == 0)) { - descMessage = I18nManager.getText("dialog.gpsies.nonefound"); - } - _statusLabel.setText(descMessage); // Show error message if any - if (trackList == null || trackList.size() == 0) { + if (_trackListModel.isEmpty()) + { String error = xmlHandler.getErrorMessage(); - if (error != null && !error.equals("")) { + if (error != null && !error.equals("")) + { _app.showErrorMessageNoLookup(getNameKey(), error); + _errorMessage = error; } } } - /** * Load the selected point(s) */ @@ -133,11 +164,11 @@ public class GetWikipediaFunction extends GenericDownloaderFunction int rowNum = rowNums[i]; if (rowNum >= 0 && rowNum < _trackListModel.getRowCount()) { - String coords = _trackListModel.getTrack(rowNum).getDownloadLink(); - String[] latlon = coords.split(","); - if (latlon.length == 2) + String lat = _trackListModel.getTrack(rowNum).getLatitude(); + String lon = _trackListModel.getTrack(rowNum).getLongitude(); + if (lat != null && lon != null) { - DataPoint point = new DataPoint(new Latitude(latlon[0]), new Longitude(latlon[1]), null); + DataPoint point = new DataPoint(new Latitude(lat), new Longitude(lon), null); point.setFieldValue(Field.WAYPT_NAME, _trackListModel.getTrack(rowNum).getTrackName(), false); _app.createPoint(point); } @@ -147,4 +178,61 @@ public class GetWikipediaFunction extends GenericDownloaderFunction _cancelled = true; _dialog.dispose(); } + + /** + * Search the local wikimedia index to see if there are any galleries nearby + * @param inLat latitude + * @param inLon longitude + */ + private void searchWikimediaGalleries(double inLat, double inLon) + { + BufferedReader reader = null; + try + { + InputStream in = GetWikipediaFunction.class.getResourceAsStream("/tim/prune/function/search/wikimedia_galleries.txt"); + reader = new BufferedReader(new InputStreamReader(in)); + if (reader != null) + { + ArrayList trackList = new ArrayList(); + DataPoint herePoint = new DataPoint(new Latitude(inLat, Latitude.FORMAT_DEG), new Longitude(inLon, Longitude.FORMAT_DEG), null); + // Loop through the file line by line, looking for nearby points + String line = null; + while ((line = reader.readLine()) != null) + { + String[] lineComps = line.split("\t"); + if (lineComps.length == 4) + { + DataPoint p = new DataPoint(new Latitude(lineComps[2]), new Longitude(lineComps[3]), null); + double distFromHere = Distance.convertRadiansToDistance( + DataPoint.calculateRadiansBetween(p, herePoint), UnitSetLibrary.UNITS_KILOMETRES); + if (distFromHere < MAX_DISTANCE) + { + SearchResult gallery = new SearchResult(); + gallery.setTrackName(I18nManager.getText("dialog.wikipedia.gallery") + ": " + lineComps[0]); + gallery.setDescription(lineComps[1]); + gallery.setLatitude(lineComps[2]); + gallery.setLongitude(lineComps[3]); + gallery.setWebUrl("https://commons.wikimedia.org/wiki/" + lineComps[0]); + gallery.setLength(distFromHere * 1000.0); // convert from km to m + trackList.add(gallery); + } + } + } + _trackListModel.addTracks(trackList, true); + } + } + catch (java.io.IOException e) { + System.err.println("Exception trying to read wikimedia file : " + e.getMessage()); + } + catch (NullPointerException e) { + System.err.println("Couldn't find wikimedia file : " + e.getMessage()); + } + finally + { + try { + reader.close(); + } + catch (Exception e) {} // ignore + } + } }