diff --git a/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java b/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
index 0c14ff0a8..53f557aab 100644
|
a
|
b
|
|
| 11 | 11 | import java.io.IOException; |
| 12 | 12 | import java.net.MalformedURLException; |
| 13 | 13 | import java.nio.file.InvalidPathException; |
| | 14 | import java.time.Year; |
| | 15 | import java.time.ZoneOffset; |
| 14 | 16 | import java.util.Collection; |
| 15 | 17 | import java.util.Collections; |
| 16 | 18 | import java.util.List; |
| … |
… |
public AddImageryLayerAction(ImageryInfo info) {
|
| 94 | 96 | */ |
| 95 | 97 | private static ImageryInfo convertImagery(ImageryInfo info) { |
| 96 | 98 | try { |
| | 99 | if (info.getUrl().contains("{time}")) { |
| | 100 | final String instant = Year.now().atDay(1).atStartOfDay(ZoneOffset.UTC).toInstant().toString(); |
| | 101 | final String example = String.join("/", instant, instant); |
| | 102 | final String initialSelectionValue = info.getDate() != null ? info.getDate() : example; |
| | 103 | final String userDate = JOptionPane.showInputDialog(MainApplication.getMainFrame(), |
| | 104 | tr("Time filter for {0} such as {1}", info.getName(), example), |
| | 105 | initialSelectionValue); |
| | 106 | if (userDate == null) { |
| | 107 | return null; |
| | 108 | } |
| | 109 | info.setDate(userDate); |
| | 110 | // TODO ImageryLayerInfo.save |
| | 111 | } |
| 97 | 112 | switch(info.getImageryType()) { |
| 98 | 113 | case WMS_ENDPOINT: |
| 99 | 114 | // convert to WMS type |
diff --git a/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java b/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
index 6bf1c45d1..50cfb87ed 100644
|
a
|
b
|
public boolean equals(Object o) {
|
| 276 | 276 | private String countryCode = ""; |
| 277 | 277 | /** |
| 278 | 278 | * creation date of the imagery (in the form YYYY-MM-DD;YYYY-MM-DD, where |
| 279 | | * DD and MM as well as a second date are optional) |
| | 279 | * DD and MM as well as a second date are optional). |
| | 280 | * |
| | 281 | * Also used as time filter for WMS time={time} parameter (such as Sentinel-2) |
| 280 | 282 | * @since 11570 |
| 281 | 283 | */ |
| 282 | 284 | private String date; |
diff --git a/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java b/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java
index 23f1103f5..94391d4fa 100644
|
a
|
b
|
|
| 21 | 21 | import org.openstreetmap.josm.data.projection.ProjectionRegistry; |
| 22 | 22 | import org.openstreetmap.josm.gui.layer.WMSLayer; |
| 23 | 23 | import org.openstreetmap.josm.tools.CheckParameterUtil; |
| | 24 | import org.openstreetmap.josm.tools.Utils; |
| 24 | 25 | |
| 25 | 26 | /** |
| 26 | 27 | * Tile Source handling WMS providers |
| … |
… |
|
| 29 | 30 | * @since 8526 |
| 30 | 31 | */ |
| 31 | 32 | public class TemplatedWMSTileSource extends AbstractWMSTileSource implements TemplatedTileSource { |
| 32 | | private final Map<String, String> headers = new ConcurrentHashMap<>(); |
| 33 | | private final Set<String> serverProjections; |
| 34 | 33 | // CHECKSTYLE.OFF: SingleSpaceSeparator |
| 35 | 34 | private static final Pattern PATTERN_HEADER = Pattern.compile("\\{header\\(([^,]+),([^}]+)\\)\\}"); |
| 36 | 35 | private static final Pattern PATTERN_PROJ = Pattern.compile("\\{proj\\}"); |
| … |
… |
|
| 42 | 41 | private static final Pattern PATTERN_N = Pattern.compile("\\{n\\}"); |
| 43 | 42 | private static final Pattern PATTERN_WIDTH = Pattern.compile("\\{width\\}"); |
| 44 | 43 | private static final Pattern PATTERN_HEIGHT = Pattern.compile("\\{height\\}"); |
| | 44 | private static final Pattern PATTERN_TIME = Pattern.compile("\\{time\\}"); // Sentinel-2 |
| 45 | 45 | private static final Pattern PATTERN_PARAM = Pattern.compile("\\{([^}]+)\\}"); |
| 46 | 46 | // CHECKSTYLE.ON: SingleSpaceSeparator |
| 47 | 47 | |
| 48 | 48 | private static final NumberFormat LATLON_FORMAT = new DecimalFormat("###0.0000000", new DecimalFormatSymbols(Locale.US)); |
| 49 | 49 | |
| 50 | 50 | private static final Pattern[] ALL_PATTERNS = { |
| 51 | | PATTERN_HEADER, PATTERN_PROJ, PATTERN_WKID, PATTERN_BBOX, PATTERN_W, PATTERN_S, PATTERN_E, PATTERN_N, PATTERN_WIDTH, PATTERN_HEIGHT |
| | 51 | PATTERN_HEADER, PATTERN_PROJ, PATTERN_WKID, PATTERN_BBOX, |
| | 52 | PATTERN_W, PATTERN_S, PATTERN_E, PATTERN_N, |
| | 53 | PATTERN_WIDTH, PATTERN_HEIGHT, PATTERN_TIME, |
| 52 | 54 | }; |
| 53 | 55 | |
| | 56 | private final Set<String> serverProjections; |
| | 57 | private final Map<String, String> headers = new ConcurrentHashMap<>(); |
| | 58 | private final String date; |
| 54 | 59 | private final boolean switchLatLon; |
| | 60 | |
| 55 | 61 | /** |
| 56 | 62 | * Creates a tile source based on imagery info |
| 57 | 63 | * @param info imagery info |
| … |
… |
public TemplatedWMSTileSource(ImageryInfo info, Projection tileProjection) {
|
| 61 | 67 | super(info, tileProjection); |
| 62 | 68 | this.serverProjections = new TreeSet<>(info.getServerProjections()); |
| 63 | 69 | this.headers.putAll(info.getCustomHttpHeaders()); |
| | 70 | this.date = info.getDate(); |
| 64 | 71 | handleTemplate(); |
| 65 | 72 | initProjection(); |
| 66 | 73 | // Bounding box coordinates have to be switched for WMS 1.3.0 EPSG:4326. |
| … |
… |
public String getTileUrl(int zoom, int tilex, int tiley) {
|
| 143 | 150 | case "height": |
| 144 | 151 | replacement = String.valueOf(getTileSize()); |
| 145 | 152 | break; |
| | 153 | case "time": |
| | 154 | replacement = Utils.encodeUrl(date); |
| | 155 | break; |
| 146 | 156 | default: |
| 147 | 157 | replacement = '{' + matcher.group(1) + '}'; |
| 148 | 158 | } |