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}