Location.java
package com.cables.gps; public class Location { private int latDegree; private int latMinutes; private int latSeconds; private char latDirection; private int longDegree; private int longMinutes; private int longSeconds; private char longDirection; private float latitude; private float longitude; private void init() throws Exception { latitude = latDegree + (latMinutes / 60.0f) + (latSeconds / 3600.0f); if (latDirection == 'N') { latitude *= 1f; } else if (latDirection == 'S'){ latitude *= -1f; } else { throw new Exception("Invalid Latitude Direction: " + latDirection); } longitude = longDegree + (longMinutes / 60.0f) + (longSeconds / 3600.0f); if (longDirection == 'E') { longitude *= 1f; } else if (longDirection == 'W') { longitude *= -1f; } else { throw new Exception("Invalid Longitude Direction: " + longDirection); } } public String toString() { String returnString = ""; try { init(); } catch (Exception e) { e.printStackTrace(); return null; } returnString += "(" + latitude + ", " + longitude + ")"; return returnString; } public void setLatitude(int deg, int min, int sec, char dir) { latDegree = deg; latMinutes = min; latSeconds = sec; latDirection = dir; } public void setLongitude(int deg, int min, int sec, char dir) { longDegree = deg; longMinutes = min; longSeconds = sec; longDirection = dir; } public int getLatDegree() { return latDegree; } public void setLatDegree(int latDegree) { this.latDegree = latDegree; } public int getLatMinutes() { return latMinutes; } public void setLatMinutes(int latMinutes) { this.latMinutes = latMinutes; } public int getLatSeconds() { return latSeconds; } public void setLatSeconds(int latSeconds) { this.latSeconds = latSeconds; } public char getLatDirection() { return latDirection; } public void setLatDirection(char latDirection) throws Exception { if (latDirection != 'N' && latDirection != 'S') { throw new Exception("Invalid Latitude Direction: " + latDirection); } this.latDirection = latDirection; } public int getLongDegree() { return longDegree; } public void setLongDegree(int longDegree) { this.longDegree = longDegree; } public int getLongMinutes() { return longMinutes; } public void setLongMinutes(int longMinutes) { this.longMinutes = longMinutes; } public int getLongSeconds() { return longSeconds; } public void setLongSeconds(int longSeconds) { this.longSeconds = longSeconds; } public char getLongDirection() { return longDirection; } public void setLongDirection(char longDirection) throws Exception { if (longDirection != 'E' && longDirection != 'W') { throw new Exception("Invalid Longitude Direction: " + longDirection); } this.longDirection = longDirection; } public float getLatitude() throws Exception { init(); return latitude; } public void setLatitude(float latitude) { this.latitude = latitude; } public float getLongitude() throws Exception { init(); return longitude; } public void setLongitude(float longitude) { this.longitude = longitude; } public void setLatString(String latStr) throws Exception { latStr = latStr.trim(); String[] values = latStr.split(" "); latDegree = Integer.parseInt(values[0].trim()); latMinutes = Integer.parseInt(values[1].trim()); latSeconds = Integer.parseInt(values[2].trim()); latDirection = values[3].trim().charAt(0); if (latDirection != 'N' && latDirection != 'S') { throw new Exception("Invalid Latitude Direction: " + latDirection); } } public void setLongString(String longStr) throws Exception { longStr = longStr.trim(); String[] values = longStr.split(" "); longDegree = Integer.parseInt(values[0].trim()); longMinutes = Integer.parseInt(values[1].trim()); longSeconds = Integer.parseInt(values[2].trim()); longDirection = values[3].trim().charAt(0); if (longDirection != 'E' && longDirection != 'W') { throw new Exception("Invalid Longitude Direction: " + longDirection); } } }LocationOps.java
package com.cables.gps; public class LocationOps { private Location location1 = null; private Location location2 = null; private int radius = 6371; public LocationOps(Location location1, Location location2) { this.location1 = location1; this.location2 = location2; } public double calculateDistance() throws Exception { double distance = 0.0; double lat1 = degreesToRadians(location1.getLatitude()); double lat2 = degreesToRadians(location2.getLatitude()); double dLat = degreesToRadians( location2.getLatitude() - location1.getLatitude()); double dLong = degreesToRadians( location2.getLongitude() - location1.getLongitude()); double a = Math.sin(dLat/2.0) * Math.sin(dLat/2.0) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLong/2.0) * Math.sin(dLong/2.0); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); distance = radius * c; return distance; } public double degreesToRadians(double degrees) { double radians = 0.0; radians = degrees * Math.PI / 180.0; return radians; } public static void main(String[] args) throws Exception { Location loc1 = new Location(); loc1.setLatDegree(50); loc1.setLatMinutes(03); loc1.setLatSeconds(59); loc1.setLatDirection('N'); loc1.setLongDegree(005); loc1.setLongMinutes(42); loc1.setLongSeconds(53); loc1.setLongDirection('W'); Location loc2 = new Location(); loc2.setLatDegree(58); loc2.setLatMinutes(38); loc2.setLatSeconds(38); loc2.setLatDirection('N'); loc2.setLongDegree(003); loc2.setLongMinutes(04); loc2.setLongSeconds(12); loc2.setLongDirection('W'); System.out.println(new LocationOps(loc1, loc2).calculateDistance()); loc1.setLatString("50 03 59 N"); loc1.setLongString("005 42 53 W"); loc2.setLatString("58 38 38 N"); loc2.setLongString("003 04 12 W"); System.out.println(new LocationOps(loc1, loc2).calculateDistance()); } }