⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twodcoordinate.java

📁 一个基于PlaceLab的室内和室外的智能导航系统
💻 JAVA
字号:
/* * Created on Jun 16, 2004 * */package org.placelab.core;import java.util.Hashtable;import org.placelab.util.NumUtil;/** * The standard coordinate class used on systems with floating * point math support.  If you write an application that only * runs on systems that support floats, you can cast any  * Coordinate into a TwoDCoordinate. */public class TwoDCoordinate implements Coordinate {	private static final double PRECISION = 1E-6;    private double lat, lon;	/** Create a null TwoDCoordinate */	public TwoDCoordinate() {	    this.lat = NULL.lat;	    this.lon = NULL.lon;	}		/**	 * Create a new TwoDCoordinate.	 */	public TwoDCoordinate(double lat, double lon) {	    this.lat = lat;	    this.lon = lon;	}	public TwoDCoordinate(String lat, String lon) {		constructFromStrings(lat, lon);	}	public TwoDCoordinate(String latNMEA, String latHem, String lonNMEA, String lonHem) {		constructFromNMEA(latNMEA, latHem, lonNMEA, lonHem);	}	public TwoDCoordinate(TwoDCoordinate c) {		lat = c.lat;		lon = c.lon;	}	public void constructFromStrings(String lat, String lon) {		this.lat = fromString(lat);		this.lon = fromString(lon);		if (this.lat == Double.NaN || this.lon == Double.NaN) {			// if either is NaN, make sure they are both set to NaN			this.lat = this.lon = Double.NaN;		}	}	public void constructFromMap(Hashtable map) {		constructFromStrings((String)map.get(Types.LATITUDE), (String)map.get(Types.LONGITUDE));	}	public void constructFromNMEA(String latNMEA, String latHem, String lonNMEA, String lonHem) {		lat = fromNMEA(latNMEA, latHem);		lon = fromNMEA(lonNMEA, lonHem);	}	public void moveBy(double xMeters, double yMeters) {		CoordinateTranslator.T.move(this, xMeters, yMeters);	}		public void moveTo(double lat, double lon) {		this.lat = lat;		this.lon = lon;	}	public String getLatitudeAsString() {	    return ""+getLatitude(); 	}	public String getLongitudeAsString() {	    return ""+getLongitude();	}	public String toString() {		return ""+lat+","+lon;	}	public double getLatitude() {		return lat;	}	protected void setLatitude(double lat) {		this.lat = lat;	}	protected void setLongitude(double lon) {		this.lon = lon;	}	public double getLongitude() {		return lon;	}		public boolean equals(Object o) {		if (!(o instanceof TwoDCoordinate)) {			return super.equals(o);		} else {			TwoDCoordinate c = (TwoDCoordinate) o;			return lat == c.lat && lon == c.lon;		}	}	/**	 * Returns the distance between points in meters	 */	public int distanceFromInMeters(Coordinate c2) {	    return (int)distanceFrom((TwoDCoordinate)c2);	}	public String distanceFromAsString(Coordinate c2) {	    return ""+distanceFrom((TwoDCoordinate)c2);	}	public double distanceFrom(TwoDCoordinate c2) {        return (CoordinateTranslator.T.distance(this, c2));	}	public double xDistanceFrom(TwoDCoordinate c2) {		return CoordinateTranslator.T.xDistance(this, c2);	}	public double yDistanceFrom(TwoDCoordinate c2) {		return CoordinateTranslator.T.yDistance(this, c2);	}	/* the following two methods give an estimate of how much the latitude (or longitude) 	 * would change by for the given number of meters around this coordinate	 */ 	public double metersToLatitudeUnits(double meters) {		return CoordinateTranslator.T.metersToLatitudeUnits(this, meters);	}	public double metersToLongitudeUnits(double meters) {		return CoordinateTranslator.T.metersToLongitudeUnits(this, meters);	}	public Coordinate translate(int north, int east) {	    TwoDCoordinate c = new TwoDCoordinate(this);	    CoordinateTranslator.T.move(c,north,east);	    return c;	}	public boolean within(Coordinate coord1, Coordinate coord2) {	    TwoDCoordinate c1 = (TwoDCoordinate) coord1;	    TwoDCoordinate c2 = (TwoDCoordinate) coord2;	    double latMin, latMax, lonMin, lonMax;	    if (c1.lat < c2.lat) {	    	latMin = c1.lat;	    	latMax = c2.lat;	    } else {	    	latMin = c2.lat;	    	latMax = c1.lat;	    }	    if (c1.lon < c2.lon) {	    	lonMin = c1.lon;	    	lonMax = c2.lon;	    } else {	    	lonMin = c2.lon;	    	lonMax = c1.lon;	    }	    return lat >= latMin - PRECISION && lon >= lonMin - PRECISION && lat <= latMax + PRECISION && lon <= lonMax + PRECISION;	}	private double fromNMEA(String numS, String hemisphere) {	    /*double number = Double.parseDouble(numS);		double whole = Math.floor(number / 100.0);				whole += (number - (whole * 100.0)) / 60.0;				return whole * (hemisphere.equalsIgnoreCase("s") ||				hemisphere.equalsIgnoreCase("w") ? -1 : 1);*/	    double number = 0.0;	    try {	        number = Double.parseDouble(numS) / 100.0;	    } catch (NumberFormatException nfe) {	        // its common for the lat and lon fields to be empty from nmea when the	        // device isn't getting good data.  0.0 is fine in this case	        return 0.0;	    } catch (NullPointerException npe) {	        // this happens sometimes too...	        return 0.0;	    }	    double left = Math.floor(number);	    double right = number - left;	    return (left + (right * (10.0 / 6.0))) * 	    	(hemisphere.equalsIgnoreCase("s") || 	    	        hemisphere.equalsIgnoreCase("w") ? -1 : 1);	}	private double fromString(String num) {		double val=Double.NaN;		if (Character.isLetter(num.charAt(0))) {			char hemisphere = num.charAt(0);			if (num.length() < 3) {				return val; // bad bad bad			}			try {				val = Double.parseDouble(num.substring(2));			} catch(NumberFormatException ex) {				return Double.NaN;			}			if (hemisphere == 's' || hemisphere == 'S' ||					hemisphere == 'w' || hemisphere == 'W') {				val = -val;			}		} else {			try {				val = Double.parseDouble(num);			} catch(NumberFormatException ex) {				return Double.NaN;			}		}		return val;	}		public boolean isNull() {		return ((Double.isNaN(lat) && Double.isNaN(lon)) || 		        ((lat == 0.0) && (lon == 0.0)));	}	public static final TwoDCoordinate NULL=new TwoDCoordinate(Double.NaN, Double.NaN);    public Coordinate createClone() {        return new TwoDCoordinate(this);    }    public TwoDCoordinate createCloneAndMove(double xMeters, double yMeters) {    	TwoDCoordinate c = new TwoDCoordinate(this);    	c.moveBy(xMeters, yMeters);    	return c;    }    private String toNMEA(double value) {        double hours = Math.floor(value);        double minutes = (value - hours) * (6.0 / 10.0);        double ans = (hours + minutes) * 100.0;        return NumUtil.doubleToString(ans, 3);    }        /* (non-Javadoc)     * @see org.placelab.core.Coordinate#getLatitudeNMEA()     */    public String getLatitudeNMEA() {        return toNMEA(lat);    }    /* (non-Javadoc)     * @see org.placelab.core.Coordinate#getLongitudeNMEA()     */    public String getLongitudeNMEA() {        return toNMEA(lon);    }    /* (non-Javadoc)     * @see org.placelab.core.Coordinate#getLatitudeHemisphereNMEA()     */    public String getLatitudeHemisphereNMEA() {        return lat > 0 ? "N" : "S";    }    /* (non-Javadoc)     * @see org.placelab.core.Coordinate#getLongitudeHemisphereNMEA()     */    public String getLongitudeHemisphereNMEA() {        return lon > 0 ? "E" : "W";    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -