| | 969 | |
|---|
| | 970 | OpenLayers.Util.PI = Math.PI; |
|---|
| | 971 | OpenLayers.Util.HALF_PI = OpenLayers.Util.PI * 0.5; |
|---|
| | 972 | OpenLayers.Util.TWO_PI = OpenLayers.Util.PI * 2.0; |
|---|
| | 973 | OpenLayers.Util.EPSLN = 1.0e-10; |
|---|
| | 974 | OpenLayers.Util.D2R = 0.0174532925199; |
|---|
| | 975 | |
|---|
| | 976 | // Function to compute the constant small t for use in the forward |
|---|
| | 977 | // computations in the Lambert Conformal Conic and the Polar |
|---|
| | 978 | // Stereographic projections. |
|---|
| | 979 | // ----------------------------------------------------------------- |
|---|
| | 980 | OpenLayers.Util.tsfnz = function(eccent, phi, sinphi) { |
|---|
| | 981 | var con = eccent * sinphi; |
|---|
| | 982 | var com = .5 * eccent; |
|---|
| | 983 | con = Math.pow(((1.0 - con) / (1.0 + con)), com); |
|---|
| | 984 | return (Math.tan(.5 * (OpenLayers.Util.HALF_PI - phi)) / con); |
|---|
| | 985 | } |
|---|
| | 986 | |
|---|
| | 987 | OpenLayers.Util.adjust_lon = function(x) { |
|---|
| | 988 | var x = (Math.abs(x) < OpenLayers.Util.PI) ? |
|---|
| | 989 | x : (x - (sign(x) * OpenLayers.Util.TWO_PI)); |
|---|
| | 990 | return(x); |
|---|
| | 991 | } |
|---|
| | 992 | |
|---|
| | 993 | OpenLayers.Util.ll2m = function(coords) { |
|---|
| | 994 | var r_major = 6378137.0; |
|---|
| | 995 | var r_minor = 6356752.31424518; |
|---|
| | 996 | var lon_center = 0.0; |
|---|
| | 997 | var lat_origin = 0.0; |
|---|
| | 998 | var false_northing = 0.0; |
|---|
| | 999 | var false_easting = 0.0; |
|---|
| | 1000 | var temp = r_minor / r_major; |
|---|
| | 1001 | var es=1.0 - Math.sqrt(temp); |
|---|
| | 1002 | var e = Math.sqrt(es); |
|---|
| | 1003 | var m1 = Math.cos(lat_origin) / (Math.sqrt( 1.0 - es * Math.sin(lat_origin) * Math.sin(lat_origin))); |
|---|
| | 1004 | |
|---|
| | 1005 | var lon=coords[0]; |
|---|
| | 1006 | var lat=coords[1]; |
|---|
| | 1007 | |
|---|
| | 1008 | // convert to radians |
|---|
| | 1009 | if (lat >= 90.0) { lat = 89.99; } |
|---|
| | 1010 | if (lat <= -90.0) { lat = -89.99; } |
|---|
| | 1011 | if (lon >=180.0) { lon = 179; } |
|---|
| | 1012 | if (lon <=-180.0) { lon = -179; } |
|---|
| | 1013 | |
|---|
| | 1014 | if (lat <= 90.0 && lat >= -90.0 && lon <= 180.0 && lon >= -180.0) { |
|---|
| | 1015 | lat *= OpenLayers.Util.D2R; |
|---|
| | 1016 | lon *= OpenLayers.Util.D2R; |
|---|
| | 1017 | } else { |
|---|
| | 1018 | alert("*** Input out of range ***: lon: " + lon + " - lat: " + lat); |
|---|
| | 1019 | return null; |
|---|
| | 1020 | } |
|---|
| | 1021 | |
|---|
| | 1022 | if (Math.abs(lat)>= 90 && |
|---|
| | 1023 | Math.abs(Math.abs(lat) - OpenLayers.Util.HALF_PI) <= OpenLayers.Util.EPSLN) { |
|---|
| | 1024 | alert("Transformation cannot be computed at the poles"); |
|---|
| | 1025 | return null; |
|---|
| | 1026 | } else { |
|---|
| | 1027 | var sinphi = Math.sin(lat); |
|---|
| | 1028 | var ts = OpenLayers.Util.tsfnz(e, lat, sinphi); |
|---|
| | 1029 | var x = false_easting + r_major * m1 * OpenLayers.Util.adjust_lon(lon - lon_center); |
|---|
| | 1030 | var y = false_northing - r_major * m1 * Math.log(ts); |
|---|
| | 1031 | } |
|---|
| | 1032 | |
|---|
| | 1033 | return new Array(x,y); |
|---|
| | 1034 | }; |
|---|
| | 1035 | |