// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data.projection;
import java.util.HashMap;
import java.util.Map;
import org.openstreetmap.josm.data.ProjectionBounds;
import org.openstreetmap.josm.data.coor.EastNorth;
import org.openstreetmap.josm.data.coor.LatLon;
/**
* This is a projecting instance that shifts the projection by a given eastnorth offset.
* @author Michael Zangl
* @since 10805
*/
public class ShiftedProjecting implements Projecting {
private final Projecting base;
private final EastNorth offset;
/**
* Create a new {@link ShiftedProjecting}
* @param base The base to use
* @param offset The offset to move base. Subtracted when converting lat/lon->east/north.
*/
public ShiftedProjecting(Projecting base, EastNorth offset) {
this.base = base;
this.offset = offset;
}
@Override
public EastNorth latlon2eastNorth(LatLon ll) {
return base.latlon2eastNorth(ll).add(offset);
}
@Override
public LatLon eastNorth2latlonClamped(EastNorth en) {
return base.eastNorth2latlonClamped(en.subtract(offset));
}
@Override
public Projection getBaseProjection() {
return base.getBaseProjection();
}
@Override
public Map<ProjectionBounds, Projecting> getProjectingsForArea(ProjectionBounds area) {
Map<ProjectionBounds, Projecting> forArea = base
.getProjectingsForArea(new ProjectionBounds(area.getMin().subtract(offset), area.getMax().subtract(offset)));
HashMap<ProjectionBounds, Projecting> ret = new HashMap<>();
forArea.forEach((pb, projecting) -> ret.put(
new ProjectionBounds(pb.getMin().add(offset), pb.getMax().add(offset)),
new ShiftedProjecting(projecting, offset)));
return ret;
}
}