view gnv-artifacts/src/main/java/de/intevation/gnv/utils/DistanceCalculator.java @ 364:2413273f1c13

Workarround: Store lower and upper bounds of data while iterating over all data and set the max range of axes with these information. JFreeCharts method NumberAxis.setAutoRange(true) doesn't seem to work properly. gnv-artifacts/trunk@439 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 16 Dec 2009 11:58:44 +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;
    }

}

http://dive4elements.wald.intevation.org