//BEGIN CUSTOM FUNCTION FOR LAT-LONG DISPLAY function convertSP(uX,uY) { // Constants below from NAD 1983 State Plane Nevada West FIPS 2703(Feet). // From ArcMap layer properties. Coordinate system -> NV state plane -> modify // e_sqr is for NAD83 or GRS80 (http:en.wikipedia.org/wiki/NAD83#North_American_Datum_of_1983) var false_easting = (2624666 + (2/3)); // false easting var false_northing = (13123333 + (1/3)) // Should be 0. this is a 'fudge' factor. var a = 6378137.0 //Equatorial Radius (meters) For GRS80 var e_sqr = 0.006694300229 //Eccentricity of ellipsoid (GRS80) var lat_o = 34.75000000000 //Origin Latitude NV state plane var long_o = (118.58 + ((1/3) * 0.01)) // Central Meridan NV state plane var k_o = 0.99990000000000001 // Scale var pointx_ft = uX // number ft var pointx_ft = uX - false_easting // false easting accounted for. var pointy_ft = uY //number ft var pointy_ft = uY - false_northing // false northing accounted for. var e_sqr_2 = Math.pow(e_sqr, 2) // need this to calculate M var e_sqr_3 = Math.pow(e_sqr, 3) // need this to calculate M var radianlat_o = lat_o/(180/Math.PI) //degrees converted to radians 57.2957 var radianLong_o = long_o/(180/Math.PI) //degrees converted to radians var pointx_m = pointx_ft/3.2808399 var pointy_m = pointy_ft/3.2808399 var Mpart1_o = ((1-(e_sqr/4)-((3*e_sqr_2)/64)-((5*e_sqr_3)/256))*radianlat_o) var Mpart2_o = ((((3*e_sqr)/8)+((3*e_sqr_2)/32)+((45*e_sqr_3)/1024))*Math.sin(2*radianlat_o)) var Mpart3_o = ((((15*e_sqr_2)/256) + ((45*e_sqr_3)/1024))*4*Math.sin(4*radianlat_o) ) var Mpart4_o = ((35*e_sqr_3)/3072)*4*Math.sin(6*radianlat_o) var M_o = a*(Mpart1_o - Mpart2_o + Mpart3_o - Mpart4_o) var e_prim_sqr = e_sqr / (1 - e_sqr) var M = M_o + (pointy_m / k_o) var e1 = (1-Math.sqrt((1 - e_sqr))) / (1+Math.sqrt((1 - e_sqr))) //note: constant only for e_sqr of 0.00676866 var u = M / ( a*( 1-(e_sqr/4)- (3*(Math.pow(e_sqr,2)/64) - (5*(Math.pow(e_sqr,3)/256) ))) ) //radians var lat1_part1 = ((3 * (e1/2)) - (27 * (Math.pow(e1,3)/32) )) * Math.sin(2*u) var lat1_part2 = ((21 * (Math.pow(e1,2)/16)) - (55 * (Math.pow(e1,4)/32) )) * Math.sin(4*u) var lat1_part3 = ((151 * (Math.pow(e1,3)/96)) * Math.sin(6*u) ) var lat1_part4 = ((1097 * (Math.pow(e1,4)/512)) * Math.sin(8*u) ) var lat1 = u + lat1_part1 + lat1_part2 + lat1_part3 + lat1_part4 lat1 = lat1 * (180/Math.PI) var radian_lat1 = lat1/(180/Math.PI) //degrees converted to radians var C1 = e_prim_sqr * (0.5*(1 + Math.cos(2*radian_lat1))) var T1 = (1-Math.cos(2*radian_lat1))/(1+Math.cos(2*radian_lat1)) var N1 = a/(Math.sqrt(1-(e_sqr*0.5*(1-Math.cos(2*radian_lat1))))) var R1 = (a*(1-e_sqr))/ Math.sqrt(Math.pow((1-e_sqr * (0.5*(1 - Math.cos(2*radian_lat1))) ),3) ) var D = pointx_m/(N1*k_o) var Lat_final_part1 = lat1 var Lat_final_part2 = (N1 * (Math.tan(radian_lat1) / R1)) var Lat_final_part3 = Math.pow(D,2)/2 - ((( 5 + (3*T1) + (10*C1) - (4* Math.pow(C1,2)) - (9 * e_prim_sqr)) * Math.pow(D,4))/24) var Lat_final_part4 = ((61 + (90 * T1) + (298 * C1) + (45 * Math.pow(T1,2)) - (252 * e_prim_sqr) - (3 * Math.pow(C1,2)))* Math.pow(D,6))/720 var Lat_final = Lat_final_part1 - ((Lat_final_part2 *(Lat_final_part3 + Lat_final_part4)) * (180/Math.PI)) var Long_final_part1 = long_o var Long_final_part2 = D //D var Long_final_part3 = (((1 + (2*T1) + C1))* (Math.pow(D,3))) /6 var Long_final_part4 = 5 - (2 * C1) + (28*T1) - (3 * Math.pow(C1,2)) + (8 * e_prim_sqr) + (24 * Math.pow(T1,2)) Long_final_part4a = Long_final_part4 * (Math.pow(D,5) ) Long_final_part4b = Long_final_part4a /120 var Long_final = (-Long_final_part1 + (((Long_final_part2 - (Long_final_part3 + Long_final_part4b))) /Math.cos(radian_lat1)) * 180/Math.PI) // conversion to ddmmss Degreelat = Math.floor(Lat_final) Degreelong = (Math.floor(Long_final) + 1) //adjustment minlat = Math.floor(((Lat_final - Degreelat)*60)) minlong = Math.floor((((Long_final - Degreelong)*60))+ 1) seclat = Math.abs(((Lat_final - Degreelat - (minlat/60)) * 3600)) // - 1) seclong = Math.abs(((Long_final - Degreelong - (minlong/60)) * 3600 )) minlong = Math.abs(minlong); if (seclat >= 1) { seclat = (seclat -1); } else { seclat = (seclat + 59); minlat = (minlat -1) } seclat = seclat.toFixed(2); seclong = seclong.toFixed(2); var latitude = Lat_final.toString(); var longitude = Long_final.toString(); latitude = latitude.substr(0,10); longitude = longitude.substr(0,10); if (minlat<10) { minlat = "0" + minlat; } if (seclat<10) { seclat = "0" + seclat; } if (minlong<10) { minlong = "0" + minlong; } if (seclong<10) { seclong = "0" + seclong; } if (seclat == "60.00") { seclat = "00.00"; minlat = minlat +1; } if (seclong == "60.00") { seclong = "00.00"; minlong = minlong +1; } northing = uY.toFixed(0); easting = uX.toFixed(0); dojo.byId("coordDMS").innerHTML = " " + Degreelat + "°" + minlat + "\'" + seclat + "\"N " + (-Degreelong) + "°" + minlong + "\'" + seclong + "\"W "; dojo.byId("coordStPl").innerHTML = " Northing: " + northing + " Easting: " + easting + " "; } //END CUSTOM FUNCTION FOR LAT-LONG DISPLAY
I know this is and old post but thank you for sharing this code. I found it useful.
I converted your code/formulas above into T-sql functions, one for lat and one for long. Here is the latitude one in case anyone is interested for Florida State Plane East 0901 EPSG 2236:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
Alter FUNCTION [dbo].[Langd_Convert_Feet_to_DecimalDegrees_Latitude]
(
-- Add the parameters for the function here
@y Numeric(38,8), -- latitude
@x Numeric(38,8) -- longitude
)
RETURNS Numeric(38,8)
AS
BEGIN
-- Constants below from NAD 1983 State Plane Florida East FIPS 0901(Feet).
-- e_sqr is for NAD83 or GRS80 (http:en.wikipedia.org/wiki/NAD83#North_American_Datum_of_1983)
/* From Esri WKT https://epsg.io/2236
PROJCS["NAD83_Florida_East_ftUS",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID
["GRS_1980",6378137,298.257222101]],
PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",24.33333333333333],PARAMETER["central_meridian",-81],
PARAMETER["scale_factor",0.999941177],PARAMETER["false_easting",656166.667],PARAMETER["false_northing",0],
UNIT["Foot_US",0.30480060960121924]]
*/
Declare @false_easting Numeric(38,8) = 656166.667 -- original formula was (656166.6666666665 + (2/3)); -- false easting
Declare @false_northing Numeric(38,8) = 0 -- original formula was (0 + (1/3)) -- Should be 0. this is a 'fudge' factor.
Declare @a Numeric(38,8) = 6378137.0 --Equatorial Radius (meters) For GRS80
Declare @e_sqr Numeric(38,8) = 0.006694300229 --Eccentricity of ellipsoid (GRS80)
Declare @lat_o Numeric(38,8) = 24.33333333333333 --Origin Latitude FL state plane
Declare @long_o Numeric(38,8) = 81.0 -- original formula was (81.0 + ((1/3) * 0.01)) -- Central Meridan FL state plane, no negative sign for this formula
Declare @k_o Numeric(38,8) = 0.999941177 --0.9999411764705882 -- Scale factor
Declare @pointx_ft Numeric(38,8) = @x -- number ft
Set @pointx_ft = @x - @false_easting -- false easting accounted for.
Declare @pointy_ft Numeric(38,8) = @y --number ft
Set @pointy_ft = @y - @false_northing -- false northing accounted for.
Declare @e_sqr_2 Numeric(38,8) = power(@e_sqr, 2) -- need this to calculate M
Declare @e_sqr_3 Numeric(38,8) = power(@e_sqr, 3) -- need this to calculate M
Declare @radianlat_o Numeric(38,8) = @lat_o/(180/PI()) --degrees converted to radians 57.2957
Declare @radianLong_o Numeric(38,8) = @long_o/(180/PI()) --degrees converted to radians
Declare @pointx_m Numeric(38,8) = @pointx_ft/3.2808 --@pointx_ft/3.2808399
Declare @pointy_m Numeric(38,8) = @pointy_ft/3.2808 --@pointy_ft/3.2808399
Declare @Mpart1_o Numeric(38,8) = ((1-(@e_sqr/4)-((3*@e_sqr_2)/64)-((5*@e_sqr_3)/256))*@radianlat_o)
Declare @Mpart2_o Numeric(38,8) = ((((3*@e_sqr)/8)+((3*@e_sqr_2)/32)+((45*@e_sqr_3)/1024))*sin(2*@radianlat_o))
Declare @Mpart3_o Numeric(38,8) = ((((15*@e_sqr_2)/256) + ((45*@e_sqr_3)/1024))*4*sin(4*@radianlat_o) )
Declare @Mpart4_o Numeric(38,8) = ((35*@e_sqr_3)/3072)*4*sin(6*@radianlat_o)
Declare @M_o Numeric(38,8) = @a*(@Mpart1_o - @Mpart2_o + @Mpart3_o - @Mpart4_o)
Declare @e_prim_sqr Numeric(38,8) = @e_sqr / (1 - @e_sqr)
Declare @M Numeric(38,8) = @M_o + (@pointy_m / @k_o)
Declare @e1 Numeric(38,8) = (1-sqrt((1 - @e_sqr))) / (1+sqrt((1 - @e_sqr))) --note: constant only for @e_sqr of 0.00676866
Declare @u Numeric(38,8) = @M / ( @a*( 1-(@e_sqr/4)- (3*(power(@e_sqr,2)/64) - (5*(power(@e_sqr,3)/256) ))) ) --radians
Declare @lat1_part1 Numeric(38,8) = ((3 * (@e1/2)) - (27 * (power(@e1,3)/32) )) * sin(2*@u)
Declare @lat1_part2 Numeric(38,8) = ((21 * (power(@e1,2)/16)) - (55 * (power(@e1,4)/32) )) * sin(4*@u)
Declare @lat1_part3 Numeric(38,8) = ((151 * (power(@e1,3)/96)) * sin(6*@u) )
Declare @lat1_part4 Numeric(38,8) = ((1097 * (power(@e1,4)/512)) * sin(8*@u) )
Declare @lat1 Numeric(38,8) = @u + @lat1_part1 + @lat1_part2 + @lat1_part3 + @lat1_part4
Set @lat1 = @lat1 * (180/PI())
Declare @radian_lat1 Numeric(38,8) = @lat1/(180/PI()) --degrees converted to radians
Declare @C1 Numeric(38,8) = @e_prim_sqr * (0.5*(1 + cos(2*@radian_lat1)))
Declare @T1 Numeric(38,8) = (1-cos(2*@radian_lat1))/(1+cos(2*@radian_lat1))
Declare @N1 Numeric(38,8) = @a/(sqrt(1-(@e_sqr*0.5*(1-cos(2*@radian_lat1)))))
Declare @R1 Numeric(38,8) = (@a*(1-@e_sqr))/ sqrt(power((1-@e_sqr * (0.5*(1 - cos(2*@radian_lat1))) ),3) )
Declare @D Numeric(38,8) = @pointx_m/(@N1*@k_o)
Declare @Lat_final_part1 Numeric(38,8) = @lat1
Declare @Lat_final_part2 Numeric(38,8) = (@N1 * (tan(@radian_lat1) / @R1))
Declare @Lat_final_part3 Numeric(38,8) = power(@D,2)/2 - ((( 5 + (3*@T1) + (10*@C1) - (4* power(@C1,2)) - (9 * @e_prim_sqr)) * power(@D,4))/24)
Declare @Lat_final_part4 Numeric(38,8) = ((61 + (90 * @T1) + (298 * @C1) + (45 * power(@T1,2)) - (252 * @e_prim_sqr) - (3 * power(@C1,2)))* power(@D,6))/720
Declare @Lat_final Numeric(38,8) = @Lat_final_part1 - ((@Lat_final_part2 *(@Lat_final_part3 + @Lat_final_part4)) * (180/PI()))
Declare @Long_final_part1 Numeric(38,8) = @long_o
Declare @Long_final_part2 Numeric(38,8) = @D --D
Declare @Long_final_part3 Numeric(38,8) = (((1 + (2*@T1) + @C1))* (power(@D,3))) /6
Declare @Long_final_part4 Numeric(38,8) = 5 - (2 * @C1) + (28*@T1) - (3 * power(@C1,2)) + (8 * @e_prim_sqr) + (24 * power(@T1,2))
Declare @Long_final_part4a Numeric(38,8) = @Long_final_part4 * (power(@D,5) )
Declare @Long_final_part4b Numeric(38,8) = @Long_final_part4a /120
Declare @Long_final Numeric(38,8) = (-@Long_final_part1 + (((@Long_final_part2 - (@Long_final_part3 + @Long_final_part4b))) /cos(@radian_lat1)) * 180/PI())
RETURN @Lat_final
END
Aangemelde leden kunnen berichten plaatsen, updates volgen en meer. Nieuw hier? Registreer een gratis account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.