source: josm/trunk/src/org/openstreetmap/josm/gui/io/DownloadFromOverpassTask.java@ 17318

Last change on this file since 17318 was 16611, checked in by GerdP, 4 years ago

fix #12303: When downloading objects with Overpass API, use recurse up to fetch referrers

  • new static method genOverpassQuery() to generate a single overpass query for all wanted objects
  • use POST instead of PUT to send the query
  • add handling for missing primitives (Overpass doesn't return invisible objects and doesn't a rc 404)
File size: 2.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.io;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.io.IOException;
7
8import org.openstreetmap.josm.data.Bounds;
9import org.openstreetmap.josm.data.osm.DataSet;
10import org.openstreetmap.josm.data.osm.DataSetMerger;
11import org.openstreetmap.josm.gui.ExceptionDialogUtil;
12import org.openstreetmap.josm.gui.PleaseWaitRunnable;
13import org.openstreetmap.josm.gui.progress.ProgressMonitor;
14import org.openstreetmap.josm.io.OsmTransferException;
15import org.openstreetmap.josm.io.OverpassDownloadReader;
16import org.xml.sax.SAXException;
17
18/**
19 * Download OSM data from Overpass API
20 *
21 */
22public class DownloadFromOverpassTask extends PleaseWaitRunnable {
23 private boolean canceled;
24 private final String request;
25 private final DataSet ds;
26 private Exception lastException;
27
28 /**
29 * Constructor
30 * @param request the overpass query
31 * @param ds the {@code DataSet} instance that should contain the downloaded data
32 * @param monitor ProgressMonitor to use or null to create a new one.
33 */
34 public DownloadFromOverpassTask(String request, DataSet ds, ProgressMonitor monitor) {
35 super(tr("Download objects via Overpass API"), monitor, false);
36 this.request = request;
37 this.ds = ds;
38 }
39
40 @Override
41 protected void cancel() {
42 canceled = true;
43 }
44
45 @Override
46 protected void realRun() throws SAXException, IOException, OsmTransferException {
47 try {
48 OverpassDownloadReader reader = new OverpassDownloadReader(new Bounds(0, 0, 0, 0),
49 OverpassDownloadReader.OVERPASS_SERVER.get(), request);
50 DataSet tmpDs = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
51 if (!canceled) {
52 new DataSetMerger(ds, tmpDs).merge();
53 }
54 } catch (OsmTransferException e) {
55 if (canceled)
56 return;
57 lastException = e;
58 }
59
60 }
61
62 @Override
63 protected void finish() {
64 if (canceled)
65 return;
66 if (lastException != null) {
67 ExceptionDialogUtil.explainException(lastException);
68 }
69 }
70}
Note: See TracBrowser for help on using the repository browser.