All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mapfish.print.map.geotools.grid.GridParam Maven / Gradle / Ivy

There is a newer version: 3.22.0
Show newest version
package org.mapfish.print.map.geotools.grid;

import com.vividsolutions.jts.util.Assert;
import org.geotools.referencing.CRS;
import org.geotools.referencing.operation.transform.IdentityTransform;
import org.mapfish.print.map.AbstractLayerParams;
import org.mapfish.print.parser.HasDefaultValue;
import org.mapfish.print.parser.OneOf;
import org.mapfish.print.parser.Requires;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;

import java.util.Arrays;
import java.util.IllegalFormatException;

/**
 * Parameters relevant to creating Grid layers.
 */
public final class GridParam extends AbstractLayerParams {
    /**
     * Grid label default format pattern for the unit (if valueFormat is used).
     */
    public static final String DEFAULT_UNIT_FORMAT = " %s";
    private static final int DEFAULT_POINTS_IN_GRID_LINE = 10000;
    private static final int DEFAULT_HALO_RADIUS = 1;
    private static final int DEFAULT_INDENT = 5;
    private static final String DEFAULT_HALO_COLOR = "#FFF";
    private static final String DEFAULT_LABEL_COLOR = "#444";
    private static final String DEFAULT_GRID_COLOR = "gray";
    /**
     * The type of grid to render.  By default it is LINES
     */
    @HasDefaultValue
    public GridType gridType = GridType.LINES;
    /**
     * The x,y spacing between grid lines.
     * 

* Either {@link #spacing} or {@link #numberOfLines} *

* If spacing is defined then {@link #origin} must also be defined */ @OneOf("spacing") @Requires("origin") public double[] spacing; /** * The x,y point of grid origin. *

* This is required if {@link #spacing} is defined. */ @HasDefaultValue public double[] origin; /** * The x,y number of grid lines. *

* The x is the number of lines that run vertically along the page. */ @OneOf("spacing") public int[] numberOfLines; /** * The style name of a style to apply to the features during rendering. The style name must map to a * style in the template or the configuration objects. *

* If no style is defined then the default grid style will be used. The default will depend if the type * is point or line and will respect {@link #gridColor} and {@link #haloColor} and {@link #haloRadius}. If * {@link #gridType} is {@link GridType#POINTS} then the style will be crosses with a haloRadius sized * halo around the cross. If {@link GridType#LINES} then the style will be a dashed line with no halo. *

*/ @HasDefaultValue public String style; /** * Indicates if the layer is rendered as SVG. *

* (will default to {@link org.mapfish.print.config.Configuration#defaultToSvg}). */ @HasDefaultValue public Boolean renderAsSvg = false; /** * The number of points that will be in the grid line (if the gridType is LINES). If the line will be * curved (for certain projections) then the more points the smoother the curve. *

* The default number of points is {@value #DEFAULT_POINTS_IN_GRID_LINE}. */ @HasDefaultValue public int pointsInLine = DEFAULT_POINTS_IN_GRID_LINE; /** * The size of the halo around the Grid Labels. The default is {@value #DEFAULT_HALO_RADIUS}. */ @HasDefaultValue public double haloRadius = DEFAULT_HALO_RADIUS; /** * The color of the halo around grid label text. The color is defined the same as colors in CSS. Default * is white ({@value #DEFAULT_HALO_COLOR}) */ @HasDefaultValue public String haloColor = DEFAULT_HALO_COLOR; /** * The color of the grid label text. Default is dark gray ({@value #DEFAULT_LABEL_COLOR}) */ @HasDefaultValue public String labelColor = DEFAULT_LABEL_COLOR; /** * The color of the grid points or lines. Default is gray ({@value #DEFAULT_GRID_COLOR}) */ @HasDefaultValue public String gridColor = DEFAULT_GRID_COLOR; /** * Configuration for the font of the grid labels. The default is the default system font. */ @HasDefaultValue public GridFontParam font = new GridFontParam(); /** * The number of pixels to indent the grid labels from the end of the map. The default is {@value * #DEFAULT_INDENT}. */ @HasDefaultValue public int indent = DEFAULT_INDENT; /** * The projection code to use for the labels. The value should be the string authority:code * form identifying the projection. By default it will be the same projection as the map. */ @HasDefaultValue public String labelProjection = null; /** * The formatting string used to format the label (for example "%1.2f %s"). By default the label is * formatted according to the unit and label value. For the format syntax, see * java.util.Formatter. * If labelFormat is set, valueFormat, unitFormat and custom * separator characters will be ignored. */ @HasDefaultValue public String labelFormat = null; /** * The formatting string used to format the decimal part of a label (for example "###,###"). This * parameter is ignored if labelFormat is set. For the format syntax, see * DecimalFormat. */ @HasDefaultValue public String valueFormat = null; /** * The formatting string used to format the unit part of a label (for example " %s"). This parameter is * ignored if labelFormat is set. valueFormat must be set to use this parameter. * For the format syntax, see * java.util.Formatter. */ @HasDefaultValue public String unitFormat = null; /** * The character used to separate the decimal part (for example ","). This parameter is only used if * valueFormat is used. The default is the character of the default locale. */ @HasDefaultValue public String formatDecimalSeparator = null; /** * The character used for the thousands separator (for example "'"). This parameter is only used if * valueFormat is used. The default is the character of the default locale. */ @HasDefaultValue public String formatGroupingSeparator = null; /** * By default the normal axis order as specified in EPSG code will be used when parsing projections. * However the requestor can override this by explicitly declaring that longitude axis is first. */ @HasDefaultValue public Boolean longitudeFirst = null; /** * If true (the default), the labels will be rotated to follow the lines they belong to. Otherwise they * are orientated west to east. */ @HasDefaultValue public boolean rotateLabels = true; /** * Apply an X offset to the vertical grid line labels, relative to the vertical grid lines. Defaults to * 0. */ @HasDefaultValue public double verticalXOffset = 0; /** * Apply an Y offset to horizontal grid line labels, relative to the horizontal grid lines. Defaults to * 0. */ @HasDefaultValue public double horizontalYOffset = 0; private GridLabelFormat gridLabelFormat = null; private CoordinateReferenceSystem labelCRS; /** * Initialize default values and validate that config is correct. */ public void postConstruct() { Assert.isTrue(this.spacing == null || this.spacing.length == 2, GridLayer.class.getSimpleName() + ".spacing has the wrong number of elements. Expected 2 (x,y) but was: " + Arrays.toString(this.spacing)); Assert.isTrue(this.numberOfLines == null || this.numberOfLines.length == 2, GridLayer.class.getSimpleName() + ".numberOfLines has the wrong number of elements. Expected 2 (x,y) but was: " + Arrays.toString(this.numberOfLines)); Assert.isTrue(this.pointsInLine > 2, "There must be at least 2 points in a line. There were: " + this.pointsInLine); Assert.isTrue(this.indent >= 0, "The indent is not permitted to be negative: " + this.indent); Assert.isTrue(this.labelColor != null, "labelColor should not be null"); Assert.isTrue(this.haloColor != null, "haloColor should not be null"); Assert.isTrue(this.font != null, "font should not be null"); try { if (this.labelProjection != null) { if (this.longitudeFirst != null) { this.labelCRS = CRS.decode(this.labelProjection, this.longitudeFirst); } else { this.labelCRS = CRS.decode(this.labelProjection); } } } catch (FactoryException e) { throw new IllegalArgumentException("The projection code: " + this.labelProjection + " is not valid. Error message when parsing code: " + e.getMessage()); } if (this.labelFormat != null || this.valueFormat != null || this.unitFormat != null) { GridLabelFormat format = GridLabelFormat.fromConfig(this); if (format == null) { throw new IllegalArgumentException("`labelFormat` or `valueFormat` must be set"); } try { format.format(2.0, "m"); } catch (IllegalFormatException e) { throw new IllegalArgumentException("Invalid label format"); } this.gridLabelFormat = format; } } /** * Determine which unit to use when creating grid labels. * * @param mapCrs the crs of the map, used if the {@link #labelProjection} is not defined. */ public String calculateLabelUnit(final CoordinateReferenceSystem mapCrs) { String unit; if (this.labelProjection != null) { unit = this.labelCRS.getCoordinateSystem().getAxis(0).getUnit().toString(); } else { unit = mapCrs.getCoordinateSystem().getAxis(0).getUnit().toString(); } return unit; } /** * Determine which math transform to use when creating the coordinate of the label. * * @param mapCrs the crs of the map, used if the {@link #labelProjection} is not defined. */ public MathTransform calculateLabelTransform(final CoordinateReferenceSystem mapCrs) { MathTransform labelTransform; if (this.labelProjection != null) { try { labelTransform = CRS.findMathTransform(mapCrs, this.labelCRS, true); } catch (FactoryException e) { throw new RuntimeException(e); } } else { labelTransform = IdentityTransform.create(2); } return labelTransform; } public GridLabelFormat getGridLabelFormat() { return this.gridLabelFormat; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy