Skip to content

Add new outputformat geotiff-cog#4166

Open
franklgln wants to merge 1 commit into
mapfish:masterfrom
franklgln:feat/geotiff-cog
Open

Add new outputformat geotiff-cog#4166
franklgln wants to merge 1 commit into
mapfish:masterfrom
franklgln:feat/geotiff-cog

Conversation

@franklgln
Copy link
Copy Markdown

This PR adds support for a new GeoTIFF COG output format. (#3805)

The implementation has been reworked to follow the project’s contribution workflow. The changes are based on the latest codebase, target the master branch, and comply with the pre-commit hooks and formatting rules.

All checks pass locally.

final int tileWidth = 512; // fixeded value
final int tileHeight = 512; // fixeded value

File tmp = File.createTempFile("cog-", ".tif");
@sbrunner sbrunner changed the title feat: add new outputformat geotiff-cog Add new outputformat geotiff-cog May 20, 2026
@sbrunner sbrunner requested a review from Copilot May 20, 2026 12:01
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new cog output format intended to generate Cloud Optimized GeoTIFF (COG) results from MapFish Print, wiring the format into the Spring output-format registry and introducing a dedicated JasperReports-backed GeoTIFF exporter.

Changes:

  • Registers new cog output format beans for both standard (JasperReport) and map-export templates.
  • Introduces JasperReportGeoTiffOutputFormat to render a Jasper report to an in-memory image and write it as a GeoTIFF-like output via GeoTools.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 7 comments.

File Description
core/src/main/resources/mapfish-spring-config-output-formats.xml Adds cog output format bean registrations for standard and map-export modes.
core/src/main/java/org/mapfish/print/output/JasperReportGeoTiffOutputFormat.java New output format implementation that renders JasperPrint pages to an image and writes a tiled/compressed GeoTIFF to the response.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread core/src/main/resources/mapfish-spring-config-output-formats.xml
<bean id="tiffMapOutputFormat" class="org.mapfish.print.output.MapExportOutputFormat" scope="prototype"
p:fileSuffix="tiff" p:contentType="image/tiff"/>
<bean id="cogMapOutputFormat" class="org.mapfish.print.output.MapExportOutputFormat" scope="prototype"
p:fileSuffix="cog" p:contentType="image/cog"/>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines +119 to +144
Map<String, org.mapfish.print.attribute.map.MapAttribute.MapAttributeValues> maps =
print.values().find(org.mapfish.print.attribute.map.MapAttribute.MapAttributeValues.class);

if (maps.isEmpty()) {
throw new IllegalStateException("No map found in print values");
}

// Get the first map's bounds
org.mapfish.print.attribute.map.MapAttribute.MapAttributeValues mapValues =
maps.values().iterator().next();
ReferencedEnvelope bbox =
mapValues
.getMapBounds()
.toReferencedEnvelope(
new java.awt.Rectangle(mapValues.getWidth(), mapValues.getHeight()));

String srs = mapValues.getProjection();
LOGGER.info("Map SRS: {}", srs);

try {

bbox.setCoordinateReferenceSystem(CRS.decode(srs));

GridCoverageFactory factory = new GridCoverageFactory();
GridCoverage2D coverage = factory.create("coverage", image, bbox);

Comment on lines +179 to +183
} catch (Exception e) {
LOGGER.error("Error writing GeoTIFF: ", e);
}
LOGGER.info("GeoTIFF written successfully");
}
Comment on lines +149 to +178

// getting a format
final GeoTiffFormat format = new GeoTiffFormat();

// getting the write parameters
final GeoTiffWriteParams wp = new GeoTiffWriteParams();

// setting compression to LZW
wp.setCompressionMode(GeoTiffWriteParams.MODE_EXPLICIT);
wp.setCompressionType("LZW");
wp.setCompressionQuality(0.75F);

// setting the tile size
wp.setTilingMode(GeoToolsWriteParams.MODE_EXPLICIT);
wp.setTiling(tileWidth, tileHeight);

// setting the write parameters for this geotiff
final ParameterValueGroup params = format.getWriteParameters();
params.parameter(AbstractGridFormat.GEOTOOLS_WRITE_PARAMS.getName().toString()).setValue(wp);

GridCoverageWriter writer = null;

writer = format.getWriter(tmp);
writer.write(
coverage,
(GeneralParameterValue[]) params.values().toArray(new GeneralParameterValue[1]));

Files.copy(tmp.toPath(), outputStream);
writer.dispose();
tmp.delete();
Comment on lines +145 to +146
final int tileWidth = 512; // fixeded value
final int tileHeight = 512; // fixeded value
Comment on lines +41 to +45
private String fileSuffix;

@Override
public String getContentType() {
return "image/" + this.fileSuffix;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants