X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Ffunction%2FGetWikipediaFunction.java;h=804ba714bbf1db0acc86fa36e1e65514c4498b27;hb=ff33ebba6b7c62834f6dae16ce33eb2c710b160e;hp=3ffdd06817d87fe984b6063c7e7a63aa3e1ab4d9;hpb=a6197ddcaac11c0b943183da7d46169742d024af;p=GpsPrune.git diff --git a/tim/prune/function/GetWikipediaFunction.java b/tim/prune/function/GetWikipediaFunction.java index 3ffdd06..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() { @@ -77,7 +81,10 @@ public class GetWikipediaFunction extends GenericDownloaderFunction lon = point.getLongitude().getDouble(); } - // Firstly try the local language + // 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 @@ -128,8 +135,8 @@ public class GetWikipediaFunction extends GenericDownloaderFunction 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); // Show error message if any if (_trackListModel.isEmpty()) @@ -157,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); } @@ -171,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 + } + } }