You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Geotools StreamingRenderer渲染EPSG:4326 GeoTIFF异常求助

使用GeoTools StreamingRenderer渲染EPSG:4326 GeoTIFF异常问题

问题描述

使用GeoTools 31.1版本的StreamingRenderer组件渲染GeoTIFF图像时遇到异常:NASA Visible Earth及其他EPSG:4326格式的GeoTIFF均无法正常渲染,但非EPSG:4326的GeoTIFF可正常显示。

具体表现为:生成的图像要么侧翻,当请求完整EPSG:4326范围时则完全无数据。

GeoTIFF的CRS信息

通过GeotiffReader的CRS调用toWKT()方法输出的内容如下:

GEOGCS["WGS 84", 
  DATUM["World Geodetic System 1984",
    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]],
    AUTHORITY["EPSG","6326"]],
  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]],
  UNIT["degree", 0.017453292519943295],
  AXIS["Geodetic latitude", NORTH],
  AXIS["Geodetic longitude", EAST],
  AUTHORITY["EPSG","4326"]]

测试代码

@Test
public void testGeotiffReader() throws IOException, FactoryException {
    Path path = TestSupport.classPathResourceAsFile("/testdata/grids/eo_base.tif").toPath();    
    GridCoverage2DReader reader = GridFormatFinder.findFormat(path.toFile()).getReader(path.toFile());

    ParameterValue bands = GeoTiffFormat.BANDS.createValue();
    bands.setValue(new int[]{0});

    GridCoverage2D coverage = reader.read(new GeneralParameterValue[]{bands});

    //at this point the coverage is rendered in the correct orientation
    Path out = Paths.get("rendered-coverage.png");
    try(FileOutputStream fos= new FileOutputStream(out.toFile())) {
       ImageIO.write(coverage.getRenderedImage(),"PNG",fos);
    }

    ReferencedEnvelope envelope = new ReferencedEnvelope(-180,0,0,90,CRS.decode("EPSG:4326"));
    Rectangle imageDim = new Rectangle(0, 0, 1200, 800);

    MapViewport viewport = new MapViewport(envelope,false);
    MapContent content = new MapContent();
    content.setViewport(viewport);

    StyleFactory sf = CommonFactoryFinder.getStyleFactory();
    FilterFactory ff = CommonFactoryFinder.getFilterFactory();
    ContrastEnhancement ce = sf.contrastEnhancement(ff.literal(1.0), ContrastMethod.NORMALIZE);
    SelectedChannelType sct = sf.createSelectedChannelType(String.valueOf(1), ce);
    RasterSymbolizer sym = sf.getDefaultRasterSymbolizer();
    ChannelSelection sel = sf.channelSelection(sct);
    sym.setChannelSelection(sel);
    Style style = SLD.wrapSymbolizers(sym);

    GridReaderLayer layer = new GridReaderLayer(reader, style);
    content.addLayer(layer);

    StreamingRenderer renderer = new StreamingRenderer();
    renderer.setMapContent(content);

    final BufferedImage image = 
          new BufferedImage(imageDim.width, imageDim.height, BufferedImage.TYPE_INT_ARGB);
    final Graphics2D graphics = image.createGraphics();
    renderer.paint(graphics, imageDim, envelope);

    final ImageWorker iw = new ImageWorker(image);
    iw.prepareForRendering();

    out = Paths.get("streaming-renderer.png");

    /**
     * At this point, the image will be flipped on it's side
     */
    try(FileOutputStream fos = new FileOutputStream(out.toFile())) {
        iw.writePNG(fos, null, 0, false, false);
    }
   
}

渲染结果对比

  • 直接渲染(不使用StreamingRenderer):rendered-coverage.png显示正常,图像方向正确、内容完整
  • 使用StreamingRenderer渲染:streaming-renderer.png图像侧翻;当请求完整EPSG:4326范围时,输出完全空白的图像

已尝试的解决方案

  • 测试不同来源的EPSG:4326 GeoTIFF文件
  • 设置forceXY系统属性
  • 交换ReferencedEnvelope中的坐标顺序

求助问题

请问遗漏了哪些必要配置或步骤?如何让EPSG:4326的GeoTIFF通过StreamingRenderer正确渲染?


内容的提问来源于stack exchange,提问作者Clifford Harms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:56:08