package org.osm2world.core.map_data.creation; import org.openstreetmap.osmosis.core.domain.v0_6.Bound; import org.osm2world.core.ConversionFacade; import org.osm2world.core.osm.data.OSMData; import org.osm2world.core.osm.data.OSMNode; /** * abstract map projection superclass with configurable coordinate origin */ public abstract class OriginMapProjection implements MapProjection { /** * the origin. * * TODO make this final when future Java versions offer a replacement for * current factories in {@link ConversionFacade} */ protected LatLon origin; @Override public LatLon getOrigin() { return origin; } /** * sets a new origin. */ public void setOrigin(LatLon origin) { this.origin = origin; } /** * sets a new origin. It is placed at the center of the bounds, * or else at the first node's coordinates. */ public void setOrigin(OSMData osmData) { if (osmData.getBounds() != null && !osmData.getBounds().isEmpty()) { Bound firstBound = osmData.getBounds().iterator().next(); setOrigin(new LatLon( (firstBound.getTop() + firstBound.getBottom()) / 2, (firstBound.getLeft() + firstBound.getRight()) / 2)); } else { if (osmData.getNodes().isEmpty()) { throw new IllegalArgumentException( "OSM data must contain bounds or nodes"); } OSMNode firstNode = osmData.getNodes().iterator().next(); setOrigin(new LatLon(firstNode.lat, firstNode.lon)); } } }