/* * ShareNav - Copyright (c) 2007 Harald Mueller james22 at users dot sourceforge dot net * See COPYING */ package net.sharenav.gps; import net.sharenav.sharenav.mapdata.Entity; import net.sharenav.util.MoreMath; public class Node extends Entity { public float radlat = 0; public float radlon = 0; public final static float NORTH_POLE = 90.0f; public final static float SOUTH_POLE = -NORTH_POLE; public final static float DATELINE = 180.0f; public final static float LON_RANGE = 360.0f; public final static float EQUIVALENT_TOLERANCE = 0.00001f; /** * Constructs a LatLonPoint from raw float lat/lon in decimal degrees. * * @param lat latitude in decimal degrees * @param lon longitude in decimal degrees */ public Node(float lat, float lon) { setLatLonDeg(lat, lon); } /** * Constructs a LatLonPoint from float lat/lon in radians or degrees. * * @param lat latitude in radians * @param lon longitude in radians * @param isRadian placeholder indicates radians */ public Node(float lat, float lon, boolean isRadian) { if (isRadian) { setLatLonRad(lat, lon); } else { setLatLonDeg(lat, lon); } } /** * Constructs a node and copies lat/lon from the other node * @param node */ public Node(Node node) { setLatLon(node); } /** * Constructs a Node with lat=0 / lon=0. */ public Node() { setLatLonRad(0, 0); } public float getLatDeg() { return radlat * MoreMath.FAC_RADTODEC; } public float getLonDeg() { return radlon * MoreMath.FAC_RADTODEC; } public void setLatDeg(float l) { radlat = l * MoreMath.FAC_DECTORAD; } public void setLonDeg(float l) { radlon = l * MoreMath.FAC_DECTORAD; } /** * Set latitude and longitude. * * @param lat latitude in decimal degrees * @param lon longitude in decimal degrees */ public void setLatLonDeg(float lat, float lon) { radlat = normalize_latitude(lat) * MoreMath.FAC_DECTORAD; radlon = wrap_longitude(lon) * MoreMath.FAC_DECTORAD; } /** * Set latitude and longitude. * * @param lat latitude in radians * @param lon longitude in radians */ public void setLatLonRad(float lat, float lon) { radlat = lat; radlon = lon; } /** * Copies latitude and longitude from the passed node. * @param node Node from which lat and lon are taken */ public void setLatLon(Node node) { radlat = node.radlat; radlon = node.radlon; } /** * Sets latitude to something sane. * * @param lat latitude in decimal degrees * @return float normalized latitude in decimal degrees * (−90° ≤ φ ≤ 90°) */ public final static float normalize_latitude(float lat) { if (lat > NORTH_POLE) { lat = NORTH_POLE; } if (lat < SOUTH_POLE) { lat = SOUTH_POLE; } return lat; } /** * Sets longitude to something sane. * * @param lon longitude in decimal degrees * @return float wrapped longitude in decimal degrees * (−180° ≤ λ ≤ 180°) */ public final static float wrap_longitude(float lon) { if ((lon < -DATELINE) || (lon > DATELINE)) { //System.out.print("LatLonPoint: wrapping longitude " + lon); lon += DATELINE; lon = lon % LON_RANGE; lon = (lon < 0) ? DATELINE + lon : -DATELINE + lon; //System.out.println(" to " + lon); } return lon; } public Node copy() { Node n = new Node(); // if (nameIdx != -1) { // n.nameIdx = nameIdx; // } // if (Legend.enableUrlTags) { // if (urlIdx != -1) { // n.urlIdx=urlIdx; // } // } // if (Legend.enablePhoneTags) { // if (phoneIdx != -1) { // n.phoneIdx=phoneIdx; // } // } n.type = type; n.radlat = radlat; n.radlon = radlon; return n; } public String toString() { return ("node: " + radlat * MoreMath.FAC_RADTODEC + "/" + radlon * MoreMath.FAC_RADTODEC); } }