Modern mobile devices are capable of knowing the exact location of the user in terms of latitude and longitude. This opens a whole new set of business opportunities for services and applications. One of many of the needs of these services and applications is calculating the distance between 2 locations. Of course, each location, is described using latitude and longitude.
In order to calculate the distance between 2 locations we will create a class named: Location. The class will mainly contain:
- Inner enumeration named: Unit, which defines 3 possible units in which the distance can be calculated:
- 2 members:
- longitude
- latitude
- 2 static conversion methods:
- deg2rad – Convert digress to radians.
- rad2deg – Convert radians to degrees.
- 2 overloaded methods name distance:
- First method calculates the distance for a given latitude and longitude.
- Second method uses the first method to calculated the distance for a given Location instance.
Let’s have a look at the Location class:
package com.bashan.blog.geo;
public class Location {
private double latitude;private double longitude;
public Location() {
}public Location(double latitude, double longitude) {this.latitude = latitude;
this.longitude = longitude;
}public double distance(double latitude, double longitude, Unit unit) {double theta = this.longitude - longitude;double dist = Math.sin(deg2rad(this.latitude)) * Math.sin(deg2rad(latitude)) +Math.cos(deg2rad(this.latitude)) * Math.cos(deg2rad(latitude)) *
Math.cos(deg2rad(theta));dist = Math.acos(dist);dist = rad2deg(dist) * 60 * 1.1515;switch (unit) {
case KM:
dist = dist * 1.609344;break;
case MILE:
dist = dist * 0.8684;break;
}return (dist);
}public double distance(Location location, Unit unit) {return distance(location.getLatitude(), location.getLongitude(), unit);
}public static double deg2rad(double deg) {return (deg * Math.PI / 180.0);
}public static double rad2deg(double rad) {return (rad * 180.0 / Math.PI);
}public double getLatitude() {return latitude;
}public void setLatitude(double latitude) {this.latitude = latitude;
}public double getLongitude() {return longitude;
}public void setLongitude(double longitude) {this.longitude = longitude;
}@Overridepublic String toString() {
return "Location{" +"latitude=" + latitude +
", longitude=" + longitude +
'}';}public static enum Unit {KM, MILE, NAUTICAL_MILE}}
The Location class can be downloaded from here.
Let’s have a look at a small test program showing how the Location class is used. We will create 2 Location instances, one of Israel and one of Unites States. The location is more or less at the center of each country.
public static void main(String[] args){Location locationIsrael = new Location(31.5, 34.75); // Latitude and longitude of IsraelLocation locationUS = new Location(38, -97); // Latitude and longitude of United StatesSystem.out.print("The distance between Israel and US is: " +
locationIsrael.distance(locationUS, Unit.KM) + " Kilometers");
}
And the output of this program:
The distance between Israel and US is: 10810.089569538533 Kilometers
No comments:
Post a Comment