1 package fr.ifremer.dali.map.osm;
2
3 import org.apache.commons.lang3.StringUtils;
4 import org.apache.http.HttpEntity;
5 import org.apache.http.HttpResponse;
6 import org.apache.http.client.methods.HttpGet;
7 import org.apache.http.impl.client.CloseableHttpClient;
8 import org.apache.http.impl.client.HttpClientBuilder;
9 import org.geotools.tile.Tile;
10 import org.geotools.tile.TileIdentifier;
11 import org.geotools.tile.impl.ZoomLevel;
12 import org.geotools.tile.impl.osm.OSMTile;
13
14 import javax.imageio.ImageIO;
15 import javax.imageio.stream.ImageInputStream;
16 import java.awt.image.BufferedImage;
17 import java.io.IOException;
18 import java.io.InputStream;
19 import java.net.URL;
20
21
22
23
24
25
26 public class OSMTile2 extends OSMTile {
27
28 private final OSMService2 service;
29
30 public OSMTile2(int x, int y, ZoomLevel zoomLevel, OSMService2 service) {
31 super(x, y, zoomLevel, service);
32 this.service = service;
33 }
34
35 public OSMTile2(TileIdentifier tileName, OSMService2 service) {
36 super(tileName, service);
37 this.service = service;
38 }
39
40 @Override
41 public URL getUrl() {
42 String url = this.service.getBaseUrl() + getTileIdentifier().getCode() + service.getImageExtension();
43
44
45 if (StringUtils.isNotBlank(service.getApiKey()))
46 url += "?key=" + service.getApiKey();
47
48 try {
49 return new URL(url);
50 } catch (Exception e) {
51 final String mesg = "Cannot create URL from " + url;
52 throw new RuntimeException(mesg, e);
53 }
54 }
55
56 @Override
57 public BufferedImage loadImageTileImage(Tile tile) throws IOException {
58 CloseableHttpClient client =HttpClientBuilder.create()
59 .setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36")
60 .build();
61
62 HttpGet request = new HttpGet(getUrl().toExternalForm());
63 HttpResponse response = client.execute(request);
64 HttpEntity entity = response.getEntity();
65 InputStream istream = entity.getContent();
66
67 ImageInputStream stream = ImageIO.createImageInputStream(istream);
68 BufferedImage bi;
69 try {
70 bi = ImageIO.read(stream);
71 if (bi == null) {
72 stream.close();
73 }
74 } finally {
75 istream.close();
76 }
77 return bi;
78
79 }
80
81 }