package org.ianturton.cookbook.distances;
import javax.measure.Measure;
import javax.measure.quantity.Length;
import javax.measure.unit.NonSI;
import javax.measure.unit.SI;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.geotools.referencing.CRS.AxisOrder;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.NoSuchAuthorityCodeException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.TransformException;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
public class OrthodromicDistance {
DefaultGeographicCRS default_crs = DefaultGeographicCRS.WGS84;
/**
* take two pairs of lat/long and return bearing and distance.
*
* @param args
* @throws FactoryException
* @throws NoSuchAuthorityCodeException
*/
public static void main(String[] args)
throws NoSuchAuthorityCodeException, FactoryException {
CoordinateReferenceSystem crs = DefaultGeographicCRS.WGS84;
if (args.length < 4) {
System.err
.println("Need 4 numbers lat_1 lon_1 lat_2 lon_2 [epsgcode]");
return;
}
if (args.length > 4) {
crs = CRS.decode(args[4]);
}
GeometryFactory geomFactory = new GeometryFactory();
Point[] points = new Point[2];
for (int i = 0, k = 0; i < 2; i++, k += 2) {
double x = Double.valueOf(args[k]);
double y = Double.valueOf(args[k + 1]);
if (CRS.getAxisOrder(crs)
.equals(AxisOrder.NORTH_EAST)) {
points[i] = geomFactory.createPoint(new Coordinate(
x, y));
} else {
points[i] = geomFactory.createPoint(new Coordinate(
y, x));
}
}
OrthodromicDistance d = new OrthodromicDistance();
d.calculateDistance(crs, points);
}
private void calculateDistance(
CoordinateReferenceSystem crs, Point[] points) {
if (crs == null) {
crs = default_crs;
}
double distance = 0.0;
try {
distance = JTS.orthodromicDistance(
points[0].getCoordinate(),
points[1].getCoordinate(), crs);
} catch (TransformException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Measure<Double, Length> dist = Measure.valueOf(
distance, SI.METER);
System.out.println(dist.doubleValue(SI.KILOMETER)
+ " Km");
System.out.println(dist.doubleValue(NonSI.MILE)
+ " miles");
}
}