使用 GTRenderer 渲染 OSM 瓦片
Render OSM tiles using GTRenderer
我正在尝试以这种方式使用 GTRenderer 渲染 OSM 瓦片:
MapContent map = new MapContent();
String baseURL = "http://<url>"; // OSM url
TileService service = new OSMService("OSM", baseURL);
TileLayer tileLayer = new TileLayer(service);
map.addLayer(tileLayer);
然后我将我的map
发送给
public static void saveImage(final MapContent map,
final String file,
ReferencedEnvelope envelope,
final int imageWidth,
String formatName) {
GTRenderer renderer = new StreamingRenderer();
renderer.setMapContent(map);
java.awt.Rectangle imageBounds = null;
ReferencedEnvelope mapBounds = null;
try {
mapBounds = envelope;
double heightToWidth = mapBounds.getSpan(1) / mapBounds.getSpan(0);
imageBounds = new java.awt.Rectangle(
0, 0, imageWidth, (int) Math.round(imageWidth * heightToWidth));
} catch (Exception e) {
// failed to access map layers
throw new RuntimeException(e);
}
BufferedImage image = new BufferedImage(imageBounds.width, imageBounds.height, BufferedImage.TYPE_INT_RGB);
Graphics2D gr = image.createGraphics();
gr.setPaint(Color.WHITE);
gr.fill(imageBounds);
try {
renderer.paint(gr, imageBounds, mapBounds);
File fileToSave = new File(file);
ImageIO.write(image, formatName, fileToSave);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
不过它 returns "white space" 图像。
同时,我的 saveImage
程序在 WMS 图层上运行良好。这可能是什么问题?
我还通过
检查了我的 OSM 服务
Tile t = new OSMTile(
new OSMTileIdentifier(79234, 40978, new WebMercatorZoomLevel(17), service.getName()),
service);
BufferedImage image = t.loadImageTileImage(t);
它 returns 正确的瓷砖。
已编辑
我还在日志中发现了以下信息:
[pool-2-thread-1] org.geotools.tile Reached tile limit of 128. Returning an empty collection.
感谢 Ian Turton 关于缩放级别的评论。
我在TileLayer的draw(Graphics2D graphics, MapContent map, MapViewport theViewport)方法中放置了stop-point,发现我的MapViewport不正确。
添加
// map is my MapContent object, envelope is a map's ReferencedEnvelope
imageBounds = new java.awt.Rectangle(
0, 0, imageWidth, (int) Math.round(imageWidth * heightToWidth));
map.getViewport().setScreenArea(imageBounds);
map.getViewport().setBounds(envelope);
解决问题。
我正在尝试以这种方式使用 GTRenderer 渲染 OSM 瓦片:
MapContent map = new MapContent();
String baseURL = "http://<url>"; // OSM url
TileService service = new OSMService("OSM", baseURL);
TileLayer tileLayer = new TileLayer(service);
map.addLayer(tileLayer);
然后我将我的map
发送给
public static void saveImage(final MapContent map,
final String file,
ReferencedEnvelope envelope,
final int imageWidth,
String formatName) {
GTRenderer renderer = new StreamingRenderer();
renderer.setMapContent(map);
java.awt.Rectangle imageBounds = null;
ReferencedEnvelope mapBounds = null;
try {
mapBounds = envelope;
double heightToWidth = mapBounds.getSpan(1) / mapBounds.getSpan(0);
imageBounds = new java.awt.Rectangle(
0, 0, imageWidth, (int) Math.round(imageWidth * heightToWidth));
} catch (Exception e) {
// failed to access map layers
throw new RuntimeException(e);
}
BufferedImage image = new BufferedImage(imageBounds.width, imageBounds.height, BufferedImage.TYPE_INT_RGB);
Graphics2D gr = image.createGraphics();
gr.setPaint(Color.WHITE);
gr.fill(imageBounds);
try {
renderer.paint(gr, imageBounds, mapBounds);
File fileToSave = new File(file);
ImageIO.write(image, formatName, fileToSave);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
不过它 returns "white space" 图像。
同时,我的 saveImage
程序在 WMS 图层上运行良好。这可能是什么问题?
我还通过
检查了我的 OSM 服务Tile t = new OSMTile(
new OSMTileIdentifier(79234, 40978, new WebMercatorZoomLevel(17), service.getName()),
service);
BufferedImage image = t.loadImageTileImage(t);
它 returns 正确的瓷砖。
已编辑
我还在日志中发现了以下信息:
[pool-2-thread-1] org.geotools.tile Reached tile limit of 128. Returning an empty collection.
感谢 Ian Turton 关于缩放级别的评论。 我在TileLayer的draw(Graphics2D graphics, MapContent map, MapViewport theViewport)方法中放置了stop-point,发现我的MapViewport不正确。 添加
// map is my MapContent object, envelope is a map's ReferencedEnvelope
imageBounds = new java.awt.Rectangle(
0, 0, imageWidth, (int) Math.round(imageWidth * heightToWidth));
map.getViewport().setScreenArea(imageBounds);
map.getViewport().setBounds(envelope);
解决问题。