001package armyc2.c5isr.web.render;
002
003import armyc2.c5isr.renderer.utilities.RendererSettings;
004
005public class GeoPixelConversion {
006
007    public static final double INCHES_PER_METER = 39.3700787;
008    public static final double METERS_PER_DEG = 40075017d / 360d; // Earth's circumference in meters / 360 degrees
009
010    public static double metersPerPixel(double scale) {
011        double step1 = scale / RendererSettings.getInstance().getDeviceDPI();
012        return step1 / INCHES_PER_METER;
013    }
014
015    public static double lat2y(double latitude, double scale, double latOrigin, double metPerPix) {
016
017        double latRem = -(latitude - latOrigin);
018        double pixDis = (latRem * METERS_PER_DEG) / metPerPix;
019        return pixDis;
020    }
021
022    public static double y2lat(double yPosition, double scale, double latOrigin, double metPerPix) {
023
024        double latitude = latOrigin - ((yPosition * metPerPix) / METERS_PER_DEG);        
025        return latitude;
026    }
027
028    public static double long2x(double longitude, double scale, double longOrigin, double latitude, double metPerPix, boolean normalize) {
029        
030        double longRem = longitude-longOrigin;
031        if(normalize)
032        {
033            if (longRem > 180) {
034                longRem -= 360;
035            }
036            if (longRem < -180) {
037                longRem += 360;
038            }        
039        }
040        double metersPerDeg = GetMetersPerDegAtLat(latitude);
041        double pixDis = (longRem * metersPerDeg) / metPerPix;
042        return pixDis;
043    }
044
045    public static double x2long(double xPosition, double scale, double longOrigin, double latitude, double metPerPix) {
046        
047        double metersPerDeg = GetMetersPerDegAtLat(latitude);
048        double longitude = longOrigin + ((xPosition * metPerPix) / metersPerDeg);
049
050        if (longitude < -180) {
051            longitude += 360;
052        } else if (longitude > 180) {
053            longitude -= 360;
054        }
055
056        return longitude;
057    }
058
059    public static double Deg2Rad(double deg) {
060        double conv_factor = (2.0 * Math.PI) / 360.0;
061        return (deg * conv_factor);
062    }
063
064    public static double GetMetersPerDegAtLat(double lat) {
065        // Convert latitude to radians
066        lat = Deg2Rad(lat);
067        // Set up "Constants"
068        double p1 = 111412.84; // longitude calculation term 1
069
070        double p2 = -93.5; // longitude calculation term 2
071
072        double p3 = 0.118; // longitude calculation term 3
073
074        // Calculate the length of a degree of longitude in meters at given
075        // latitude
076        double longlen = (p1 * Math.cos(lat)) + (p2 * Math.cos(3 * lat)) + (p3 * Math.cos(5 * lat));
077
078        return longlen;
079    }
080}