001 // License: GPL. Copyright 2007 by Immanuel Scholz and others 002 package org.openstreetmap.josm.data.coor; 003 004 import org.openstreetmap.josm.Main; 005 import org.openstreetmap.josm.data.projection.Projection; 006 007 /** 008 * LatLon class that maintains a cache of projected EastNorth coordinates. 009 * 010 * This class is convenient to use, but has relatively high memory costs. 011 * It keeps a pointer to the last known projection in order to detect projection 012 * changes. 013 * 014 * Node and WayPoint have another, optimized, cache for projected coordinates. 015 */ 016 public class CachedLatLon extends LatLon { 017 private EastNorth eastNorth; 018 private Projection proj; 019 020 public CachedLatLon(double lat, double lon) { 021 super(lat, lon); 022 } 023 024 public CachedLatLon(LatLon coor) { 025 super(coor.lat(), coor.lon()); 026 proj = null; 027 } 028 029 public CachedLatLon(EastNorth eastNorth) { 030 super(Main.getProjection().eastNorth2latlon(eastNorth)); 031 proj = Main.getProjection(); 032 this.eastNorth = eastNorth; 033 } 034 035 public final void setCoor(LatLon coor) { 036 setLocation(coor.lon(), coor.lat()); 037 proj = null; 038 } 039 040 public final void setEastNorth(EastNorth eastNorth) { 041 proj = Main.getProjection(); 042 this.eastNorth = eastNorth; 043 LatLon l = proj.eastNorth2latlon(eastNorth); 044 setLocation(l.lon(), l.lat()); 045 } 046 047 /** 048 * Replies the projected east/north coordinates. 049 * 050 * @return the internally cached east/north coordinates. null, if the globally defined projection is null 051 */ 052 public final EastNorth getEastNorth() { 053 if(proj != Main.getProjection()) 054 { 055 proj = Main.getProjection(); 056 eastNorth = proj.latlon2eastNorth(this); 057 } 058 return eastNorth; 059 } 060 @Override public String toString() { 061 return "CachedLatLon[lat="+lat()+",lon="+lon()+"]"; 062 } 063 064 // Only for Node.get3892DebugInfo() 065 public Projection getProjection() { 066 return proj; 067 } 068 }