Mercurial > dive4elements > gnv-client
view gnv-artifacts/src/main/java/de/intevation/gnv/utils/DistanceCalculator.java @ 605:e8ebdbc7f1e3
First step of removing the cache blob. The static part of the describe document will be created by using the input data stored at each state. Some TODOs left (see ChangeLog).
gnv-artifacts/trunk@671 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Tue, 09 Feb 2010 14:27:55 +0000 |
parents | 1ab23cd66870 |
children | 9a828e5a2390 |
line wrap: on
line source
/** * */ package de.intevation.gnv.utils; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Coordinate; import java.util.List; /** * @author Tim Englich <tim.englich@intevation.de> * */ public class DistanceCalculator { private final static double flattening = 1.0 / 298.257233563; private final static double earthRadius = 6378137.0 / 1000.0 ; /** * Constructor */ public DistanceCalculator() { } public static double calculateDistance(Point p1, Point p2){ return calculateDistance(p1.getCoordinate(), p2.getCoordinate()); } public static double calculateDistance(Coordinate p1, Coordinate p2){ double resultValue = 0.0; double b1 = p1.y; double b2 = p2.y; double l1 = p1.x; double l2 = p2.x; double F = (b1 + b2) / 2.0; double G = (b1 - b2) / 2.0; double l = (l1 - l2) / 2.0; F = (Math.PI / 180.0) * F; G = (Math.PI / 180.0) * G; l = (Math.PI / 180.0) * l; double S = ((Math.sin(G) * Math.sin(G)) * ((Math.cos(l) * Math.cos(l))))+ ((Math.cos(F) * Math.cos(F)) * ((Math.sin(l) * Math.sin(l)))); double C = ((Math.cos(G) * Math.cos(G)) * ((Math.cos(l) * Math.cos(l))))+ ((Math.sin(F) * Math.sin(F)) * ((Math.sin(l) * Math.sin(l)))); double w = Math.atan(Math.sqrt((S/C))); double D = 2.0 * w * earthRadius; double R = Math.sqrt((S*C)) / w; double H1 = (3.0 * R - 1.0 ) / (2.0 * C); double H2 = (3.0 * R + 1.0 ) / (2.0 * S); resultValue = D * (1 + (flattening * H1 * (Math.sin(F) * Math.sin(F)) * (Math.cos(G) * Math.cos(G))) - (flattening * H2 * (Math.cos(F) * Math.cos(F)) * (Math.sin(G) * Math.sin(G)))); return resultValue; } public static final double calculateDistance(List<Coordinate> path) { int N = path.size(); if (N < 2) { return 0d; } double sum = 0d; for (int i = 1; i < N; ++i) { sum += calculateDistance(path.get(i-1), path.get(i)); } return sum; } }