/** * Build a buffer around a geometry * * @param crs * @param geometry * @param distanceUnits * @param distance * @return * @throws TransformException */ public static final Pair<Geometry, Double> buffer( final CoordinateReferenceSystem crs, final Geometry geometry, final String distanceUnits, final double distance) throws TransformException { Unit<Length> unit; try { unit = lookup(distanceUnits); } catch (final Exception e) { unit = Units.METRE; LOGGER.warn("Cannot lookup unit of measure " + distanceUnits, e); } final double meterDistance = unit.getConverterTo(Units.METRE).convert(distance); final double degrees = distanceToDegrees(crs, geometry, meterDistance); // buffer does not respect the CRS; it uses simple cartesian math. // nor does buffer handle dateline boundaries return Pair.of(adjustGeo(crs, geometry.buffer(degrees)), degrees); }