Java GeoTools中的OpenStreetMap图层
我试图在一个使用GeoTools的Java应用程序的地图中显示一个OSM层作为背景层 我的出发点是和 因此,我的课堂重现我的问题非常简单:Java GeoTools中的OpenStreetMap图层,java,openstreetmap,geotools,Java,Openstreetmap,Geotools,我试图在一个使用GeoTools的Java应用程序的地图中显示一个OSM层作为背景层 我的出发点是和 因此,我的课堂重现我的问题非常简单: public class OsmMapFrame { public static void main(String args[]) { String baseURL = "https://tile.openstreetmap.org/"; TileService service = new OSMService("OSM", base
public class OsmMapFrame
{
public static void main(String args[])
{
String baseURL = "https://tile.openstreetmap.org/";
TileService service = new OSMService("OSM", baseURL);
MapContent map = new MapContent();
map.addLayer(new TileLayer(service));
JMapFrame.showMap(map);
}
}
当我运行此命令时,会出现以下错误:
2019-10-28T13:44:15.809+0100 SEVERE Failed to load image: https://tile.openstreetmap.org/2/3/0.png
java.io.IOException: Can't create an ImageInputStream!
at org.geotools.image.io.ImageIOExt.read(ImageIOExt.java:339)
at org.geotools.image.io.ImageIOExt.readBufferedImage(ImageIOExt.java:402)
at org.geotools.tile.Tile.loadImageTileImage(Tile.java:175)
at org.geotools.tile.Tile.getBufferedImage(Tile.java:163)
at org.geotools.tile.util.TileLayer.getTileImage(TileLayer.java:143)
at org.geotools.tile.util.TileLayer.renderTile(TileLayer.java:131)
at org.geotools.tile.util.TileLayer.renderTiles(TileLayer.java:125)
at org.geotools.tile.util.TileLayer.draw(TileLayer.java:86)
at org.geotools.renderer.lite.CompositingGroup$WrappingDirectLayer.draw(CompositingGroup.java:228)
at org.geotools.renderer.lite.StreamingRenderer$RenderDirectLayerRequest.execute(StreamingRenderer.java:3850)
at org.geotools.renderer.lite.StreamingRenderer$PainterThread.run(StreamingRenderer.java:3911)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
我假设在我的pom中缺少依赖项?目前,我在我的pom.xml
中使用了以下GeoTools依赖项
...
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-swing</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-tile-client</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
...
。。。
org.geotools
我刚刚尝试了你的代码和我的一个旧tileviewer,我得到了与你相同的错误。我尝试将日志记录级别调高,但这对无效的错误消息没有任何影响
看起来好像Java8ImageIO或OSM提供瓷砖的方式发生了变化
我尝试了以下代码:
URL url = new URL("https://tile.openstreetmap.org/1/1/0.png");
Iterator<ImageReader> itr = ImageIO.getImageReadersByFormatName("png");
while (itr.hasNext()) {
ImageReader next = itr.next();
System.out.println(next.getFormatName());
next.setInput(url.openStream());
BufferedImage img = next.read(0);
}
很明显,出现了一些问题,但我不确定是什么问题。看起来您的请求被拒绝了,可能是因为OSM服务器怀疑您的批量下载?可能是由于用户代理字符串或缺少referer?
Oct 30, 2019 5:45:18 PM sun.net.www.protocol.http.HttpURLConnection writeRequests
FINE: sun.net.www.MessageHeader@2974f2215 pairs: {GET /1/1/0.png HTTP/1.1: null}{User-Agent: Java/1.8.0_222}{Host: tile.openstreetmap.org}{Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2}{Connection: keep-alive}
Oct 30, 2019 5:45:18 PM sun.net.www.protocol.http.HttpURLConnection getInputStream0
FINE: sun.net.www.MessageHeader@58fe04997 pairs: {null: HTTP/1.1 429 Too Many Requests}{Server: nginx}{Date: Wed, 30 Oct 2019 17:45:18 GMT}{Content-Type: text/html}{Content-Length: 162}{Connection: keep-alive}{Strict-Transport-Security: max-age=31536000; includeSubDomains; preload}
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 429 for URL: https://tile.openstreetmap.org/1/1/0.png
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1900)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1498)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:268)
at java.net.URL.openStream(URL.java:1057)
at spike.OsmMapFrame.main(OsmMapFrame.java:32)