source: osm/applications/editors/josm/plugins/download_along/src/org/openstreetmap/josm/plugin/download_along/DownloadAlongWayAction.java@ 32946

Last change on this file since 32946 was 32946, checked in by donvip, 8 years ago

fix #josm13557 - fix deprecation warnings

File size: 6.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.plugin.download_along;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.event.ActionEvent;
7import java.awt.event.KeyEvent;
8import java.awt.geom.Area;
9import java.awt.geom.Rectangle2D;
10import java.util.ArrayList;
11import java.util.Collection;
12import java.util.Set;
13
14import javax.swing.JOptionPane;
15
16import org.openstreetmap.josm.Main;
17import org.openstreetmap.josm.actions.DownloadAlongAction;
18import org.openstreetmap.josm.data.coor.LatLon;
19import org.openstreetmap.josm.data.osm.Node;
20import org.openstreetmap.josm.data.osm.OsmPrimitive;
21import org.openstreetmap.josm.data.osm.Way;
22import org.openstreetmap.josm.gui.help.HelpUtil;
23import org.openstreetmap.josm.gui.layer.gpx.DownloadAlongPanel;
24import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
25import org.openstreetmap.josm.tools.Shortcut;
26
27class DownloadAlongWayAction extends DownloadAlongAction {
28
29 private static final String PREF_DOWNLOAD_ALONG_WAY_DISTANCE = "downloadAlongWay.distance";
30 private static final String PREF_DOWNLOAD_ALONG_WAY_AREA = "downloadAlongWay.area";
31
32 private static final String PREF_DOWNLOAD_ALONG_WAY_OSM = "downloadAlongWay.download.osm";
33 private static final String PREF_DOWNLOAD_ALONG_WAY_GPS = "downloadAlongWay.download.gps";
34
35 DownloadAlongWayAction() {
36 super(tr("Download along..."), "download_along", tr("Download OSM data along the selected ways."),
37 Shortcut.registerShortcut("tools:download_along", tr("Tool: {0}", tr("Download Along")),
38 KeyEvent.VK_D, Shortcut.ALT_SHIFT), true);
39 }
40
41 @Override
42 public void actionPerformed(ActionEvent e) {
43 Set<Way> selectedWays = OsmPrimitive.getFilteredSet(getLayerManager().getEditDataSet().getSelected(), Way.class);
44
45 if (selectedWays.isEmpty()) {
46 JOptionPane.showMessageDialog(Main.parent, tr("Please select 1 or more ways to download along"));
47 return;
48 }
49
50 final DownloadAlongPanel panel = new DownloadAlongPanel(
51 PREF_DOWNLOAD_ALONG_WAY_OSM, PREF_DOWNLOAD_ALONG_WAY_GPS,
52 PREF_DOWNLOAD_ALONG_WAY_DISTANCE, PREF_DOWNLOAD_ALONG_WAY_AREA, null);
53
54 if (0 != panel.showInDownloadDialog(tr("Download from OSM along selected ways"), HelpUtil.ht("/Tools/DownloadAlong"))) {
55 return;
56 }
57
58 /*
59 * Find the average latitude for the data we're contemplating, so we
60 * can know how many metres per degree of longitude we have.
61 */
62 double latsum = 0;
63 int latcnt = 0;
64
65 for (Way way : selectedWays) {
66 for (Node n : way.getNodes()) {
67 latsum += n.getCoor().lat();
68 latcnt++;
69 }
70 }
71
72 double avglat = latsum / latcnt;
73 double scale = Math.cos(Math.toRadians(avglat));
74
75 /*
76 * Compute buffer zone extents and maximum bounding box size. Note
77 * that the maximum we ever offer is a bbox area of 0.002, while the
78 * API theoretically supports 0.25, but as soon as you touch any
79 * built-up area, that kind of bounding box will download forever
80 * and then stop because it has more than 50k nodes.
81 */
82 double buffer_dist = panel.getDistance();
83 double buffer_y = buffer_dist / 100000.0;
84 double buffer_x = buffer_y / scale;
85 double max_area = panel.getArea() / 10000.0 / scale;
86 Area a = new Area();
87 Rectangle2D r = new Rectangle2D.Double();
88
89 /*
90 * Collect the combined area of all gpx points plus buffer zones
91 * around them. We ignore points that lie closer to the previous
92 * point than the given buffer size because otherwise this operation
93 * takes ages.
94 */
95 LatLon previous = null;
96 for (Way way : selectedWays) {
97 for (Node p : way.getNodes()) {
98 LatLon c = p.getCoor();
99 ArrayList<LatLon> intermediateNodes = new ArrayList<>();
100 if (previous != null && c.greatCircleDistance(previous) > buffer_dist) {
101 Double d = c.greatCircleDistance(previous) / buffer_dist;
102 int nbNodes = d.intValue();
103 Main.info(tr("{0} intermediate nodes to download.", nbNodes));
104 Main.info(tr("between {0} {1} and {2} {3}", c.lat(), c.lon(), previous.lat(),
105 previous.lon()));
106 for (int i = 1; i < nbNodes; i++) {
107 intermediateNodes.add(new LatLon(previous.lat()
108 + (i * (c.lat() - previous.lat()) / (nbNodes + 1)), previous.lon()
109 + (i * (c.lon() - previous.lon()) / (nbNodes + 1))));
110 Main.info(tr(" adding {0} {1}", previous.lat()
111 + (i * (c.lat() - previous.lat()) / (nbNodes + 1)), previous.lon()
112 + (i * (c.lon() - previous.lon()) / (nbNodes + 1))));
113 }
114 }
115 intermediateNodes.add(c);
116 for (LatLon d : intermediateNodes) {
117 if (previous == null || d.greatCircleDistance(previous) > buffer_dist) {
118 // we add a buffer around the point.
119 r.setRect(d.lon() - buffer_x, d.lat() - buffer_y, 2 * buffer_x, 2 * buffer_y);
120 a.add(new Area(r));
121 previous = d;
122 }
123 }
124 previous = c;
125 }
126 }
127
128 confirmAndDownloadAreas(a, max_area, panel.isDownloadOsmData(), panel.isDownloadGpxData(),
129 tr("Download from OSM along selected ways"), NullProgressMonitor.INSTANCE);
130 }
131
132 @Override
133 protected void updateEnabledState() {
134 if (getLayerManager().getEditDataSet() == null) {
135 setEnabled(false);
136 } else {
137 updateEnabledState(getLayerManager().getEditDataSet().getSelected());
138 }
139 }
140
141 @Override
142 protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
143 setEnabled(selection.stream().anyMatch(Way.class::isInstance));
144 }
145}
Note: See TracBrowser for help on using the repository browser.