001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.data.imagery;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.text.MessageFormat;
007    import java.util.ArrayList;
008    import java.util.List;
009    
010    import org.openstreetmap.gui.jmapviewer.Coordinate;
011    import org.openstreetmap.josm.data.coor.LatLon;
012    import org.openstreetmap.josm.data.osm.Node;
013    import org.openstreetmap.josm.tools.CheckParameterUtil;
014    import org.openstreetmap.josm.tools.Geometry;
015    
016    /**
017     * @author Vincent
018     *
019     */
020    public class Shape {
021    
022        private List<Coordinate> coords = new ArrayList<Coordinate>();
023        
024        public Shape(String asString, String separator) throws IllegalArgumentException {
025            CheckParameterUtil.ensureParameterNotNull(asString, "asString");
026            String[] components = asString.split(separator);
027            if (components.length % 2 != 0)
028                throw new IllegalArgumentException(MessageFormat.format("Even number of doubles expected in string, got {0}: {1}", components.length, asString));
029            for (int i=0; i<components.length; i+=2) {
030                addPoint(components[i], components[i+1]);
031            }
032        }
033    
034        public Shape() {
035        }
036    
037        public String encodeAsString(String separator) {
038            StringBuffer sb = new StringBuffer();
039            for (Coordinate c : coords) {
040                if (sb.length() != 0) {
041                    sb.append(separator);
042                }
043                sb.append(c.getLat()).append(separator).append(c.getLon());
044            }
045            return sb.toString();
046        }
047    
048        public List<Coordinate> getPoints() {
049            return coords;
050        }
051        
052        public boolean contains(LatLon latlon) {
053            if (latlon == null)
054                return false;
055            List<Node> nodes = new ArrayList<Node>(coords.size());
056            for (Coordinate c : coords) {
057                nodes.add(new Node(new LatLon(c.getLat(), c.getLon())));
058            }
059            return Geometry.nodeInsidePolygon(new Node(latlon), nodes);
060        }
061    
062        public void addPoint(String sLat, String sLon) throws IllegalArgumentException {
063            CheckParameterUtil.ensureParameterNotNull(sLat, "sLat");
064            CheckParameterUtil.ensureParameterNotNull(sLon, "sLon");
065    
066            double lat, lon;
067            
068            try {
069                lat = Double.parseDouble(sLat);
070                if (!LatLon.isValidLat(lat))
071                    throw new IllegalArgumentException(tr("Illegal latitude value ''{0}''", lat));
072            } catch (NumberFormatException e) {
073                throw new IllegalArgumentException(MessageFormat.format("Illegal double value ''{0}''", sLat));
074            }
075    
076            try {
077                lon = Double.parseDouble(sLon);
078                if (!LatLon.isValidLon(lon))
079                    throw new IllegalArgumentException(tr("Illegal longitude value ''{0}''", lon));
080            } catch (NumberFormatException e) {
081                throw new IllegalArgumentException(MessageFormat.format("Illegal double value ''{0}''", sLon));
082            }
083            
084            coords.add(new Coordinate(LatLon.roundToOsmPrecision(lat), LatLon.roundToOsmPrecision(lon)));
085        }
086    }