Advertisement
pjmakey2

utm_coor

Sep 4th, 2012
422
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.06 KB | None | 0 0
  1. import math
  2.  
  3. PI = math.pi
  4. FOURTHPI = PI / 4;
  5. deg2rad = PI / 180;
  6. rad2deg = 180.0 / PI;
  7.  
  8. Ellipsoid = []
  9. #id, Ellipsoid name, Equatorial Radius, square of eccentricity  
  10. Ellipsoid.append({'id':-1, 'name':'Placeholder','equatorial_radius':0,'eccentricity_squared':0})
  11. Ellipsoid.append({'id': 1, 'name':'Airy','equatorial_radius':6377563,'eccentricity_squared':0.00667054})
  12. Ellipsoid.append({'id': 2, 'name':'Australian National','equatorial_radius':6378160,'eccentricity_squared':0.006694542})
  13. Ellipsoid.append({'id': 3, 'name':'Bessel 1841','equatorial_radius':6377397,'eccentricity_squared':0.006674372})
  14. Ellipsoid.append({'id': 4, 'name':'Bessel 1841 (Nambia)' ,'equatorial_radius':6377484,'eccentricity_squared':0.006674372})
  15. Ellipsoid.append({'id': 5, 'name':'Clarke 1866','equatorial_radius':6378206,'eccentricity_squared':0.006768658})
  16. Ellipsoid.append({'id': 6, 'name':'Clarke 1880','equatorial_radius':6378249,'eccentricity_squared':0.006803511})
  17. Ellipsoid.append({'id': 7, 'name':'Everest','equatorial_radius':6377276,'eccentricity_squared':0.006637847})
  18. Ellipsoid.append({'id': 8, 'name':'Fischer 1960 (Mercury)' ,'equatorial_radius':6378166,'eccentricity_squared':0.006693422})
  19. Ellipsoid.append({'id': 9, 'name':'Fischer 1968','equatorial_radius':6378150,'eccentricity_squared':0.006693422})
  20. Ellipsoid.append({'id': 10, 'name':'GRS 1967','equatorial_radius':6378160,'eccentricity_squared':0.006694605})
  21. Ellipsoid.append({'id': 11, 'name':'GRS 1980','equatorial_radius':6378137,'eccentricity_squared':0.00669438})
  22. Ellipsoid.append({'id': 12, 'name':'Helmert 1906','equatorial_radius':6378200,'eccentricity_squared':0.006693422})
  23. Ellipsoid.append({'id': 13, 'name':'Hough','equatorial_radius':6378270,'eccentricity_squared':0.00672267})
  24. Ellipsoid.append({'id': 14, 'name':'International','equatorial_radius':6378388,'eccentricity_squared':0.00672267})
  25. Ellipsoid.append({'id': 15, 'name':'Krassovsky','equatorial_radius':6378245,'eccentricity_squared':0.006693422})
  26. Ellipsoid.append({'id': 16, 'name':'Modified Airy','equatorial_radius':6377340,'eccentricity_squared':0.00667054})
  27. Ellipsoid.append({'id': 17, 'name':'Modified Everest','equatorial_radius':6377304,'eccentricity_squared':0.006637847})
  28. Ellipsoid.append({'id': 18, 'name':'Modified Fischer 1960','equatorial_radius':6378155,'eccentricity_squared':0.006693422})
  29. Ellipsoid.append({'id': 19, 'name':'South American 1969','equatorial_radius':6378160,'eccentricity_squared':0.006694542})
  30. Ellipsoid.append({'id': 20, 'name':'WGS 60','equatorial_radius':6378165,'eccentricity_squared':0.006693422})
  31. Ellipsoid.append({'id': 21, 'name':'WGS 66','equatorial_radius':6378145,'eccentricity_squared':0.006694542})
  32. Ellipsoid.append({'id': 22, 'name':'WGS-72','equatorial_radius':6378135,'eccentricity_squared':0.006694318})
  33. #zone-paraguay
  34. Ellipsoid.append({'id': 23, 'name':'WGS-84','equatorial_radius':6378137,'eccentricity_squared':0.00669438})
  35.  
  36. def UTMtoLL(ellipsoid, UTMEasting, UTMNorthing, UTMZone):
  37.         '''
  38.        converts UTM coords to lat/long.  Equations from USGS Bulletin 1532
  39.        East Longitudes are positive, West longitudes are negative.
  40.        North latitudes are positive, South latitudes are negative
  41.        Lat and Long are in decimal degrees.
  42.        Written by Chuck Gantz- chuck.gantz@globalstar.com
  43.        '''
  44.         k0 = 0.9996
  45.         a = Ellipsoid[ellipsoid]['equatorial_radius']
  46.         eccSquared = Ellipsoid[ellipsoid]['eccentricity_squared']
  47.         eccPrimeSquared = 0.0
  48.         e1 = (1-math.sqrt(1-eccSquared))/(1+math.sqrt(1-eccSquared))
  49.         N1 = 0.0
  50.         T1 = 0.0
  51.         C1 = 0.0
  52.         R1 = 0.0
  53.         D = 0.0
  54.         M = 0.0
  55.         LongOrigin = 0.0
  56.         mu = 0.0
  57.         phi1 = 0.0
  58.         phi1Rad = 0.0
  59.         x = 0.0
  60.         y = 0.0
  61.         ZoneNumber = 0
  62.         NorthernHemisphere = 1 # 1 for northern hemispher, 0 for southern
  63.         x = UTMEasting - 500000.0 #remove 500,000 meter offset for longitude
  64.         y = UTMNorthing
  65.  
  66.         # LA zona UTM viene dada por un número y una letra. El número indica el uso y la letra la zona
  67.         ZoneNumber=int(UTMZone[0:(len(UTMZone)-1)])
  68.         ZoneLetter=UTMZone[(len(UTMZone)-1):]
  69.         if (ord(ZoneLetter.upper()) - ord('N')) >= 0:
  70.                 NorthernHemisphere = 1 # point is in northern hemisphere
  71.         else:
  72.                 NorthernHemisphere = 0 # point is in southern hemisphere
  73.                 y -= 10000000.0 # remove 10,000,000 meter offset used for southern hemisphere
  74.         # print ZoneNumber, ZoneLetter, NorthernHemisphere
  75.         LongOrigin = (ZoneNumber - 1)*6 - 180 + 3#;  //+3 puts origin in middle of zone
  76.         eccPrimeSquared = (eccSquared)/(1-eccSquared)
  77.         M = y / k0
  78.         mu = M/(a*(1-eccSquared/4-3*eccSquared*eccSquared/64-5*eccSquared*eccSquared*eccSquared/256))
  79.         phi1Rad = mu+(3*e1/2-27*math.pow(e1,3)/32)*math.sin(2*mu)+(21*math.pow(e1,2)/16-55*math.pow(e1,4)/32)*math.sin(4*mu)+(151*math.pow(e1,3)/96)*math.sin(6*mu)
  80.         phi1 = phi1Rad*rad2deg
  81.         N1 = a/math.sqrt(1-eccSquared*math.sin(phi1Rad)*math.sin(phi1Rad))
  82.         T1 = math.tan(phi1Rad)*math.tan(phi1Rad)
  83.         C1 = eccPrimeSquared*math.cos(phi1Rad)*math.cos(phi1Rad)
  84.         R1 = a*(1-eccSquared)/math.pow(1-eccSquared*math.sin(phi1Rad)*math.sin(phi1Rad), 1.5)
  85.         D = x/(N1*k0);
  86.         Lat = phi1Rad - (N1*math.tan(phi1Rad)/R1)*(math.pow(D,2)/2-(5+3*T1+10*C1-4*math.pow(C1,2)-9*eccPrimeSquared)*math.pow(D,4)/24+(61+90*T1+298*C1+45*math.pow(T1,2)-252*eccPrimeSquared-3*math.pow(C1,2))*math.pow(D,6)/720)
  87.         Lat = Lat * rad2deg
  88.         Long = (D-(1+2*T1+C1)*math.pow(D,3)/6+(5-2*C1+28*T1-3*math.pow(C1,2)+8*eccPrimeSquared+24*T1*T1)*math.pow(D,5)/120)/math.cos(phi1Rad)
  89.         Long = LongOrigin + Long * rad2deg
  90.         return Lat,Long
  91.  
  92. if __name__ == '__main__':
  93.     coor = open('ccr.csv', 'r')
  94.     lines  = coor.readlines()
  95.     nc = open('ccrn.csv', 'a+')
  96.     for a in lines:
  97.         lon = int(a.split(';')[0])
  98.         lat = int(a.split(';')[1])
  99.         result = UTMtoLL(23, lon,lat,'21J')
  100.         nc.write('%s;%s;%s;%s\n' % (lon,lat,result[0], result[1]))
  101.     nc.close()
  102.     coor.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement