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
相关产品推荐
相关产品推荐

