View Javadoc
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   * Overridden OMSTile class allowing apiKey from OSMService2 and tweaking UserAgent property to fix HTTP 403 error when downloading the tile.
23   *
24   * @author peck7 on 15/06/2019.
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          // Add apiKey
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  }