[GRASS-SVN] r35689 - in grass-addons/grass7/imagery: .
i.landsat.toar
svn_grass at osgeo.org
svn_grass at osgeo.org
Sat Jan 31 11:37:15 EST 2009
Author: ejtizado
Date: 2009-01-31 11:37:15 -0500 (Sat, 31 Jan 2009)
New Revision: 35689
Added:
grass-addons/grass7/imagery/i.landsat.toar/
grass-addons/grass7/imagery/i.landsat.toar/Makefile
grass-addons/grass7/imagery/i.landsat.toar/earth_sun.c
grass-addons/grass7/imagery/i.landsat.toar/earth_sun.h
grass-addons/grass7/imagery/i.landsat.toar/i.landsat.toar.html
grass-addons/grass7/imagery/i.landsat.toar/landsat.c
grass-addons/grass7/imagery/i.landsat.toar/landsat.h
grass-addons/grass7/imagery/i.landsat.toar/landsat_met.c
grass-addons/grass7/imagery/i.landsat.toar/landsat_set.c
grass-addons/grass7/imagery/i.landsat.toar/local_proto.h
grass-addons/grass7/imagery/i.landsat.toar/main.c
Log:
Modified to compile with GRASS 7
Added: grass-addons/grass7/imagery/i.landsat.toar/Makefile
===================================================================
--- grass-addons/grass7/imagery/i.landsat.toar/Makefile (rev 0)
+++ grass-addons/grass7/imagery/i.landsat.toar/Makefile 2009-01-31 16:37:15 UTC (rev 35689)
@@ -0,0 +1,10 @@
+MODULE_TOPDIR = ../..
+
+PGM = i.landsat.toar
+
+LIBES = $(GISLIB)
+DEPENDENCIES = $(GISDEP)
+
+include $(MODULE_TOPDIR)/include/Make/Module.make
+
+default: cmd
Added: grass-addons/grass7/imagery/i.landsat.toar/earth_sun.c
===================================================================
--- grass-addons/grass7/imagery/i.landsat.toar/earth_sun.c (rev 0)
+++ grass-addons/grass7/imagery/i.landsat.toar/earth_sun.c 2009-01-31 16:37:15 UTC (rev 35689)
@@ -0,0 +1,1101 @@
+/*
+ * Modified from LIBNOVA-0.12
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Some functions in this file use the VSOP87 solution by
+ * Messrs. Bretagnon and Francou.
+ *
+ * Copyright (C) 2000 - 2005 Liam Girdwood
+ * Modified to GRASS (C) 2006 E. Jorge Tizado
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "earth_sun.h"
+
+#define RADIUS_R0 523
+#define RADIUS_R1 290
+#define RADIUS_R2 134
+#define RADIUS_R3 20
+#define RADIUS_R4 9
+#define RADIUS_R5 2
+
+static const struct ln_vsop earth_radius_r0[RADIUS_R0] = {
+ {1.00013988784, 0.00000000000, 0.00000000000},
+ {0.01670699632, 3.09846350258, 6283.07584999140},
+ {0.00013956024, 3.05524609456, 12566.15169998280},
+ {0.00003083720, 5.19846674381, 77713.77146812050},
+ {0.00001628463, 1.17387558054, 5753.38488489680},
+ {0.00001575572, 2.84685214877, 7860.41939243920},
+ {0.00000924799, 5.45292236722, 11506.76976979360},
+ {0.00000542439, 4.56409151453, 3930.20969621960},
+ {0.00000472110, 3.66100022149, 5884.92684658320},
+ {0.00000328780, 5.89983686142, 5223.69391980220},
+ {0.00000345969, 0.96368627272, 5507.55323866740},
+ {0.00000306784, 0.29867139512, 5573.14280143310},
+ {0.00000174844, 3.01193636733, 18849.22754997420},
+ {0.00000243181, 4.27349530790, 11790.62908865880},
+ {0.00000211836, 5.84714461348, 1577.34354244780},
+ {0.00000185740, 5.02199710705, 10977.07880469900},
+ {0.00000109835, 5.05510635860, 5486.77784317500},
+ {0.00000098316, 0.88681311278, 6069.77675455340},
+ {0.00000086500, 5.68956418946, 15720.83878487840},
+ {0.00000085831, 1.27079125277, 161000.68573767410},
+ {0.00000062917, 0.92177053978, 529.69096509460},
+ {0.00000057056, 2.01374292245, 83996.84731811189},
+ {0.00000064908, 0.27251341435, 17260.15465469040},
+ {0.00000049384, 3.24501240359, 2544.31441988340},
+ {0.00000055736, 5.24159799170, 71430.69561812909},
+ {0.00000042520, 6.01110257982, 6275.96230299060},
+ {0.00000046966, 2.57799853213, 775.52261132400},
+ {0.00000038963, 5.36063832897, 4694.00295470760},
+ {0.00000044666, 5.53715663816, 9437.76293488700},
+ {0.00000035661, 1.67447135798, 12036.46073488820},
+ {0.00000031922, 0.18368299942, 5088.62883976680},
+ {0.00000031846, 1.77775642078, 398.14900340820},
+ {0.00000033193, 0.24370221704, 7084.89678111520},
+ {0.00000038245, 2.39255343973, 8827.39026987480},
+ {0.00000028468, 1.21344887533, 6286.59896834040},
+ {0.00000037486, 0.82961281844, 19651.04848109800},
+ {0.00000036957, 4.90107587287, 12139.55350910680},
+ {0.00000034537, 1.84270693281, 2942.46342329160},
+ {0.00000026275, 4.58896863104, 10447.38783960440},
+ {0.00000024596, 3.78660838036, 8429.24126646660},
+ {0.00000023587, 0.26866098169, 796.29800681640},
+ {0.00000027795, 1.89934427832, 6279.55273164240},
+ {0.00000023927, 4.99598548145, 5856.47765911540},
+ {0.00000020345, 4.65282190725, 2146.16541647520},
+ {0.00000023287, 2.80783632869, 14143.49524243060},
+ {0.00000022099, 1.95002636847, 3154.68708489560},
+ {0.00000019509, 5.38233922479, 2352.86615377180},
+ {0.00000017958, 0.19871369960, 6812.76681508600},
+ {0.00000017178, 4.43322156854, 10213.28554621100},
+ {0.00000016190, 5.23159323213, 17789.84561978500},
+ {0.00000017315, 6.15224075188, 16730.46368959580},
+ {0.00000013814, 5.18962074032, 8031.09226305840},
+ {0.00000018834, 0.67280058021, 149854.40013480789},
+ {0.00000018330, 2.25348717053, 23581.25817731760},
+ {0.00000013639, 3.68511810757, 4705.73230754360},
+ {0.00000013142, 0.65267698994, 13367.97263110660},
+ {0.00000010414, 4.33285688501, 11769.85369316640},
+ {0.00000009978, 4.20126336356, 6309.37416979120},
+ {0.00000010170, 1.59366684542, 4690.47983635860},
+ {0.00000007564, 2.62560597391, 6256.77753019160},
+ {0.00000009654, 3.67583728703, 27511.46787353720},
+ {0.00000006743, 0.56269927047, 3340.61242669980},
+ {0.00000008743, 6.06359123461, 1748.01641306700},
+ {0.00000007786, 3.67371235367, 12168.00269657460},
+ {0.00000006633, 5.66149277789, 11371.70468975820},
+ {0.00000007712, 0.31242577788, 7632.94325965020},
+ {0.00000006586, 3.13580054586, 801.82093112380},
+ {0.00000007460, 5.64758066660, 11926.25441366880},
+ {0.00000006933, 2.92384586372, 6681.22485339960},
+ {0.00000006805, 1.42327153767, 23013.53953958720},
+ {0.00000006118, 5.13395999022, 1194.44701022460},
+ {0.00000006477, 2.64986648493, 19804.82729158280},
+ {0.00000005233, 4.62432817299, 6438.49624942560},
+ {0.00000006147, 3.02863936662, 233141.31440436149},
+ {0.00000004608, 1.72194702724, 7234.79425624200},
+ {0.00000004221, 1.55697533726, 7238.67559160000},
+ {0.00000005310, 2.40821524293, 11499.65622279280},
+ {0.00000005128, 5.32398965690, 11513.88331679440},
+ {0.00000004770, 0.25554311730, 11856.21865142450},
+ {0.00000005519, 2.09089153789, 17298.18232732620},
+ {0.00000005625, 4.34052903053, 90955.55169449610},
+ {0.00000004578, 4.46569641570, 5746.27133789600},
+ {0.00000003788, 4.90728294810, 4164.31198961300},
+ {0.00000005337, 5.09957905103, 31441.67756975680},
+ {0.00000003967, 1.20054555175, 1349.86740965880},
+ {0.00000004005, 3.02853885902, 1059.38193018920},
+ {0.00000003480, 0.76066308841, 10973.55568635000},
+ {0.00000004232, 1.05485713117, 5760.49843189760},
+ {0.00000004582, 3.76570026763, 6386.16862421000},
+ {0.00000003335, 3.13829943354, 6836.64525283380},
+ {0.00000003420, 3.00043974511, 4292.33083295040},
+ {0.00000003595, 5.70703236079, 5643.17856367740},
+ {0.00000003236, 4.16387400645, 9917.69687450980},
+ {0.00000004154, 2.59940749519, 7058.59846131540},
+ {0.00000003362, 4.54577164994, 4732.03062734340},
+ {0.00000002978, 1.30561268820, 6283.14316029419},
+ {0.00000002765, 0.51311975671, 26.29831979980},
+ {0.00000002807, 5.66230537649, 8635.94200376320},
+ {0.00000002927, 5.73787834080, 16200.77272450120},
+ {0.00000003167, 1.69181759900, 11015.10647733480},
+ {0.00000002598, 2.96244118358, 25132.30339996560},
+ {0.00000003519, 3.62639325753, 244287.60000722769},
+ {0.00000002676, 4.20727719487, 18073.70493865020},
+ {0.00000002978, 1.74971565805, 6283.00853968860},
+ {0.00000002287, 1.06976449088, 14314.16811304980},
+ {0.00000002863, 5.92838917309, 14712.31711645800},
+ {0.00000003071, 0.23793217000, 35371.88726597640},
+ {0.00000002656, 0.89959301615, 12352.85260454480},
+ {0.00000002415, 2.79975176800, 709.93304855830},
+ {0.00000002811, 3.51513864541, 21228.39202354580},
+ {0.00000001977, 2.61358297551, 951.71840625060},
+ {0.00000002548, 2.47684686575, 6208.29425142410},
+ {0.00000001999, 0.56090396506, 7079.37385680780},
+ {0.00000002305, 1.05376463592, 22483.84857449259},
+ {0.00000001855, 2.86093570752, 5216.58037280140},
+ {0.00000002157, 1.31395211105, 154717.60988768269},
+ {0.00000001970, 4.36931551625, 167283.76158766549},
+ {0.00000001754, 2.14452400686, 6290.18939699220},
+ {0.00000001628, 5.85704450617, 10984.19235169980},
+ {0.00000002154, 6.03828353794, 10873.98603048040},
+ {0.00000001714, 3.70158195222, 1592.59601363280},
+ {0.00000001541, 6.21599512982, 23543.23050468179},
+ {0.00000001602, 1.99860679677, 10969.96525769820},
+ {0.00000001712, 1.34295218697, 3128.38876509580},
+ {0.00000001647, 5.54948299069, 6496.37494542940},
+ {0.00000001495, 5.43980459648, 155.42039943420},
+ {0.00000001827, 5.91227480351, 3738.76143010800},
+ {0.00000001726, 2.16765465036, 10575.40668294180},
+ {0.00000001532, 5.35683107063, 13521.75144159140},
+ {0.00000001824, 1.66056145084, 39302.09696219600},
+ {0.00000001605, 1.90930973224, 6133.51265285680},
+ {0.00000001282, 2.46013372544, 13916.01910964160},
+ {0.00000001211, 4.41360631550, 3894.18182954220},
+ {0.00000001394, 1.77801929250, 9225.53927328300},
+ {0.00000001571, 4.95512957606, 25158.60171976540},
+ {0.00000001205, 1.19212756308, 3.52311834900},
+ {0.00000001132, 2.69830084955, 6040.34724601740},
+ {0.00000001504, 5.77577388271, 18209.33026366019},
+ {0.00000001393, 1.62625077326, 5120.60114558360},
+ {0.00000001081, 2.93726744446, 17256.63153634140},
+ {0.00000001232, 0.71651766504, 143571.32428481648},
+ {0.00000001087, 0.99769687961, 955.59974160860},
+ {0.00000001068, 5.28472576591, 65147.61976813770},
+ {0.00000001169, 3.11663802316, 14945.31617355440},
+ {0.00000000975, 5.10887260780, 6172.86952877200},
+ {0.00000001202, 4.02992510403, 553.56940284240},
+ {0.00000000979, 2.00000879106, 15110.46611986620},
+ {0.00000000962, 4.02380771400, 6282.09552892320},
+ {0.00000000999, 3.62643002790, 6262.30045449900},
+ {0.00000001030, 5.84987815239, 213.29909543800},
+ {0.00000001014, 2.84227679965, 8662.24032356300},
+ {0.00000001185, 1.51330629149, 17654.78053974960},
+ {0.00000000967, 2.67081017562, 5650.29211067820},
+ {0.00000001222, 2.65423784904, 88860.05707098669},
+ {0.00000000986, 2.36212814824, 6206.80977871580},
+ {0.00000001034, 0.13634950642, 11712.95531823080},
+ {0.00000001103, 3.08477302937, 43232.30665841560},
+ {0.00000000781, 2.53374971725, 16496.36139620240},
+ {0.00000001019, 3.04569392376, 6037.24420376200},
+ {0.00000000795, 5.80662989126, 5230.80746680300},
+ {0.00000000813, 3.57702871938, 10177.25767953360},
+ {0.00000000962, 5.31470594766, 6284.05617105960},
+ {0.00000000717, 5.95797471837, 12559.03815298200},
+ {0.00000000967, 2.74413738053, 6244.94281435360},
+ {0.00000000921, 0.10160160830, 29088.81141598500},
+ {0.00000000719, 5.91788189939, 4136.91043351620},
+ {0.00000000688, 3.89489045092, 1589.07289528380},
+ {0.00000000772, 4.05505380285, 6127.65545055720},
+ {0.00000000706, 5.49323197725, 22003.91463486980},
+ {0.00000000665, 1.60002747134, 11087.28512591840},
+ {0.00000000690, 4.50539825729, 426.59819087600},
+ {0.00000000854, 3.26104645060, 20426.57109242200},
+ {0.00000000656, 4.32410182940, 16858.48253293320},
+ {0.00000000840, 2.59572585212, 28766.92442448400},
+ {0.00000000686, 0.61944033771, 11403.67699557500},
+ {0.00000000700, 3.40901412473, 7.11354700080},
+ {0.00000000728, 0.04050185963, 5481.25491886760},
+ {0.00000000653, 1.03869451230, 6062.66320755260},
+ {0.00000000559, 4.79221805695, 20199.09495963300},
+ {0.00000000633, 5.70229959167, 45892.73043315699},
+ {0.00000000591, 6.10986487621, 9623.68827669120},
+ {0.00000000520, 3.62310356479, 5333.90024102160},
+ {0.00000000602, 5.58381898589, 10344.29506538580},
+ {0.00000000496, 2.21027756314, 1990.74501704100},
+ {0.00000000691, 1.96733114988, 12416.58850284820},
+ {0.00000000640, 1.59062417043, 18319.53658487960},
+ {0.00000000625, 3.82358168221, 13517.87010623340},
+ {0.00000000475, 1.17025904180, 12569.67481833180},
+ {0.00000000660, 5.08498512995, 283.85931886520},
+ {0.00000000664, 4.50029469969, 47162.51635463520},
+ {0.00000000569, 0.16318535463, 17267.26820169119},
+ {0.00000000568, 3.86100969474, 6076.89030155420},
+ {0.00000000462, 0.26368763517, 4590.91018048900},
+ {0.00000000535, 4.83225423196, 18422.62935909819},
+ {0.00000000466, 0.75873879417, 7342.45778018060},
+ {0.00000000541, 3.07212190556, 226858.23855437008},
+ {0.00000000610, 1.53597089605, 33019.02111220460},
+ {0.00000000617, 2.62356328726, 11190.37790013700},
+ {0.00000000548, 4.55798855803, 18875.52586977400},
+ {0.00000000633, 4.60110281228, 66567.48586525429},
+ {0.00000000587, 5.78087907808, 632.78373931320},
+ {0.00000000603, 5.38458554802, 316428.22867391503},
+ {0.00000000525, 5.01522072363, 12132.43996210600},
+ {0.00000000469, 0.59975173763, 21954.15760939799},
+ {0.00000000548, 3.50627043672, 17253.04110768959},
+ {0.00000000502, 0.98804327589, 11609.86254401220},
+ {0.00000000568, 1.98497313089, 7668.63742494250},
+ {0.00000000482, 1.62460405687, 12146.66705610760},
+ {0.00000000391, 3.68718382972, 18052.92954315780},
+ {0.00000000457, 3.77214896610, 156137.47598479928},
+ {0.00000000401, 5.29221540240, 15671.08175940660},
+ {0.00000000469, 1.80963351735, 12562.62858163380},
+ {0.00000000514, 3.37031288919, 20597.24396304120},
+ {0.00000000452, 5.66811219778, 10454.50138660520},
+ {0.00000000375, 4.98528185039, 9779.10867612540},
+ {0.00000000523, 0.97215560834, 155427.54293624099},
+ {0.00000000403, 5.13948189770, 1551.04522264800},
+ {0.00000000372, 3.69883738807, 9388.00590941520},
+ {0.00000000367, 4.43875659833, 4535.05943692440},
+ {0.00000000406, 4.20863156497, 12592.45001978260},
+ {0.00000000362, 2.55099560446, 242.72860397400},
+ {0.00000000471, 4.61907324819, 5436.99301524020},
+ {0.00000000388, 4.96020928400, 24356.78078864160},
+ {0.00000000441, 5.83872966262, 3496.03282613400},
+ {0.00000000349, 6.16307810648, 19800.94595622480},
+ {0.00000000356, 0.23819081240, 5429.87946823940},
+ {0.00000000346, 5.60809622572, 2379.16447357160},
+ {0.00000000380, 2.72105213132, 11933.36796066960},
+ {0.00000000432, 0.24215988572, 17996.03116822220},
+ {0.00000000378, 5.22516848076, 7477.52286021600},
+ {0.00000000337, 5.10885555836, 5849.36411211460},
+ {0.00000000315, 0.57827745123, 10557.59416082380},
+ {0.00000000318, 4.49949007320, 3634.62102451840},
+ {0.00000000323, 1.55850824803, 10440.27429260360},
+ {0.00000000314, 5.77154773334, 20.77539549240},
+ {0.00000000303, 2.34615580398, 4686.88940770680},
+ {0.00000000414, 5.93237602310, 51092.72605085480},
+ {0.00000000362, 2.17561997119, 28237.23345938940},
+ {0.00000000288, 0.18377405421, 13095.84266507740},
+ {0.00000000277, 5.12952205030, 13119.72110282519},
+ {0.00000000325, 6.18608287927, 6268.84875598980},
+ {0.00000000273, 0.30522428863, 23141.55838292460},
+ {0.00000000267, 5.76152585786, 5966.68398033480},
+ {0.00000000345, 2.94246040875, 36949.23080842420},
+ {0.00000000253, 5.20994580359, 24072.92146977640},
+ {0.00000000342, 5.76212804329, 16460.33352952499},
+ {0.00000000307, 6.01039067183, 22805.73556599360},
+ {0.00000000261, 2.00304796059, 6148.01076995600},
+ {0.00000000238, 5.08241964961, 6915.85958930460},
+ {0.00000000249, 2.94762789744, 135.06508003540},
+ {0.00000000306, 3.89765478921, 10988.80815753500},
+ {0.00000000308, 0.05451027736, 4701.11650170840},
+ {0.00000000319, 2.95712862064, 163096.18036118349},
+ {0.00000000272, 2.07967681309, 4804.20927592700},
+ {0.00000000209, 4.43768461442, 6546.15977336420},
+ {0.00000000217, 0.73691592312, 6303.85124548380},
+ {0.00000000203, 0.32033085531, 25934.12433108940},
+ {0.00000000205, 5.22936478995, 20995.39296644940},
+ {0.00000000213, 0.20671418919, 28286.99048486120},
+ {0.00000000197, 0.48286131290, 16737.57723659660},
+ {0.00000000230, 6.06567392849, 6287.00800325450},
+ {0.00000000219, 1.29194216300, 5326.78669402080},
+ {0.00000000201, 1.74700937253, 22743.40937951640},
+ {0.00000000207, 4.45440927276, 6279.48542133960},
+ {0.00000000269, 6.05640445030, 64471.99124174489},
+ {0.00000000190, 0.99261116842, 29296.61538957860},
+ {0.00000000194, 3.82656562755, 419.48464387520},
+ {0.00000000262, 5.26961924126, 522.57741809380},
+ {0.00000000210, 4.68618183158, 6254.62666252360},
+ {0.00000000197, 2.80624554186, 4933.20844033260},
+ {0.00000000252, 4.36220154620, 40879.44050464380},
+ {0.00000000261, 1.07241516738, 55022.93574707440},
+ {0.00000000233, 5.41751014958, 39609.65458316560},
+ {0.00000000185, 4.14324541379, 5642.19824260920},
+ {0.00000000247, 3.44855612987, 6702.56049386660},
+ {0.00000000205, 4.04424043226, 536.80451209540},
+ {0.00000000191, 3.15807087926, 16723.35014259500},
+ {0.00000000222, 5.16259496507, 23539.70738633280},
+ {0.00000000180, 4.56214752149, 6489.26139842860},
+ {0.00000000227, 0.60156339452, 5905.70224207560},
+ {0.00000000170, 0.93185903228, 16062.18452611680},
+ {0.00000000159, 0.92751013112, 23937.85638974100},
+ {0.00000000157, 4.69607868164, 6805.65326808520},
+ {0.00000000218, 0.85533373430, 16627.37091537720},
+ {0.00000000169, 0.94641052064, 3097.88382272579},
+ {0.00000000207, 4.88410451334, 6286.66627864320},
+ {0.00000000160, 4.95943826819, 10021.83728009940},
+ {0.00000000175, 6.12762824563, 239424.39025435288},
+ {0.00000000173, 3.13887234973, 6179.98307577280},
+ {0.00000000157, 3.62822057807, 18451.07854656599},
+ {0.00000000206, 5.74617821138, 3646.35037735440},
+ {0.00000000157, 4.67695912207, 6709.67404086740},
+ {0.00000000146, 3.09506069745, 4907.30205014560},
+ {0.00000000165, 2.27139128760, 10660.68693504240},
+ {0.00000000144, 3.96947747592, 6019.99192661860},
+ {0.00000000171, 5.91302216729, 6058.73105428950},
+ {0.00000000144, 2.13155655120, 26084.02180621620},
+ {0.00000000151, 0.67417383565, 2388.89402044920},
+ {0.00000000196, 1.67718461229, 2107.03450754240},
+ {0.00000000146, 5.10373877968, 10770.89325626180},
+ {0.00000000187, 1.23915444627, 19402.79695281660},
+ {0.00000000137, 1.26247412216, 12566.21901028560},
+ {0.00000000191, 5.03547476279, 263.08392337280},
+ {0.00000000137, 3.52825454595, 639.89728631400},
+ {0.00000000135, 0.73840670927, 5017.50837136500},
+ {0.00000000164, 2.39195095081, 6357.85744855870},
+ {0.00000000168, 0.05515907462, 9380.95967271720},
+ {0.00000000161, 1.15721259392, 26735.94526221320},
+ {0.00000000144, 1.76097645199, 5888.44996493220},
+ {0.00000000131, 2.51859277344, 6599.46771964800},
+ {0.00000000142, 2.43802911123, 5881.40372823420},
+ {0.00000000159, 5.90325893762, 6281.59137728310},
+ {0.00000000151, 3.72338532519, 12669.24447420140},
+ {0.00000000132, 2.38417741883, 6525.80445396540},
+ {0.00000000127, 0.00254936441, 10027.90319572920},
+ {0.00000000148, 2.85102145528, 6418.14093002680},
+ {0.00000000143, 5.74460279560, 26087.90314157420},
+ {0.00000000172, 0.41289962240, 174242.46596404970},
+ {0.00000000136, 4.15497742275, 6311.52503745920},
+ {0.00000000170, 5.98194913129, 327574.51427678125},
+ {0.00000000136, 2.48430537541, 13341.67431130680},
+ {0.00000000149, 0.33002271275, 245.83164622940},
+ {0.00000000165, 2.49667924600, 58953.14544329400},
+ {0.00000000123, 1.67328384813, 32217.20018108080},
+ {0.00000000123, 3.45660563754, 6277.55292568400},
+ {0.00000000117, 0.86065134175, 6245.04817735560},
+ {0.00000000149, 5.61358281003, 5729.50644714900},
+ {0.00000000128, 0.71204006448, 103.09277421860},
+ {0.00000000159, 2.43166592149, 221995.02880149524},
+ {0.00000000137, 1.70657709200, 12566.08438968000},
+ {0.00000000129, 2.80667872683, 6016.46880826960},
+ {0.00000000113, 3.58302904101, 25685.87280280800},
+ {0.00000000109, 3.26403795962, 6819.88036208680},
+ {0.00000000122, 0.34120688202, 1162.47470440780},
+ {0.00000000106, 1.59721172719, 17782.73207278420},
+ {0.00000000144, 2.28891651774, 12489.88562870720},
+ {0.00000000137, 5.82029768354, 44809.65020086340},
+ {0.00000000134, 1.26539983018, 5331.35744374080},
+ {0.00000000103, 5.96518130595, 6321.10352262720},
+ {0.00000000109, 0.33808549034, 11300.58422135640},
+ {0.00000000129, 5.89187277190, 12029.34718788740},
+ {0.00000000122, 5.77325634636, 11919.14086666800},
+ {0.00000000107, 6.24998989350, 77690.75950573849},
+ {0.00000000107, 1.00535580713, 77736.78343050249},
+ {0.00000000115, 5.86963518266, 12721.57209941700},
+ {0.00000000102, 5.66283467269, 5540.08578945880},
+ {0.00000000143, 0.24122178432, 4214.06901508480},
+ {0.00000000143, 0.88529649733, 7576.56007357400},
+ {0.00000000107, 2.92124030351, 31415.37924995700},
+ {0.00000000100, 5.99485644501, 4061.21921539440},
+ {0.00000000103, 2.41941934525, 5547.19933645960},
+ {0.00000000104, 4.44106051277, 2118.76386037840},
+ {0.00000000110, 0.37559635174, 5863.59120611620},
+ {0.00000000124, 2.55619029611, 12539.85338018300},
+ {0.00000000110, 3.66952094465, 238004.52415723629},
+ {0.00000000112, 4.32512422724, 97238.62754448749},
+ {0.00000000120, 1.26895630075, 12043.57428188900},
+ {0.00000000097, 5.42612959752, 7834.12107263940},
+ {0.00000000094, 2.56461130309, 19004.64794940840},
+ {0.00000000105, 5.68272475301, 16522.65971600220},
+ {0.00000000117, 3.65425622684, 34520.30930938080},
+ {0.00000000108, 1.24206843948, 84672.47584450469},
+ {0.00000000098, 0.13589994287, 11080.17157891760},
+ {0.00000000097, 2.46722096722, 71980.63357473118},
+ {0.00000000095, 5.36958330451, 6288.59877429880},
+ {0.00000000096, 0.20796618776, 18139.29450141590},
+ {0.00000000111, 5.01961920313, 11823.16163945020},
+ {0.00000000090, 2.72355843779, 26880.31981303260},
+ {0.00000000099, 0.90164266199, 18635.92845453620},
+ {0.00000000126, 4.78722177847, 305281.94307104882},
+ {0.00000000124, 5.00979495566, 172146.97134054029},
+ {0.00000000090, 4.50544881196, 40077.61957352000},
+ {0.00000000104, 5.63679680710, 2787.04302385740},
+ {0.00000000091, 5.43564326147, 6272.03014972750},
+ {0.00000000100, 2.00639461597, 12323.42309600880},
+ {0.00000000117, 2.35555589778, 83286.91426955358},
+ {0.00000000105, 2.59824000109, 30666.15495843280},
+ {0.00000000090, 2.35779490026, 12491.37010141550},
+ {0.00000000089, 3.57152453732, 11720.06886523160},
+ {0.00000000095, 5.67015349858, 14919.01785375460},
+ {0.00000000087, 1.86043406047, 27707.54249429480},
+ {0.00000000106, 3.04150600352, 22345.26037610820},
+ {0.00000000082, 5.58298993353, 10241.20229116720},
+ {0.00000000083, 3.10607039533, 36147.40987730040},
+ {0.00000000094, 5.47749711149, 9924.81042151060},
+ {0.00000000082, 4.71988314145, 15141.39079431200},
+ {0.00000000096, 3.89073946348, 6379.05507720920},
+ {0.00000000110, 4.92131611151, 5621.84292321040},
+ {0.00000000110, 4.89978492291, 72140.62866668739},
+ {0.00000000097, 5.20764563059, 6303.43116939020},
+ {0.00000000085, 1.61269222311, 33326.57873317420},
+ {0.00000000093, 1.32651591333, 23020.65308658799},
+ {0.00000000090, 0.57733016380, 26482.17080962440},
+ {0.00000000078, 3.99588630754, 11293.47067435560},
+ {0.00000000106, 3.92012705073, 62883.35513951360},
+ {0.00000000098, 2.94397773524, 316.39186965660},
+ {0.00000000076, 3.96310417608, 29026.48522950779},
+ {0.00000000098, 0.95914722366, 48739.85989708300},
+ {0.00000000078, 1.97068528043, 90279.92316810328},
+ {0.00000000076, 0.23027966596, 21424.46664430340},
+ {0.00000000079, 1.46227790922, 8982.81066930900},
+ {0.00000000078, 2.28840998832, 266.60704172180},
+ {0.00000000071, 1.51940765590, 33794.54372352860},
+ {0.00000000076, 0.22880641443, 57375.80190084620},
+ {0.00000000097, 0.39449562097, 24279.10701821359},
+ {0.00000000075, 2.77638584795, 12964.30070339100},
+ {0.00000000077, 5.18846946344, 11520.99686379520},
+ {0.00000000068, 0.50006599129, 4274.51831083240},
+ {0.00000000075, 2.07323762803, 15664.03552270859},
+ {0.00000000077, 0.46665178780, 16207.88627150200},
+ {0.00000000081, 4.10452219483, 161710.61878623239},
+ {0.00000000071, 3.91415328513, 7875.67186362420},
+ {0.00000000081, 0.91938383406, 74.78159856730},
+ {0.00000000083, 4.69916218791, 23006.42599258639},
+ {0.00000000069, 0.98999300277, 6393.28217121080},
+ {0.00000000065, 5.41938745446, 28628.33622609960},
+ {0.00000000073, 2.45564765251, 15508.61512327440},
+ {0.00000000065, 3.02336771694, 5959.57043333400},
+ {0.00000000064, 0.18375587635, 1066.49547719000},
+ {0.00000000080, 5.81239171612, 12341.80690428090},
+ {0.00000000066, 2.15105504851, 38.02767263580},
+ {0.00000000067, 5.14047250153, 9814.60410029120},
+ {0.00000000062, 2.43313614978, 10138.10951694860},
+ {0.00000000068, 2.24442548639, 24383.07910844140},
+ {0.00000000078, 1.39649333997, 9411.46461508720},
+ {0.00000000059, 4.95362151577, 35707.71008290740},
+ {0.00000000073, 1.35229143121, 5327.47610838280},
+ {0.00000000057, 3.16018882154, 5490.30096152400},
+ {0.00000000072, 5.91833527334, 10881.09957748120},
+ {0.00000000067, 0.66414713064, 29864.33402730900},
+ {0.00000000065, 0.30352816135, 7018.95236352320},
+ {0.00000000059, 5.36231868425, 10239.58386601080},
+ {0.00000000056, 3.22196331515, 2636.72547263700},
+ {0.00000000068, 5.32086226658, 3116.65941225980},
+ {0.00000000059, 1.63156134967, 61306.01159706580},
+ {0.00000000054, 4.29491690425, 21947.11137270000},
+ {0.00000000070, 0.29271565928, 6528.90749622080},
+ {0.00000000057, 5.89190132575, 34513.26307268280},
+ {0.00000000054, 2.51856815404, 6279.19451463340},
+ {0.00000000074, 1.38235845304, 9967.45389998160},
+ {0.00000000054, 0.92276712152, 6286.95718534940},
+ {0.00000000070, 5.00933012248, 6453.74872061060},
+ {0.00000000053, 3.86543309344, 32370.97899156560},
+ {0.00000000055, 4.51794544854, 34911.41207609100},
+ {0.00000000063, 5.41479412056, 11502.83761653050},
+ {0.00000000063, 2.34416220742, 11510.70192305670},
+ {0.00000000056, 0.91310629913, 9910.58332750900},
+ {0.00000000067, 4.03308763854, 34596.36465465240},
+ {0.00000000060, 5.57024703495, 5756.90800324580},
+ {0.00000000072, 2.80863088166, 10866.87248347960},
+ {0.00000000066, 6.12047940728, 12074.48840752400},
+ {0.00000000051, 2.59519527563, 11396.56344857420},
+ {0.00000000062, 5.14746754396, 25287.72379939980},
+ {0.00000000054, 2.50994032776, 5999.21653112620},
+ {0.00000000051, 4.51195861837, 29822.78323632420},
+ {0.00000000059, 0.44167237876, 250570.67585721909},
+ {0.00000000051, 3.68849066760, 6262.72053059260},
+ {0.00000000049, 0.54704693048, 22594.05489571199},
+ {0.00000000065, 2.38423614501, 52670.06959330260},
+ {0.00000000069, 5.34363738671, 66813.56483573320},
+ {0.00000000056, 2.67216180349, 17892.93839400359},
+ {0.00000000049, 4.18361320516, 18606.49894600020},
+ {0.00000000055, 0.83886167974, 20452.86941222180},
+ {0.00000000050, 1.46327331958, 37455.72649597440},
+ {0.00000000058, 3.34847975377, 33990.61834428620},
+ {0.00000000065, 1.45522693982, 76251.32777062019},
+ {0.00000000056, 2.35650664200, 37724.75341974820},
+ {0.00000000048, 1.80689447612, 206.18554843720},
+ {0.00000000056, 3.84224878744, 5483.25472482600},
+ {0.00000000053, 0.17334326094, 77717.29458646949},
+ {0.00000000053, 0.79879700631, 77710.24834977149},
+ {0.00000000047, 0.43240779709, 735.87651353180},
+ {0.00000000053, 4.58786566028, 11616.97609101300},
+ {0.00000000048, 6.20230111054, 4171.42553661380},
+ {0.00000000052, 2.91719053030, 6993.00889854970},
+ {0.00000000057, 3.42008310383, 50317.20343953080},
+ {0.00000000048, 0.12356889012, 13362.44970679920},
+ {0.00000000060, 5.52056066934, 949.17560896980},
+ {0.00000000045, 3.37963782356, 10763.77970926100},
+ {0.00000000047, 5.50958184902, 12779.45079542080},
+ {0.00000000052, 5.42770349015, 310145.15282392364},
+ {0.00000000061, 2.93237974631, 5791.41255753260},
+ {0.00000000044, 2.87440620802, 8584.66166590080},
+ {0.00000000046, 4.03141796560, 10667.80048204320},
+ {0.00000000044, 1.21579107625, 6272.43918464160},
+ {0.00000000047, 2.57670800912, 11492.54267579200},
+ {0.00000000044, 3.62570223167, 63658.87775083760},
+ {0.00000000051, 0.84531181151, 12345.73905754400},
+ {0.00000000046, 1.17584556517, 149.56319713460},
+ {0.00000000043, 0.01524970172, 37853.87549938260},
+ {0.00000000043, 0.79038834934, 640.87760738220},
+ {0.00000000044, 2.22554419931, 6293.71251534120},
+ {0.00000000049, 1.01528394907, 149144.46708624958},
+ {0.00000000041, 3.27146326065, 8858.31494432060},
+ {0.00000000045, 3.03765521215, 65236.22129328540},
+ {0.00000000058, 5.45843180927, 1975.49254585600},
+ {0.00000000041, 1.32190847146, 2547.83753823240},
+ {0.00000000047, 3.67626039848, 28313.28880466100},
+ {0.00000000047, 6.21438985953, 10991.30589870060},
+ {0.00000000040, 2.37237751212, 8273.82086703240},
+ {0.00000000056, 1.09773690181, 77376.20102240759},
+ {0.00000000040, 2.35698541041, 2699.73481931760},
+ {0.00000000043, 5.28030897946, 17796.95916678580},
+ {0.00000000054, 2.59175932091, 22910.44676536859},
+ {0.00000000055, 0.07988985505, 83467.15635301729},
+ {0.00000000041, 4.47510694062, 5618.31980486140},
+ {0.00000000040, 1.35670430524, 27177.85152920020},
+ {0.00000000041, 2.48011323946, 6549.68289171320},
+ {0.00000000050, 2.56387920528, 82576.98122099529},
+ {0.00000000042, 4.78798367468, 7856.89627409019},
+ {0.00000000047, 2.75482175292, 18202.21671665939},
+ {0.00000000039, 1.97008298629, 24491.42579258340},
+ {0.00000000042, 4.04346599946, 7863.94251078820},
+ {0.00000000039, 3.01033936420, 853.19638175200},
+ {0.00000000038, 0.49178679251, 38650.17350619900},
+ {0.00000000044, 1.35931241699, 21393.54196985760},
+ {0.00000000036, 4.86047906533, 4157.19844261220},
+ {0.00000000043, 5.64354880978, 1062.90504853820},
+ {0.00000000039, 3.92736779879, 3903.91137641980},
+ {0.00000000040, 5.39694918320, 9498.21223063460},
+ {0.00000000043, 2.40863861919, 29424.63423291600},
+ {0.00000000046, 2.08022244271, 12573.26524698360},
+ {0.00000000050, 6.15760345261, 78051.34191383338},
+};
+
+static const struct ln_vsop earth_radius_r1[RADIUS_R1] = {
+ {0.00103018607, 1.10748968172, 6283.07584999140},
+ {0.00001721238, 1.06442300386, 12566.15169998280},
+ {0.00000702217, 3.14159265359, 0.00000000000},
+ {0.00000032345, 1.02168583254, 18849.22754997420},
+ {0.00000030801, 2.84358443952, 5507.55323866740},
+ {0.00000024978, 1.31906570344, 5223.69391980220},
+ {0.00000018487, 1.42428709076, 1577.34354244780},
+ {0.00000010077, 5.91385248388, 10977.07880469900},
+ {0.00000008635, 0.27158192945, 5486.77784317500},
+ {0.00000008654, 1.42046854427, 6275.96230299060},
+ {0.00000005069, 1.68613408916, 5088.62883976680},
+ {0.00000004985, 6.01402338185, 6286.59896834040},
+ {0.00000004667, 5.98749245692, 529.69096509460},
+ {0.00000004395, 0.51800423445, 4694.00295470760},
+ {0.00000003870, 4.74932206877, 2544.31441988340},
+ {0.00000003755, 5.07053801166, 796.29800681640},
+ {0.00000004100, 1.08424801084, 9437.76293488700},
+ {0.00000003518, 0.02290216978, 83996.84731811189},
+ {0.00000003436, 0.94937503872, 71430.69561812909},
+ {0.00000003221, 6.15628775321, 2146.16541647520},
+ {0.00000003418, 5.41151581880, 775.52261132400},
+ {0.00000002863, 5.48433323746, 10447.38783960440},
+ {0.00000002525, 0.24296913555, 398.14900340820},
+ {0.00000002205, 4.94892172085, 6812.76681508600},
+ {0.00000002186, 0.41991932164, 8031.09226305840},
+ {0.00000002828, 3.41986300734, 2352.86615377180},
+ {0.00000002554, 6.13241770582, 6438.49624942560},
+ {0.00000001932, 5.31374587091, 8429.24126646660},
+ {0.00000002427, 3.09118902115, 4690.47983635860},
+ {0.00000001730, 1.53685999718, 4705.73230754360},
+ {0.00000002250, 3.68836395620, 7084.89678111520},
+ {0.00000002094, 1.28169060400, 1748.01641306700},
+ {0.00000001483, 3.22226346483, 7234.79425624200},
+ {0.00000001434, 0.81293662216, 14143.49524243060},
+ {0.00000001754, 3.22883705112, 6279.55273164240},
+ {0.00000001583, 4.09815978783, 11499.65622279280},
+ {0.00000001575, 5.53890314149, 3154.68708489560},
+ {0.00000001847, 1.82041234937, 7632.94325965020},
+ {0.00000001499, 3.63177937611, 11513.88331679440},
+ {0.00000001337, 4.64442556061, 6836.64525283380},
+ {0.00000001275, 2.69329661394, 1349.86740965880},
+ {0.00000001348, 6.15284035323, 5746.27133789600},
+ {0.00000001126, 3.35676107739, 17789.84561978500},
+ {0.00000001470, 3.65282991735, 1194.44701022460},
+ {0.00000001101, 4.49747427670, 4292.33083295040},
+ {0.00000001168, 2.58033028504, 13367.97263110660},
+ {0.00000001236, 5.64980098028, 5760.49843189760},
+ {0.00000000985, 0.65326301914, 5856.47765911540},
+ {0.00000000928, 2.32555018290, 10213.28554621100},
+ {0.00000001073, 5.82672338169, 12036.46073488820},
+ {0.00000000918, 0.76907130762, 16730.46368959580},
+ {0.00000000876, 1.50335727807, 11926.25441366880},
+ {0.00000001023, 5.62071200879, 6256.77753019160},
+ {0.00000000853, 0.65678134630, 155.42039943420},
+ {0.00000000802, 4.10519132094, 951.71840625060},
+ {0.00000000859, 1.42880883564, 5753.38488489680},
+ {0.00000000992, 1.14238001610, 1059.38193018920},
+ {0.00000000814, 1.63584008733, 6681.22485339960},
+ {0.00000000664, 4.55039663226, 5216.58037280140},
+ {0.00000000627, 1.50782904323, 5643.17856367740},
+ {0.00000000644, 4.19480024859, 6040.34724601740},
+ {0.00000000590, 6.18371704849, 4164.31198961300},
+ {0.00000000635, 0.52423584770, 6290.18939699220},
+ {0.00000000650, 0.97935492869, 25132.30339996560},
+ {0.00000000568, 2.30121525349, 10973.55568635000},
+ {0.00000000549, 5.26737827342, 3340.61242669980},
+ {0.00000000547, 2.20143332641, 1592.59601363280},
+ {0.00000000526, 0.92464258271, 11371.70468975820},
+ {0.00000000493, 5.91036281399, 3894.18182954220},
+ {0.00000000483, 1.66005711540, 12168.00269657460},
+ {0.00000000514, 3.59683072524, 10969.96525769820},
+ {0.00000000516, 3.97164781773, 17298.18232732620},
+ {0.00000000529, 5.03538677680, 9917.69687450980},
+ {0.00000000487, 2.50544745305, 6127.65545055720},
+ {0.00000000419, 4.05235655996, 10984.19235169980},
+ {0.00000000538, 5.54081539813, 553.56940284240},
+ {0.00000000402, 2.16859478359, 7860.41939243920},
+ {0.00000000552, 2.32219865498, 11506.76976979360},
+ {0.00000000367, 3.39145698451, 6496.37494542940},
+ {0.00000000360, 5.34467204596, 7079.37385680780},
+ {0.00000000334, 3.61346365667, 11790.62908865880},
+ {0.00000000454, 0.28755421898, 801.82093112380},
+ {0.00000000419, 3.69613970002, 10575.40668294180},
+ {0.00000000319, 0.30793759304, 16200.77272450120},
+ {0.00000000376, 5.81560210508, 7058.59846131540},
+ {0.00000000364, 1.08425056923, 6309.37416979120},
+ {0.00000000294, 4.54798604178, 11856.21865142450},
+ {0.00000000290, 1.26451946335, 8635.94200376320},
+ {0.00000000394, 4.15683669084, 26.29831979980},
+ {0.00000000260, 5.09424572996, 10177.25767953360},
+ {0.00000000241, 2.25766000302, 11712.95531823080},
+ {0.00000000239, 1.06936978753, 242.72860397400},
+ {0.00000000276, 3.44260568764, 5884.92684658320},
+ {0.00000000255, 5.38496803122, 21228.39202354580},
+ {0.00000000307, 4.24313885601, 3738.76143010800},
+ {0.00000000213, 3.44661200485, 213.29909543800},
+ {0.00000000198, 0.69427265195, 1990.74501704100},
+ {0.00000000195, 5.16563409007, 12352.85260454480},
+ {0.00000000213, 3.89937836808, 13916.01910964160},
+ {0.00000000214, 4.00445200772, 5230.80746680300},
+ {0.00000000184, 5.59805976614, 6283.14316029419},
+ {0.00000000184, 2.85275392124, 7238.67559160000},
+ {0.00000000179, 2.54259058252, 14314.16811304980},
+ {0.00000000236, 5.58826125715, 6069.77675455340},
+ {0.00000000189, 2.72689937708, 6062.66320755260},
+ {0.00000000184, 6.04216273598, 6283.00853968860},
+ {0.00000000225, 1.66128561344, 4732.03062734340},
+ {0.00000000230, 3.62591335086, 6284.05617105960},
+ {0.00000000172, 0.97566476085, 3930.20969621960},
+ {0.00000000162, 2.19467339429, 18073.70493865020},
+ {0.00000000215, 1.04672844028, 3496.03282613400},
+ {0.00000000182, 5.17782354566, 17253.04110768959},
+ {0.00000000167, 2.17754938066, 6076.89030155420},
+ {0.00000000167, 4.75672473773, 17267.26820169119},
+ {0.00000000149, 0.80944185798, 709.93304855830},
+ {0.00000000149, 0.17584214812, 9779.10867612540},
+ {0.00000000192, 5.00680790235, 11015.10647733480},
+ {0.00000000141, 4.38420380014, 4136.91043351620},
+ {0.00000000158, 4.60969054283, 9623.68827669120},
+ {0.00000000133, 3.30507062245, 154717.60988768269},
+ {0.00000000166, 6.13191098325, 3.52311834900},
+ {0.00000000181, 1.60715321141, 7.11354700080},
+ {0.00000000150, 5.28136702046, 13517.87010623340},
+ {0.00000000142, 0.49788089569, 25158.60171976540},
+ {0.00000000124, 6.03440459813, 9225.53927328300},
+ {0.00000000124, 0.99251562639, 65147.61976813770},
+ {0.00000000128, 1.92032744711, 22483.84857449259},
+ {0.00000000124, 3.99739675184, 4686.88940770680},
+ {0.00000000121, 2.37814805239, 167283.76158766549},
+ {0.00000000123, 5.62315112940, 5642.19824260920},
+ {0.00000000117, 5.81755956156, 12569.67481833180},
+ {0.00000000157, 3.40236948518, 16496.36139620240},
+ {0.00000000130, 2.10499918142, 1589.07289528380},
+ {0.00000000116, 0.55839966736, 5849.36411211460},
+ {0.00000000123, 5.81645568991, 6282.09552892320},
+ {0.00000000110, 0.42176497674, 6172.86952877200},
+ {0.00000000150, 4.26279600865, 3128.38876509580},
+ {0.00000000106, 2.27436561182, 5429.87946823940},
+ {0.00000000114, 1.52894564202, 12559.03815298200},
+ {0.00000000121, 0.39459045915, 12132.43996210600},
+ {0.00000000104, 2.41845930933, 426.59819087600},
+ {0.00000000109, 5.82786999856, 16858.48253293320},
+ {0.00000000102, 4.46626484910, 23543.23050468179},
+ {0.00000000100, 2.93812275274, 4535.05943692440},
+ {0.00000000097, 3.97935904984, 6133.51265285680},
+ {0.00000000098, 0.87616810121, 6525.80445396540},
+ {0.00000000110, 6.22339014386, 12146.66705610760},
+ {0.00000000098, 3.17344332543, 10440.27429260360},
+ {0.00000000096, 2.44128701699, 3097.88382272579},
+ {0.00000000099, 5.75642493267, 7342.45778018060},
+ {0.00000000090, 0.18984343165, 13119.72110282519},
+ {0.00000000099, 5.58884724219, 2388.89402044920},
+ {0.00000000091, 6.04278320182, 20426.57109242200},
+ {0.00000000080, 1.29028142103, 5650.29211067820},
+ {0.00000000086, 3.94529200528, 10454.50138660520},
+ {0.00000000085, 1.92836879835, 29088.81141598500},
+ {0.00000000076, 2.70726317966, 143571.32428481648},
+ {0.00000000091, 5.63859073351, 8827.39026987480},
+ {0.00000000076, 1.80783856698, 28286.99048486120},
+ {0.00000000075, 3.40858032804, 5481.25491886760},
+ {0.00000000070, 4.53719487231, 17256.63153634140},
+ {0.00000000089, 1.10064490942, 11769.85369316640},
+ {0.00000000066, 2.78384937771, 536.80451209540},
+ {0.00000000068, 3.88199295043, 17260.15465469040},
+ {0.00000000088, 3.88075269535, 7477.52286021600},
+ {0.00000000061, 6.17558202197, 11087.28512591840},
+ {0.00000000060, 4.34824715818, 6206.80977871580},
+ {0.00000000082, 4.59843208943, 9388.00590941520},
+ {0.00000000079, 1.63139280394, 4933.20844033260},
+ {0.00000000081, 1.55550779371, 9380.95967271720},
+ {0.00000000078, 4.20905757519, 5729.50644714900},
+ {0.00000000058, 5.76889633224, 3634.62102451840},
+ {0.00000000060, 0.93813100594, 12721.57209941700},
+ {0.00000000071, 6.11408885148, 8662.24032356300},
+ {0.00000000057, 5.48112524468, 18319.53658487960},
+ {0.00000000070, 0.01749174864, 14945.31617355440},
+ {0.00000000074, 1.09976045820, 16460.33352952499},
+ {0.00000000056, 1.63036186739, 15720.83878487840},
+ {0.00000000055, 4.86788348404, 13095.84266507740},
+ {0.00000000060, 5.93729841267, 12539.85338018300},
+ {0.00000000054, 0.22608242982, 15110.46611986620},
+ {0.00000000054, 2.30250047594, 16062.18452611680},
+ {0.00000000064, 2.13513754101, 7875.67186362420},
+ {0.00000000059, 5.87963500139, 5331.35744374080},
+ {0.00000000058, 2.30546168615, 955.59974160860},
+ {0.00000000049, 1.93839278478, 5333.90024102160},
+ {0.00000000054, 5.80331607119, 12043.57428188900},
+ {0.00000000054, 4.44671053809, 4701.11650170840},
+ {0.00000000049, 0.30241161485, 6805.65326808520},
+ {0.00000000046, 2.76898193028, 6709.67404086740},
+ {0.00000000046, 3.98449608961, 98068.53671630539},
+ {0.00000000049, 3.72022009896, 12323.42309600880},
+ {0.00000000045, 3.30065998328, 22003.91463486980},
+ {0.00000000048, 0.71071357303, 6303.43116939020},
+ {0.00000000061, 1.66030429494, 6262.30045449900},
+ {0.00000000047, 1.26317154881, 11919.14086666800},
+ {0.00000000051, 1.08020906825, 10988.80815753500},
+ {0.00000000045, 0.89150445122, 51868.24866217880},
+ {0.00000000043, 0.57756724285, 24356.78078864160},
+ {0.00000000043, 1.61526242998, 6277.55292568400},
+ {0.00000000045, 2.96132920534, 8982.81066930900},
+ {0.00000000043, 5.74295325645, 11403.67699557500},
+ {0.00000000055, 3.14274403422, 33019.02111220460},
+ {0.00000000057, 0.06379726305, 15671.08175940660},
+ {0.00000000041, 2.53761820726, 6262.72053059260},
+ {0.00000000040, 1.53130436944, 18451.07854656599},
+ {0.00000000052, 1.71451922581, 1551.04522264800},
+ {0.00000000055, 0.89439119424, 11933.36796066960},
+ {0.00000000045, 3.88495384656, 60530.48898574180},
+ {0.00000000040, 4.75740908001, 38526.57435087200},
+ {0.00000000040, 3.77498297348, 26087.90314157420},
+ {0.00000000039, 2.97113832621, 2118.76386037840},
+ {0.00000000040, 3.36050962605, 10021.83728009940},
+ {0.00000000047, 1.67051113434, 6303.85124548380},
+ {0.00000000052, 5.21827368711, 77713.77146812050},
+ {0.00000000047, 4.26356628717, 21424.46664430340},
+ {0.00000000037, 1.66712389942, 6819.88036208680},
+ {0.00000000037, 0.65746800933, 12029.34718788740},
+ {0.00000000035, 3.36255650927, 24072.92146977640},
+ {0.00000000036, 0.11087914947, 10344.29506538580},
+ {0.00000000040, 4.14725582115, 2787.04302385740},
+ {0.00000000035, 5.93650887012, 31570.79964939120},
+ {0.00000000036, 2.15108874765, 30774.50164257480},
+ {0.00000000036, 1.75078825382, 16207.88627150200},
+ {0.00000000034, 2.75708224536, 12139.55350910680},
+ {0.00000000034, 6.16891378800, 24491.42579258340},
+ {0.00000000034, 2.31528650443, 55798.45835839840},
+ {0.00000000032, 4.21446357042, 15664.03552270859},
+ {0.00000000034, 3.19783054699, 32217.20018108080},
+ {0.00000000039, 1.24979117796, 6418.14093002680},
+ {0.00000000038, 5.89832942685, 640.87760738220},
+ {0.00000000033, 4.80200120107, 16723.35014259500},
+ {0.00000000032, 1.72442327688, 27433.88921587499},
+ {0.00000000035, 4.44608896525, 18202.21671665939},
+ {0.00000000031, 4.52790731280, 6702.56049386660},
+ {0.00000000034, 3.96287980676, 18216.44381066100},
+ {0.00000000030, 5.06259854444, 226858.23855437008},
+ {0.00000000034, 1.43910280005, 49515.38250840700},
+ {0.00000000030, 0.29303163371, 13521.75144159140},
+ {0.00000000029, 2.02633840220, 11609.86254401220},
+ {0.00000000030, 2.54923230240, 9924.81042151060},
+ {0.00000000032, 4.91793198558, 11300.58422135640},
+ {0.00000000030, 0.23284423547, 23581.25817731760},
+ {0.00000000029, 1.62807736495, 639.89728631400},
+ {0.00000000028, 3.84568936822, 2699.73481931760},
+ {0.00000000029, 1.83149729794, 29822.78323632420},
+ {0.00000000033, 4.60320094415, 19004.64794940840},
+ {0.00000000027, 1.86151121799, 6288.59877429880},
+ {0.00000000030, 4.46494072240, 36147.40987730040},
+ {0.00000000028, 5.19684492912, 5863.59120611620},
+ {0.00000000035, 4.52695674113, 36949.23080842420},
+ {0.00000000027, 3.52528177609, 10770.89325626180},
+ {0.00000000026, 1.48499438453, 11080.17157891760},
+ {0.00000000035, 2.82154380962, 19402.79695281660},
+ {0.00000000025, 2.46339998836, 6279.48542133960},
+ {0.00000000026, 4.97688894643, 16737.57723659660},
+ {0.00000000027, 0.40827112500, 12964.30070339100},
+ {0.00000000029, 4.15148654061, 45892.73043315699},
+ {0.00000000026, 4.56404104286, 17796.95916678580},
+ {0.00000000025, 2.89309528854, 6286.66627864320},
+ {0.00000000026, 4.82914580957, 1066.49547719000},
+ {0.00000000031, 3.93096113738, 29864.33402730900},
+ {0.00000000024, 6.14987193584, 18606.49894600020},
+ {0.00000000024, 3.74225964547, 29026.48522950779},
+ {0.00000000025, 5.70460621565, 27707.54249429480},
+ {0.00000000025, 5.33928840652, 15141.39079431200},
+ {0.00000000023, 2.37624087345, 17996.03116822220},
+ {0.00000000026, 1.34231351782, 18875.52586977400},
+ {0.00000000022, 5.50791626120, 6245.04817735560},
+ {0.00000000024, 1.33998410121, 19800.94595622480},
+ {0.00000000023, 0.22512280890, 6279.78949257360},
+ {0.00000000022, 1.17576471775, 11925.27409260060},
+ {0.00000000022, 3.58603606640, 6915.85958930460},
+ {0.00000000023, 3.21621246666, 6286.36220740920},
+ {0.00000000029, 2.09564449439, 15265.88651930040},
+ {0.00000000022, 4.74660932338, 28230.18722269139},
+ {0.00000000021, 2.30688751432, 5999.21653112620},
+ {0.00000000028, 3.92087592807, 18208.34994259200},
+ {0.00000000021, 3.22643339385, 25934.12433108940},
+ {0.00000000021, 3.04956726238, 6566.93516885660},
+ {0.00000000027, 5.35645770522, 33794.54372352860},
+ {0.00000000025, 5.91542362188, 6489.26139842860},
+ {0.00000000020, 1.52296293311, 135.06508003540},
+ {0.00000000019, 1.78134428631, 156137.47598479928},
+ {0.00000000019, 0.34388684087, 5327.47610838280},
+ {0.00000000026, 3.41701003233, 25287.72379939980},
+ {0.00000000019, 2.86664271911, 18422.62935909819},
+ {0.00000000019, 4.71432851499, 77690.75950573849},
+ {0.00000000019, 2.54227398241, 77736.78343050249},
+ {0.00000000020, 5.91915117116, 48739.85989708300},
+};
+
+static const struct ln_vsop earth_radius_r2[RADIUS_R2] = {
+ {0.00004359385, 5.78455133808, 6283.07584999140},
+ {0.00000123633, 5.57935427994, 12566.15169998280},
+ {0.00000012342, 3.14159265359, 0.00000000000},
+ {0.00000008792, 3.62777893099, 77713.77146812050},
+ {0.00000005689, 1.86958905084, 5573.14280143310},
+ {0.00000003302, 5.47034879713, 18849.22754997420},
+ {0.00000001471, 4.47964125007, 5507.55323866740},
+ {0.00000001013, 2.81323115556, 5223.69391980220},
+ {0.00000000854, 3.10776566900, 1577.34354244780},
+ {0.00000001102, 2.84173992403, 161000.68573767410},
+ {0.00000000648, 5.47348203398, 775.52261132400},
+ {0.00000000608, 1.37894173533, 6438.49624942560},
+ {0.00000000499, 4.41649242250, 6286.59896834040},
+ {0.00000000416, 0.90332697974, 10977.07880469900},
+ {0.00000000404, 3.20567269530, 5088.62883976680},
+ {0.00000000351, 1.81081728907, 5486.77784317500},
+ {0.00000000466, 3.65086758149, 7084.89678111520},
+ {0.00000000458, 5.38585314743, 149854.40013480789},
+ {0.00000000304, 3.51015066341, 796.29800681640},
+ {0.00000000266, 6.17413982699, 6836.64525283380},
+ {0.00000000281, 1.83874672540, 4694.00295470760},
+ {0.00000000262, 1.41420110644, 2146.16541647520},
+ {0.00000000264, 3.14103683911, 71430.69561812909},
+ {0.00000000319, 5.35037932146, 3154.68708489560},
+ {0.00000000238, 2.17695432424, 155.42039943420},
+ {0.00000000229, 4.75969588070, 7234.79425624200},
+ {0.00000000291, 4.61776401638, 4690.47983635860},
+ {0.00000000211, 0.21864885298, 4705.73230754360},
+ {0.00000000204, 4.22895113488, 1349.86740965880},
+ {0.00000000195, 4.58550676556, 529.69096509460},
+ {0.00000000255, 2.81442711144, 1748.01641306700},
+ {0.00000000182, 5.70454011389, 6040.34724601740},
+ {0.00000000180, 6.02147727878, 4292.33083295040},
+ {0.00000000186, 1.58690991244, 6309.37416979120},
+ {0.00000000167, 2.88802733052, 9437.76293488700},
+ {0.00000000166, 1.99990574734, 8031.09226305840},
+ {0.00000000160, 0.04412738495, 2544.31441988340},
+ {0.00000000197, 2.01089431842, 1194.44701022460},
+ {0.00000000165, 5.78372596774, 83996.84731811189},
+ {0.00000000214, 3.38300910371, 7632.94325965020},
+ {0.00000000140, 0.36669664351, 10447.38783960440},
+ {0.00000000151, 0.95519595275, 6127.65545055720},
+ {0.00000000136, 1.48417295645, 2352.86615377180},
+ {0.00000000128, 5.48057748834, 951.71840625060},
+ {0.00000000126, 5.26866506592, 6279.55273164240},
+ {0.00000000127, 3.77552907014, 6812.76681508600},
+ {0.00000000103, 4.95897533789, 398.14900340820},
+ {0.00000000104, 0.70183576826, 1592.59601363280},
+ {0.00000000101, 1.14481598642, 3894.18182954220},
+ {0.00000000131, 0.76624310306, 553.56940284240},
+ {0.00000000109, 5.41063597567, 6256.77753019160},
+ {0.00000000078, 5.84775340741, 242.72860397400},
+ {0.00000000097, 1.94685257714, 11856.21865142450},
+ {0.00000000100, 5.19725292131, 244287.60000722769},
+ {0.00000000076, 0.70480774041, 8429.24126646660},
+ {0.00000000080, 6.18430772683, 1059.38193018920},
+ {0.00000000068, 5.29561709093, 14143.49524243060},
+ {0.00000000085, 5.39487308005, 25132.30339996560},
+ {0.00000000055, 5.16874637579, 7058.59846131540},
+ {0.00000000063, 0.48494730699, 801.82093112380},
+ {0.00000000058, 4.07254840265, 13367.97263110660},
+ {0.00000000051, 3.89696552232, 12036.46073488820},
+ {0.00000000051, 5.56335232286, 1990.74501704100},
+ {0.00000000060, 2.25046596710, 8635.94200376320},
+ {0.00000000049, 5.58163417371, 6290.18939699220},
+ {0.00000000051, 3.87240194908, 26.29831979980},
+ {0.00000000051, 4.19300909995, 7860.41939243920},
+ {0.00000000041, 3.97169191582, 10973.55568635000},
+ {0.00000000041, 3.57080919230, 7079.37385680780},
+ {0.00000000056, 2.76959005761, 90955.55169449610},
+ {0.00000000042, 1.91461189163, 7477.52286021600},
+ {0.00000000042, 0.42775891995, 10213.28554621100},
+ {0.00000000042, 1.06925480488, 709.93304855830},
+ {0.00000000038, 6.17935925345, 9917.69687450980},
+ {0.00000000050, 0.81691517401, 11506.76976979360},
+ {0.00000000053, 1.45828359397, 233141.31440436149},
+ {0.00000000038, 3.32444534628, 5643.17856367740},
+ {0.00000000047, 6.21543665927, 6681.22485339960},
+ {0.00000000037, 0.36359309980, 10177.25767953360},
+ {0.00000000045, 5.29587706357, 10575.40668294180},
+ {0.00000000034, 5.63446915337, 6525.80445396540},
+ {0.00000000034, 5.36385158519, 4933.20844033260},
+ {0.00000000035, 5.36152295839, 25158.60171976540},
+ {0.00000000042, 5.08837645072, 11015.10647733480},
+ {0.00000000042, 4.22496037505, 88860.05707098669},
+ {0.00000000039, 1.99171699618, 6284.05617105960},
+ {0.00000000029, 3.19088628170, 11926.25441366880},
+ {0.00000000029, 0.14996158324, 12168.00269657460},
+ {0.00000000030, 1.58346276808, 9779.10867612540},
+ {0.00000000026, 4.16210340581, 12569.67481833180},
+ {0.00000000036, 2.74684637873, 3738.76143010800},
+ {0.00000000026, 0.72824915320, 1589.07289528380},
+ {0.00000000031, 5.34906371821, 143571.32428481648},
+ {0.00000000025, 0.10240267494, 22483.84857449259},
+ {0.00000000030, 3.47110495524, 14945.31617355440},
+ {0.00000000026, 3.89359701125, 5753.38488489680},
+ {0.00000000024, 1.18744224678, 4535.05943692440},
+ {0.00000000033, 2.99317143244, 3930.20969621960},
+ {0.00000000024, 1.57253767584, 6496.37494542940},
+ {0.00000000024, 3.47434797542, 4136.91043351620},
+ {0.00000000022, 3.91230073719, 6275.96230299060},
+ {0.00000000025, 4.02978941287, 3128.38876509580},
+ {0.00000000023, 1.07724492065, 12721.57209941700},
+ {0.00000000021, 1.89591807148, 16730.46368959580},
+ {0.00000000025, 2.42198937013, 5729.50644714900},
+ {0.00000000020, 1.78163489101, 17789.84561978500},
+ {0.00000000021, 0.49258939822, 29088.81141598500},
+ {0.00000000026, 4.14947806747, 2388.89402044920},
+ {0.00000000027, 2.54785812264, 3496.03282613400},
+ {0.00000000020, 4.29944129273, 16858.48253293320},
+ {0.00000000021, 5.97796936723, 7.11354700080},
+ {0.00000000019, 0.80292033311, 16062.18452611680},
+ {0.00000000024, 4.89894141052, 17260.15465469040},
+ {0.00000000025, 1.37003752175, 6282.09552892320},
+ {0.00000000022, 4.92663152168, 18875.52586977400},
+ {0.00000000023, 5.68902059771, 16460.33352952499},
+ {0.00000000023, 3.03021283729, 66567.48586525429},
+ {0.00000000016, 3.89713736666, 5331.35744374080},
+ {0.00000000016, 5.68562539832, 12559.03815298200},
+ {0.00000000016, 3.95085099736, 3097.88382272579},
+ {0.00000000016, 3.99041783945, 6283.14316029419},
+ {0.00000000020, 6.10643919100, 167283.76158766549},
+ {0.00000000015, 4.09775914607, 11712.95531823080},
+ {0.00000000016, 5.71769940700, 17298.18232732620},
+ {0.00000000016, 3.28894009404, 5884.92684658320},
+ {0.00000000015, 4.42564243680, 13517.87010623340},
+ {0.00000000016, 4.43452080930, 6283.00853968860},
+ {0.00000000014, 1.44384279999, 4164.31198961300},
+ {0.00000000014, 4.47380919159, 11790.62908865880},
+ {0.00000000014, 4.77646531825, 7342.45778018060},
+ {0.00000000011, 2.56768522896, 5481.25491886760},
+ {0.00000000011, 1.51443332200, 16200.77272450120},
+ {0.00000000011, 0.88708889185, 21228.39202354580},
+ {0.00000000014, 4.50116508534, 640.87760738220},
+};
+
+static const struct ln_vsop earth_radius_r3[RADIUS_R3] = {
+ {0.00000144595, 4.27319433901, 6283.07584999140},
+ {0.00000006729, 3.91706261708, 12566.15169998280},
+ {0.00000000774, 0.00000000000, 0.00000000000},
+ {0.00000000247, 3.73021571217, 18849.22754997420},
+ {0.00000000036, 2.80081409050, 6286.59896834040},
+ {0.00000000033, 5.62990083112, 6127.65545055720},
+ {0.00000000018, 3.72826142555, 6438.49624942560},
+ {0.00000000016, 4.26011484232, 6525.80445396540},
+ {0.00000000014, 3.47817116396, 6256.77753019160},
+ {0.00000000012, 3.55747379482, 25132.30339996560},
+ {0.00000000010, 4.43995693209, 4705.73230754360},
+ {0.00000000010, 4.28045255470, 83996.84731811189},
+ {0.00000000009, 5.36457057335, 6040.34724601740},
+ {0.00000000008, 1.78458957263, 5507.55323866740},
+ {0.00000000009, 0.47275199930, 6279.55273164240},
+ {0.00000000009, 1.34741231639, 6309.37416979120},
+ {0.00000000009, 0.77092900708, 5729.50644714900},
+ {0.00000000007, 3.50146897332, 7058.59846131540},
+ {0.00000000005, 2.89071061700, 775.52261132400},
+ {0.00000000006, 2.36514111314, 6836.64525283380},
+};
+
+static const struct ln_vsop earth_radius_r4[RADIUS_R4] = {
+ {0.00000003858, 2.56389016346, 6283.07584999140},
+ {0.00000000306, 2.26911740541, 12566.15169998280},
+ {0.00000000053, 3.44031471924, 5573.14280143310},
+ {0.00000000015, 2.03136359366, 18849.22754997420},
+ {0.00000000013, 2.05688873673, 77713.77146812050},
+ {0.00000000007, 4.41218854480, 161000.68573767410},
+ {0.00000000004, 5.33854414781, 6438.49624942560},
+ {0.00000000006, 3.81514213664, 149854.40013480789},
+ {0.00000000004, 4.26602478239, 6127.65545055720},
+};
+
+static const struct ln_vsop earth_radius_r5[RADIUS_R5] = {
+ {0.00000000086, 1.21805304895, 6283.07584999140},
+ {0.00000000012, 0.65572878044, 12566.15169998280},
+};
+
+
+/* Use in earth-sun function */
+double ln_calc_series(const struct ln_vsop *data, int terms, double t)
+{
+ double value = 0;
+ int i;
+
+ for (i = 0; i < terms; i++) {
+ value += data->A * cos(data->B + data->C * t);
+ data++;
+ }
+
+ return value;
+}
+
+/* Get Julian day from Gregorian year, month and day */
+double julian_int(int year, int month, int day)
+{
+ int a, b;
+
+ if (month < 3) {
+ year--;
+ month += 12;
+ }
+
+ /* check for Julian or Gregorian calendar (starts Oct 4th 1582) */
+ b = 0;
+ if (year > 1582 ||
+ (year == 1582 && (month > 10 || (month == 10 && day >= 4)))) {
+ a = year / 100;
+ b = 2 - a + (a / 4);
+ }
+
+ return ((int)(365.25 * (year + 4716)) + (int)(30.6001 * (month + 1)) + day +
+ b - 1524.5);
+}
+
+/* Get Julian day form Gregorian string yyyy-mm-dd */
+double julian_char(char date[])
+{
+ int day, month, year;
+
+ year = atoi(date);
+ month = atoi(date + 5);
+ day = atoi(date + 8);
+
+ return julian_int(year, month, day);
+}
+
+/* Earth-Sun distance in astronomical units */
+double earth_sun(char *date)
+{
+ double t;
+ double R0, R1, R2, R3, R4, R5;
+
+ t = (julian_char(date) - 2451545.0) / 365250.0;
+
+ R0 = ln_calc_series(earth_radius_r0, RADIUS_R0, t);
+ R1 = ln_calc_series(earth_radius_r1, RADIUS_R1, t);
+ R2 = ln_calc_series(earth_radius_r2, RADIUS_R2, t);
+ R3 = ln_calc_series(earth_radius_r3, RADIUS_R3, t);
+ R4 = ln_calc_series(earth_radius_r4, RADIUS_R4, t);
+ R5 = ln_calc_series(earth_radius_r5, RADIUS_R5, t);
+
+ return (R0 + R1 * t + R2 * t * t + R3 * t * t * t + R4 * t * t * t * t +
+ R5 * t * t * t * t * t);
+}
Added: grass-addons/grass7/imagery/i.landsat.toar/earth_sun.h
===================================================================
--- grass-addons/grass7/imagery/i.landsat.toar/earth_sun.h (rev 0)
+++ grass-addons/grass7/imagery/i.landsat.toar/earth_sun.h 2009-01-31 16:37:15 UTC (rev 35689)
@@ -0,0 +1,25 @@
+/*
+ * Modified from LIBNOVA-0.12: see earth-sun.c
+ *
+ * Copyright (C) 2000 - 2005 Liam Girdwood
+ * Modified to GRASS (C) 2006 E. Jorge Tizado
+ */
+
+#ifndef _EARTH_SUN_H
+#define _EARTH_SUN_H
+
+struct ln_vsop
+{
+ double A;
+ double B;
+ double C;
+};
+
+/* Local prototypes */
+
+double ln_calc_series(const struct ln_vsop *data, int terms, double t);
+double julian_int(int year, int month, int day);
+double julian_char(char date[]);
+double earth_sun(char date[]);
+
+#endif
Added: grass-addons/grass7/imagery/i.landsat.toar/i.landsat.toar.html
===================================================================
--- grass-addons/grass7/imagery/i.landsat.toar/i.landsat.toar.html (rev 0)
+++ grass-addons/grass7/imagery/i.landsat.toar/i.landsat.toar.html 2009-01-31 16:37:15 UTC (rev 35689)
@@ -0,0 +1,124 @@
+<H2>DESCRIPTION</H2>
+
+<p><em>i.landsat.toar</em> is to transform calibrated digital number of Landsat products to top-of-atmosphere radiance or top-of-atmosphere reflectance and temperature (band 6 of the sensors TM and ETM+). Optionally, to calculate the at-surface radiance or reflectance with atmosferic correction (DOS method).</p>
+
+<p>Usually, to do this the production date, the acquisition date, and the solar elevation is needed. Moreover, also is needed for Landsat-7 ETM+ the gain (high or low) of the nine bands.</p>
+
+<p>Optionally, the data can be read from header file (.met) for all Landsat MSS, TM and ETM+. However, if the solar elevation or the product creation date are given the values of metfile are overwriten. This is necessary when this data in metfile are incorrects or imprecisses.</p>
+
+<p><b>Attention</b>: Any null value or less than QCALmin in input raster is set to null in output raster and it is not included in the equations.</p>
+
+
+<H2>Uncorrected at-sensor values (method=uncorrected, default)</H2>
+
+<p>The standard geometric and radiometric correction results in a calibrated digital number (QCAL = DN) images. To further standardize the impact of illumination geometry, the QCAL images are converted first to at-sensor radiance and then to at-sensor reflectance. The thermal band is first converted from QCAL to at-sensor radiance, and then to effective at-sensor temperature in Kelvin degrees.</p>
+
+<p>Radiometric calibration convert QCAL to <b>at-sensor radiance</b>, a radiometric quantity measured in W/(m^2 sr um) with the equations:</p>
+<ul>
+ <li> gain = (Lmax - Lmin) / (QCALmax - QCALmin)</li>
+ <li> bias = Lmin - (gain x QCALmin) </li>
+ <li> radiance = (gain x QCAL) + bias </li>
+</ul>
+<p>where, <em>Lmax</em> and <em>Lmin</em> are the calibration constants, and <em>QCALmax</em> and <em>QCALmin</em> are the highest and the lowest points of the range of rescaled radiance in QCAL.</p>
+
+<p>Then, to calculate <b>at-sensor reflectance</b> the equations are:</p>
+<ul>
+ <li> sun_radiance = [Esun x sin(e)] / (PI x d^2)</li>
+ <li> reflectance = radiance / sun_radiance </li>
+</ul>
+<p>where, <em>d</em> is the earth-sun distance in astronomical units, <em>e</em> is the solar elevation angle, and <em>Esun</em> is the mean solar exoatmospheric irradiance in W/(m^2 um).</p>
+
+
+<H2>Corrected at-sensor values (method=corrected)</H2>
+
+<p>At-sensor reflectance values range from zero to one, whereas at-sensor radiance must be greater or equal to zero. However, since Lmin can be a negative number then the at-sensor values also it can be negative. To avoid these possible negative values and set the minimum possible values at-sentor to zero, this method correct the radiance to output a corrected at-sensor values with the equations (not for thermal bands):</p>
+<ul>
+ <li> radiance = (uncorrected_radiance - Lmin) </li>
+ <li> reflectance = radiance / sun_radiance </li>
+</ul>
+
+<p><b>Note</b>: Other possibility to avoid negative values is set to zero this values (radiance and/or reflectance), but this option is ease with uncorrected method and r.mapcalc.</p>
+
+
+<H2>Simplified at-surface values (method=dos[1-4])</H2>
+
+<p>Atmospheric correction and reflectance calibration remove the path radiance, i.e. the stray light from the atmosphere, and the spectral effect of solar illumination. To output these simple <b>at-surface radiance</b> and <b>at-surface reflectance</b>, the equations are (not for thermal bands):</p>
+<ul>
+ <li> sun_radiance = TAUv [Esun x sin(e) x TAUz + Esky] / (PI x d^2) </li>
+ <li> radiance_path = radiance_dark - percent x sun_radiance </li>
+ <li> radiance = (at-sensor_radiance - radiance_path) </li>
+ <li> reflectance = radiance / sun_radiance </li>
+</ul>
+<p>where,
+<em>percent</em> is a value between 0.0 and 1.0 (usually 0.01),
+<em>Esky</em> is the diffuse sky irradiance,
+<em>TAUz</em> is the atmospheric transmittance along the path from the sun to the ground surface, and
+<em>TAUv</em> is the atmospheric transmittance along the path from the ground surface to the sensor.
+<em>radiance_dark</em> is the at-sensor radiance calculated from the darkest object, i.e. DN with a least 'dark_parameter' (usually 1000) pixels for the entire image.</p>
+
+<p>The values are,</p>
+<ul>
+ <li>DOS1: TAUv = 1.0, TAUz = 1.0 and Esky = 0.0</li>
+ <li>DOS2: TAUv = 1.0, Esky = 0.0, and TAUz = sin(e) for all bands with maximum wave length less than 1. (i.e. bands 4-6 MSS, 1-4 TM, and 1-4 ETM+) other bands TAUz = 1.0 (= cos(sat_zenith) in DOS2b)</li>
+ <li>DOS3: TAUv = exp[-t/cos(sat_zenith)], TAUz = exp[-t/sin(e)], Esky = rayleigh</li>
+ <li>DOS4: TAUv = exp[-t/cos(sat_zenith)], TAUz = exp[-t/sin(e)], Esky = PI x radiance_dark </li>
+</ul>
+
+<p><b>Attention</b>: Output radiance remain untouched (i.e. no set to 0. when it is negative) then they are possible negative values. However, output reflectance is set to 0. when is obtained a negative value.</p>
+
+
+<H2>NOTES</H2>
+
+<p>In verbose mode (flag -v), the program write basic data of satellite and the parameters used in
+transformations.</p>
+
+<p>Production date is not a exact value and it is necessary to apply correct calibration constants, which were changed in the dates:</p>
+<ul>
+ <li>Landsat-1 MSS: never </li>
+ <li>Landsat-2 MSS: July 16, 1975</li>
+ <li>Landsat-3 MSS: June 1, 1978</li>
+ <li>Landsat-4 MSS: August 26, 1982 and April 1, 1983</li>
+ <li>Landsat-4 TM: August 1, 1983 and January 15, 1984</li>
+ <li>Landsat-5 MSS: April 6, 1984 and November 9, 1984</li>
+ <li>Landsat-5 TM: May 4, 2003 and April, 2 2007</li>
+ <li>Landsat-7 ETM+: July 1, 2000</li>
+</ul>
+
+
+<H2>EXAMPLES</H2>
+
+<p>Transform digital numbers of Landsat-7 ETM+ in band rasters 203_30.1, 203_30.2[...] to uncorrected at-sensor reflectance in output files 203_30.toar.1, 203_30.toar.2 [...] and at-sensor temperature in output files 203_30.toar.61 and 203_30.toar.62:</p>
+
+<div class="code"><pre>i.landsat.toar -7 band=203_30 met=p203r030_7x20010620.met</pre></div>
+
+<p>or</p>
+
+<div class="code"><pre>i.landsat.toar -7 band=203_30 product=2004-06-07 date=2001-06-20 solar=64.3242970 gain="HHHLHLHHL"</pre></div>
+
+<H2>REFERENCES</H2>
+<ol>
+ <li>Chander G.H. and B. Markham: IEEE Transactions On Geoscience And Remote Sensing, vol. 41, no. 11, November 2003.</li>
+ <li>Chavez P.S., jr. 1996. Image-based atmospheric corrections - Revisited and Improved. Photogrammetric Engineering and Remote Sensing 62 (9): 1025-1036.</li>
+ <li>Huang et al: At-Satellite Reflectance: A First Order Normalization Of Landsat 7 ETM+ Images. 2002.</li>
+ <li>R. Irish: <a href="http://ltpwww.gsfc.nasa.gov/IAS/handbook/handbook_toc.html">Landsat 7. Science Data Users Handbook. February 17, 2007.</a></li>
+ <li>Markham B.L. and J.L. Barker: Landsat MSS and TM Post-Calibration Dynamic Ranges, Exoatmospheric Reflectances and At-Satellite Temperatures. EOSAT Landsat Technical Notes, No. 1, 1986</li>
+ <li>Moran M.S., R.D. Jackson, P.N. Slater and P.M. Teillet: Remote Sensing of Environment, vol. 41. 1992.</li>
+ <li> Song et al : Classification and Change Detection Using Landsat TM Data: When and How to Correct Atmospheric Effects?. Remote Sensing of Environment, vol. 75. 2001. </li>
+</ol>
+
+
+<H2>SEE ALSO</H2>
+
+<p><em>
+ <a HREF="r.mapcalc.html">r.mapcalc</a><br>
+ <a HREF="r.in.gdal.html">r.in.gdal</a><br>
+</em></p>
+
+
+<H2>AUTHOR</H2>
+
+<p>E. Jorge Tizado (ej.tizado unileon es)<br>
+Dept. Biodiversity and Environmental Management, University of Leon, Spain<br></p>
+
+<p><i>Last changed: $Date: 2009/01/090 00:00:00 $</i></p>
+
Added: grass-addons/grass7/imagery/i.landsat.toar/landsat.c
===================================================================
--- grass-addons/grass7/imagery/i.landsat.toar/landsat.c (rev 0)
+++ grass-addons/grass7/imagery/i.landsat.toar/landsat.c 2009-01-31 16:37:15 UTC (rev 35689)
@@ -0,0 +1,163 @@
+#include<stdio.h>
+#include<stdlib.h>
+#include<math.h>
+
+#include "landsat.h"
+
+#define PI 3.1415926535897932384626433832795
+#define R2D 57.295779513082320877
+#define D2R 0.017453292519943295769
+
+/****************************************************************************
+ * PURPOSE: Calibrated Digital Number to at-satellite Radiance
+ *****************************************************************************/
+double lsat_qcal2rad(double qcal, band_data * band)
+{
+ return (double)(qcal * band->gain + band->bias);
+}
+
+/****************************************************************************
+ * PURPOSE: Radiance of non-thermal band to at-satellite Reflectance
+ *****************************************************************************/
+double lsat_rad2ref(double rad, band_data * band)
+{
+ return (double)(rad / band->K2);
+}
+
+/****************************************************************************
+ * PURPOSE: Radiance of thermal band to at-satellite Temperature
+ *****************************************************************************/
+double lsat_rad2temp(double rad, band_data * band)
+{
+ return (double)(band->K2 / log((band->K1 / rad) + 1.0));
+}
+
+/****************************************************************************
+ * PURPOSE: Some band constants
+ *
+ * zenith = 90 - sun_elevation
+ * sin( sun_elevation ) = cos( sun_zenith )
+ *
+ * lsat : satellite data
+ * i : band number
+ * method : level of atmospheric correction
+ * percent : percent of solar irradiance in path radiance
+ * dos : digital number of dark object for DOS
+ *****************************************************************************/
+
+#define abs(x) (((x)>0)?(x):(-x))
+
+void lsat_bandctes(lsat_data * lsat, int i, char method,
+ double percent, int dos, double sat_zenith, double rayleigh)
+{
+ double pi_d2, sin_e, cos_v, rad_sun;
+ /* TAUv = at. transmittance surface-sensor */
+ /* TAUz = at. transmittance sun-surface */
+ /* Edown = diffuse sky spectral irradiance */
+ double TAUv, TAUz, Edown;
+
+ pi_d2 = (double)(PI * lsat->dist_es * lsat->dist_es);
+ sin_e = (double)(sin(D2R * lsat->sun_elev));
+ cos_v = (double)(cos(D2R * sat_zenith));
+
+ /** Global irradiance on the sensor.
+ Radiance to reflectance coefficient, only NO thermal bands.
+ K1 and K2 variables are also utilized as thermal constants
+ */
+ if (lsat->band[i].thermal == 0)
+ {
+ switch( method )
+ {
+ case DOS2:
+ {
+ TAUv = 1.;
+ TAUz = (lsat->band[i].wavemax < 1.) ? sin_e : 1.;
+ Edown = 0.;
+ break;
+ }
+ case DOS2b:
+ {
+ TAUv = (lsat->band[i].wavemax < 1.) ? cos_v : 1.;
+ TAUz = (lsat->band[i].wavemax < 1.) ? sin_e : 1.;
+ Edown = 0.;
+ break;
+ }
+ case DOS3:
+ {
+ double t;
+ t = 2. / (lsat->band[i].wavemax + lsat->band[i].wavemin);
+ t = 0.008569 *t*t*t*t*(1+0.0113*t*t+0.000013*t*t*t*t);
+ TAUv = exp( -t / cos_v );
+ TAUz = exp( -t / sin_e );
+ Edown = rayleigh;
+ break;
+ }
+ case DOS4:
+ {
+ double Ro = (lsat->band[i].lmax - lsat->band[i].lmin) * (dos - lsat->band[i].qcalmin) /
+ (lsat->band[i].qcalmax - lsat->band[i].qcalmin) + lsat->band[i].lmin;
+ double tv, Tv = 1.;
+ double Tz = 1.;
+ double Lp = 0.;
+ do
+ {
+ TAUz = Tz;
+ TAUv = Tv;
+ Lp = Ro - percent * TAUv * (lsat->band[i].esun * sin_e * TAUz + PI * Lp) / pi_d2;
+ Tz = 1 - (4 * pi_d2 * Lp) / (lsat->band[i].esun * sin_e);
+ Tv = exp( sin_e * log( Tz ) / cos_v );
+// G_message("TAUv = %.5f (%.5f), TAUz = %.5f (%.5f) and Edown = %.5f\n", TAUv, Tv, TAUz, Tz, PI * Lp );
+// } while( abs(TAUv - Tv) > 0.0000001 || abs(TAUz - Tz) > 0.0000001);
+ } while( TAUv != Tv && TAUz != Tz);
+ TAUz = (Tz < 1. ? Tz : 1.);
+ TAUv = (Tv < 1. ? Tv : 1.);
+ Edown = (Lp < 0. ? 0. : PI * Lp);
+ break;
+ }
+ default: /* DOS1 and Without atmosferic-correction */
+ TAUv = 1.;
+ TAUz = 1.;
+ Edown = 0.;
+ break;
+ }
+ rad_sun = TAUv * (lsat->band[i].esun * sin_e * TAUz + Edown) / pi_d2;
+ G_message("... TAUv = %.5f, TAUz = %.5f, Edown = %.5f\n", TAUv, TAUz, Edown);
+
+ lsat->band[i].K1 = 0.;
+ lsat->band[i].K2 = rad_sun;
+ }
+
+ /** Digital number to radiance coefficients.
+ Whitout atmosferic calibration for thermal bands.
+ */
+ lsat->band[i].gain = ((lsat->band[i].lmax - lsat->band[i].lmin) /
+ (lsat->band[i].qcalmax - lsat->band[i].qcalmin));
+
+ if (method == UNCORRECTED || lsat->band[i].thermal)
+ {
+ /* L = G * (DN - Qmin) + Lmin
+ -> bias = Lmin - G * Qmin */
+ lsat->band[i].bias = (lsat->band[i].lmin - lsat->band[i].gain * lsat->band[i].qcalmin);
+ }
+ else
+ {
+ if (method == CORRECTED)
+ {
+ /* L = G * (DN - Qmin) + Lmin - Lmin
+ -> bias = - G * Qmin */
+ lsat->band[i].bias = - (lsat->band[i].gain * lsat->band[i].qcalmin);
+ }
+ else if (method > DOS )
+ {
+ /* L = Lsat - Lpath =
+ G * DNsat + B - (G * dark + B - p * rad_sun) =
+ G * DNsat - G * dark + p * rad_sun
+ -> bias = p * rad_sun - G * dark */
+ lsat->band[i].bias = percent * rad_sun - lsat->band[i].gain * dos;
+ }
+ }
+}
+
+
+
+
Added: grass-addons/grass7/imagery/i.landsat.toar/landsat.h
===================================================================
--- grass-addons/grass7/imagery/i.landsat.toar/landsat.h (rev 0)
+++ grass-addons/grass7/imagery/i.landsat.toar/landsat.h 2009-01-31 16:37:15 UTC (rev 35689)
@@ -0,0 +1,66 @@
+#ifndef _LANDSAT_H
+#define _LANDSAT_H
+
+#define UNCORRECTED 0
+#define CORRECTED 1
+#define DOS 10
+#define DOS1 12
+#define DOS2 14
+#define DOS2b 15
+#define DOS3 16
+#define DOS4 18
+
+
+/*****************************************************
+ * Landsat Structures
+ *
+ * Lmax and Lmin in W / (m² · sr · µm) -> Radiance
+ * Esun in W / (m² · µm) -> Irradiance
+ ****************************************************/
+
+#define MAX_BANDS 9
+
+typedef struct
+{
+ int number; /* Band number */
+ int code; /* Band code */
+
+ double wavemax, wavemin; /* Wavelength in µm */
+
+ double lmax, lmin; /* Spectral radiance */
+ double qcalmax, qcalmin; /* Quantized calibrated pixel */
+ double esun; /* Mean solar irradiance */
+
+ char thermal; /* Flag to thermal band */
+ double gain, bias; /* Gain and Bias of sensor */
+ double K1, K2; /* Thermal calibration constants,
+ or Rad2Ref constants */
+
+} band_data;
+
+typedef struct
+{
+ unsigned char number; /* Landsat number */
+
+ char creation[11]; /* Image production date */
+ char date[11]; /* Image acquisition date */
+ double dist_es; /* Distance Earth-Sun */
+ double sun_elev; /* Solar elevation */
+
+ char sensor[5]; /* Type of sensor: MSS, TM, ETM+ */
+ int bands; /* Total number of bands */
+ band_data band[MAX_BANDS]; /* Data for each band */
+} lsat_data;
+
+
+/*****************************************************************************
+ * Landsat Equations Prototypes
+ *****************************************************************************/
+
+double lsat_qcal2rad(double, band_data *);
+double lsat_rad2ref (double, band_data *);
+double lsat_rad2temp(double, band_data *);
+
+void lsat_bandctes(lsat_data *, int, char, double, int, double, double);
+
+#endif
Added: grass-addons/grass7/imagery/i.landsat.toar/landsat_met.c
===================================================================
--- grass-addons/grass7/imagery/i.landsat.toar/landsat_met.c (rev 0)
+++ grass-addons/grass7/imagery/i.landsat.toar/landsat_met.c 2009-01-31 16:37:15 UTC (rev 35689)
@@ -0,0 +1,178 @@
+#include<stdio.h>
+#include<stdlib.h>
+#include <math.h>
+
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+#include "earth_sun.h"
+
+#define ETM_MET_SIZE 5600 /* .met file size 5516 bytes */
+#define TM5_MET_SIZE 28700 /* .met file size 28686 bytes */
+#define MAX_STR 127
+
+inline void chrncpy(char * dest, char * src, int n)
+{
+ if (src == NULL) n = 1;
+ else strncpy(dest,src,n);
+ dest[n-1] = '\0';
+}
+
+/****************************************************************************
+ * PURPOSE: Read values of Landsat-7 ETM+ from header (.met) file
+ *****************************************************************************/
+void get_value_met7(const char mettext[], char *text, char value[])
+{
+ char *ptr;
+ value[0] = 0;
+
+ ptr = strstr(mettext, text);
+ if (ptr == NULL) return;
+
+ while (*ptr++ != '=') ;
+ sscanf(ptr, "%s", value);
+
+ return;
+}
+
+void met_ETM(char *metfile, lsat_data * lsat)
+{
+ FILE *f;
+ char mettext[ETM_MET_SIZE];
+ char name[MAX_STR], value[MAX_STR];
+ int i, j;
+
+ static int band[] = { 1, 2, 3, 4, 5, 6, 6, 7, 8 };
+ static int code[] = { 1, 2, 3, 4, 5, 61, 62, 7, 8 };
+
+ static double esun[] = { 1969., 1840., 1551., 1044., 225.7, 0., 82.07, 1368. };
+
+ if ((f = fopen(metfile, "r")) == NULL) {
+ G_fatal_error(_(".met file [%s] not found"), metfile);
+ }
+ fread(mettext, 1, ETM_MET_SIZE, f);
+
+ /* --------------------------------------- */
+ lsat->number = 7;
+
+ get_value_met7(mettext, "SENSOR_ID", value);
+ chrncpy(lsat->sensor, value+1, 5);
+
+ if (lsat->creation[0] == 0) {
+ get_value_met7(mettext, "CREATION_TIME", value);
+ chrncpy(lsat->creation, value, 11);
+ }
+
+ get_value_met7(mettext, "ACQUISITION_DATE", value);
+ chrncpy(lsat->date, value, 11);
+ lsat->dist_es = earth_sun(lsat->date);
+
+ get_value_met7(mettext, "SUN_ELEVATION", value);
+ lsat->sun_elev = atof(value);
+
+ lsat->bands = 9;
+ for (i = 0; i < lsat->bands; i++) {
+ lsat->band[i].number = *(band + i);
+ lsat->band[i].code = *(code + i);
+ lsat->band[i].esun = *(esun + lsat->band[i].number - 1);
+ snprintf(name, MAX_STR, "LMAX_BAND%d", lsat->band[i].code);
+ get_value_met7(mettext, name, value);
+ lsat->band[i].lmax = atof(value);
+ snprintf(name, MAX_STR, "LMIN_BAND%d", lsat->band[i].code);
+ get_value_met7(mettext, name, value);
+ lsat->band[i].lmin = atof(value);
+ snprintf(name, MAX_STR, "QCALMAX_BAND%d", lsat->band[i].code);
+ get_value_met7(mettext, name, value);
+ lsat->band[i].qcalmax = atof(value);
+ snprintf(name, MAX_STR, "QCALMIN_BAND%d", lsat->band[i].code);
+ get_value_met7(mettext, name, value);
+ lsat->band[i].qcalmin = atof(value);
+ if (lsat->band[i].number == 6) {
+ lsat->band[i].thermal = 1;
+ lsat->band[i].K1 = 666.09;
+ lsat->band[i].K2 = 1282.71;
+ }
+ else {
+ lsat->band[i].thermal = 0;
+ }
+ }
+
+ (void)fclose(f);
+ return;
+}
+
+/****************************************************************************
+ * PURPOSE: Read values of Landsat MSS/TM from header (.met) file
+ *****************************************************************************/
+void get_value_met(const char mettext[], char *text, char value[])
+{
+ char *ptr;
+ int i;
+ value[0] = 0;
+
+ ptr = strstr(mettext, text);
+ if (ptr == NULL) return;
+
+ ptr = strstr(ptr, " VALUE ");
+ if (ptr == NULL) return;
+
+ i = 0;
+ while (*ptr++ != '\"') ;
+ while( *ptr != '\"' && i < MAX_STR) value[i++]=*ptr++;
+ value[i] = '\0';
+
+ return;
+}
+
+void met_TM5(char *metfile, lsat_data * lsat)
+{
+ FILE *f;
+ char mettext[TM5_MET_SIZE];
+ char metdate[MAX_STR], value[MAX_STR];
+
+ if ((f = fopen(metfile, "r")) == NULL) {
+ G_fatal_error(_(".met file [%s] not found"), metfile);
+ }
+ fread(mettext, 1, TM5_MET_SIZE, f);
+
+ /* --------------------------------------- */
+ get_value_met(mettext, "CALENDARDATE", value);
+ chrncpy(lsat->date, value, 11);
+
+ if (lsat->creation[0] == 0) {
+ get_value_met(mettext, "PRODUCTIONDATETIME", value);
+ chrncpy(lsat->creation, value, 11);
+ }
+
+ if (lsat->creation[0] == 0 )
+ G_fatal_error(_("Product creation date not in .met file [%s]"), metfile);
+
+ get_value_met(mettext, "SolarElevation", value);
+ lsat->sun_elev = atof(value);
+
+ get_value_met(mettext, "PLATFORMSHORTNAME", value);
+ switch(value[8])
+ {
+ case '1':
+ set_MSS1(lsat);
+ break;
+ case '2':
+ set_MSS2(lsat);
+ break;
+ case '3':
+ set_MSS3(lsat);
+ break;
+ case '4':
+ get_value_met(mettext, "SENSORSHORTNAME", value);
+ if (value[0] == 'M') set_MSS4(lsat); else set_TM4(lsat);
+ break;
+ case '5':
+ get_value_met(mettext, "SENSORSHORTNAME", value);
+ if (value[0] == 'M') set_MSS5(lsat); else set_TM5(lsat);
+ break;
+ }
+
+ (void)fclose(f);
+ return;
+}
Added: grass-addons/grass7/imagery/i.landsat.toar/landsat_set.c
===================================================================
--- grass-addons/grass7/imagery/i.landsat.toar/landsat_set.c (rev 0)
+++ grass-addons/grass7/imagery/i.landsat.toar/landsat_set.c 2009-01-31 16:37:15 UTC (rev 35689)
@@ -0,0 +1,443 @@
+#include<stdio.h>
+#include<stdlib.h>
+#include<string.h>
+#include <math.h>
+
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+#include "earth_sun.h"
+
+void sensor_MSS(lsat_data * lsat)
+{
+ int i;
+
+ /* green, red, near infrared, near infrared */
+ int band[] = { 1, 2, 3, 4 };
+ int code[] = { 4, 5, 6, 7 };
+ double wmax[] = { 0.6, 0.7, 0.8, 1.1 };
+ double wmin[] = { 0.5, 0.6, 0.7, 0.8 };
+ /* 79-82, 79-82, 79-82, 79-82 */
+
+ strcpy(lsat->sensor, "MSS");
+
+ lsat->bands = 4;
+ for (i = 0; i < lsat->bands; i++) {
+ lsat->band[i].number = *(band + i);
+ lsat->band[i].code = *(code + i);
+ lsat->band[i].wavemax = *(wmax + i);
+ lsat->band[i].wavemin = *(wmin + i);
+ lsat->band[i].qcalmax = 255.;
+ lsat->band[i].qcalmin = 0.;
+ lsat->band[i].thermal = 0;
+ }
+ return;
+}
+
+void sensor_TM(lsat_data * lsat)
+{
+ int i;
+
+ /* blue, green red, near infrared, shortwave IR, thermal IR, shortwave IR */
+ int band[] = { 1, 2, 3, 4, 5, 6, 7 };
+ double wmax[] = { 0.52, 0.60, 0.69, 0.90, 1.75, 12.50, 2.35 };
+ double wmin[] = { 0.45, 0.52, 0.63, 0.76, 1.55, 10.40, 2.08 };
+ /* 30, 30, 30, 30, 30, 120, 30 */
+
+ strcpy(lsat->sensor, "TM");
+
+ lsat->bands = 7;
+ for (i = 0; i < lsat->bands; i++) {
+ lsat->band[i].number = *(band + i);
+ lsat->band[i].code = *(band + i);
+ lsat->band[i].wavemax = *(wmax + i);
+ lsat->band[i].wavemin = *(wmin + i);
+ lsat->band[i].qcalmax = 255.;
+ lsat->band[i].qcalmin = 0.;
+ lsat->band[i].thermal = (lsat->band[i].number == 6 ? 1 : 0);
+ }
+ return;
+}
+
+void sensor_ETM(lsat_data * lsat)
+{
+ int i;
+
+ /* blue, green red, near infrared, shortwave IR, thermal IR, shortwave IR, panchromatic */
+ int band[] = { 1, 2, 3, 4, 5, 6, 6, 7, 8 };
+ int code[] = { 1, 2, 3, 4, 5, 61, 62, 7, 8 };
+ double wmax[] = { 0.515, 0.605, 0.690, 0.90, 1.75, 12.50, 2.35, 0.90 };
+ double wmin[] = { 0.450, 0.525, 0.630, 0.75, 1.55, 10.40, 2.09, 0.52 };
+ /* 30, 30, 30, 30, 30, 60, 30, 15 */
+
+ strcpy(lsat->sensor, "ETM+");
+
+ lsat->bands = 9;
+ for (i = 0; i < lsat->bands; i++) {
+ lsat->band[i].number = *(band + i);
+ lsat->band[i].code = *(code + i);
+ lsat->band[i].wavemax = *(wmax + i);
+ lsat->band[i].wavemin = *(wmin + i);
+ lsat->band[i].qcalmax = 255.;
+ lsat->band[i].qcalmin = 1.;
+ lsat->band[i].thermal = (lsat->band[i].number == 6 ? 1 : 0);
+ }
+ return;
+}
+
+
+/** **********************************************
+ ** Before access to this function ...
+ ** store previously
+ ** >>> adquisition date,
+ ** >>> creation date, and
+ ** >>> sun_elev
+ ** **********************************************/
+
+/****************************************************************************
+ * PURPOSE: Store values of Landsat-1 MSS
+ * July 23, 1972 to January 6, 1978
+ *****************************************************************************/
+void set_MSS1(lsat_data * lsat)
+{
+ int i, j;
+
+ /** Brian L. Markham and John L. Barker.
+ EOSAT Landsat Technical Notes, No. 1, 1986 */
+ /* Spectral radiances at detector */
+ double lmax[] = { 248., 200., 176., 153. };
+ double lmin[] = { 0., 0., 0., 0. };
+ /* Solar exoatmospheric spectral irradiances */
+ double esun[] = { 1852., 1584., 1276., 904. };
+
+ lsat->number = 1;
+ sensor_MSS( lsat );
+
+ lsat->dist_es = earth_sun(lsat->date);
+
+ for (i = 0; i < lsat->bands; i++) {
+ j = lsat->band[i].number - 1;
+ lsat->band[i].esun = *(esun + j);
+ lsat->band[i].lmax = *(lmax + j);
+ lsat->band[i].lmin = *(lmin + j);
+ }
+ return;
+}
+
+/****************************************************************************
+ * PURPOSE: Store values of Landsat-2 MSS
+ * January 22, 1975 to February 25, 1982
+ *****************************************************************************/
+void set_MSS2(lsat_data * lsat)
+{
+ int i, j;
+ double julian, *lmax, *lmin;
+
+ /** Brian L. Markham and John L. Barker.
+ EOSAT Landsat Technical Notes, No. 1, 1986 */
+ /* Spectral radiances at detector */
+ double Lmax[][4] = { { 210., 156., 140., 138. }, /* before July 16, 1975 */
+ { 263., 176., 152., 130. } }; /* on or after July 16, 1975 */
+ double Lmin[][4] = { { 10., 7., 7., 5. },
+ { 8., 6., 6., 4. } };
+ /* Solar exoatmospheric spectral irradiances */
+ double esun[] = { 1856., 1559., 1269., 906. };
+
+ julian = julian_char(lsat->creation);
+ if (julian < julian_char("1975-07-16")) i = 0;
+ else i = 1;
+ lmax = Lmax[i];
+ lmin = Lmin[i];
+
+ lsat->number = 2;
+ sensor_MSS( lsat );
+
+ lsat->dist_es = earth_sun(lsat->date);
+
+ for (i = 0; i < lsat->bands; i++) {
+ j = lsat->band[i].number - 1;
+ lsat->band[i].esun = *(esun + j);
+ lsat->band[i].lmax = *(lmax + j);
+ lsat->band[i].lmin = *(lmin + j);
+ }
+ return;
+}
+
+/****************************************************************************
+ * PURPOSE: Store values of Landsat-3 MSS
+ * March 5, 1978 to March 31, 1983
+ *
+ * tiene una banda 8 thermal
+ *****************************************************************************/
+void set_MSS3(lsat_data * lsat)
+{
+ int i, j;
+ double julian, *lmax, *lmin;
+
+ /** Brian L. Markham and John L. Barker.
+ EOSAT Landsat Technical Notes, No. 1, 1986 */
+ /* Spectral radiances at detector */
+ double Lmax[][4] = { { 220., 175., 145., 147. }, /* before June 1, 1978 */
+ { 259., 179., 149., 128. } }; /* on or after June 1, 1978 */
+ double Lmin[][4] = { { 4., 3., 3., 1. },
+ { 4., 3., 3., 1. } };
+ /* Solar exoatmospheric spectral irradiances */
+ double esun[] = { 1860., 1571., 1289., 910. };
+
+ julian = julian_char(lsat->creation);
+ if (julian < julian_char("1978-06-01")) i = 0;
+ else i = 1;
+ lmax = Lmax[i];
+ lmin = Lmin[i];
+
+ lsat->number = 3;
+ sensor_MSS( lsat );
+
+ lsat->dist_es = earth_sun(lsat->date);
+
+ for (i = 0; i < lsat->bands; i++) {
+ j = lsat->band[i].number - 1;
+ lsat->band[i].esun = *(esun + j);
+ lsat->band[i].lmax = *(lmax + j);
+ lsat->band[i].lmin = *(lmin + j);
+ }
+ return;
+}
+
+/****************************************************************************
+ * PURPOSE: Store values of Landsat-4 MSS/TM
+ * July 16, 1982 to June 15, 2001
+ *****************************************************************************/
+void set_MSS4(lsat_data * lsat)
+{
+ int i, j;
+ double julian, *lmax, *lmin;
+
+ /** Brian L. Markham and John L. Barker.
+ EOSAT Landsat Technical Notes, No. 1, 1986 */
+ /* Spectral radiances at detector */
+ double Lmax[][4] = { { 250., 180., 150., 133. }, /* before August 26, 1982 */
+ { 230., 180., 130., 133. }, /* between */
+ { 238., 164., 142., 116. } }; /* on or after April 1, 1983 */
+ double Lmin[][4] = { { 2., 4., 4., 3. },
+ { 2., 4., 4., 3. },
+ { 4., 4., 5., 4. } };
+ /* Solar exoatmospheric spectral irradiances */
+ double esun[] = { 1851., 1593., 1260., 878. };
+
+ julian = julian_char(lsat->creation);
+ if (julian < julian_char("1982-08-26")) i = 0;
+ else if (julian < julian_char("1983-03-31")) i = 1;
+ else i = 2;
+ lmax = Lmax[i];
+ lmin = Lmin[i];
+
+ lsat->number = 4;
+ sensor_MSS( lsat );
+
+ lsat->dist_es = earth_sun(lsat->date);
+
+ for (i = 0; i < lsat->bands; i++) {
+ j = lsat->band[i].number - 1;
+ lsat->band[i].esun = *(esun + j);
+ lsat->band[i].lmax = *(lmax + j);
+ lsat->band[i].lmin = *(lmin + j);
+ }
+ return;
+}
+
+void set_TM4(lsat_data * lsat)
+{
+ int i, j;
+ double julian, *lmax, *lmin;
+
+ /** Brian L. Markham and John L. Barker.
+ EOSAT Landsat Technical Notes, No. 1, 1986 */
+ /* Spectral radiances at detector */
+ double Lmax[][7] = { { 158.42, 308.17, 234.63, 224.32, 32.42, 15.64, 17.00 }, /* before August 1983 */
+ { 142.86, 291.25, 225.00, 214.29, 30.00, 12.40, 15.93 }, /* before January 15, 1984 */
+ { 152.10, 296.80, 204.30, 206.20, 27.19, 15.60, 14.38 } }; /* after Jaunary 15, 1984 */
+ double Lmin[][7] = { { -1.52, -2.84, -1.17, -1.51, -0.37, 2.00, -0.15 },
+ { 0.00, 0.00, 0.00, 0.00, 0.00, 4.84, 0.00 },
+ { -1.50, -2.80, -1.20, -1.50, -0.37, 1.238, -0.15 } };
+ /** Gyanesh Chander and Brian Markham.
+ IEEE Transactions On Geoscience And Remote Sensing, Vol. 41, No. 11, November 2003 */
+ /* Solar exoatmospheric spectral irradiances */
+ double esun[] = { 1957., 1825., 1557., 1033., 214.9, 0., 80.72 };
+ /* Thermal band calibration constants: K1 = 671.62 K2 = 1284.30 */
+
+ julian = julian_char(lsat->creation);
+ if (julian < julian_char("1983-08-01")) i = 0;
+ else if (julian < julian_char("1984-01-15")) i = 1;
+ else i = 2;
+ lmax = Lmax[i];
+ lmin = Lmin[i];
+
+ lsat->number = 4;
+ sensor_TM( lsat );
+
+ lsat->dist_es = earth_sun(lsat->date);
+
+ for (i = 0; i < lsat->bands; i++) {
+ j = lsat->band[i].number - 1;
+ lsat->band[i].esun = *(esun + j);
+ lsat->band[i].lmax = *(lmax + j);
+ lsat->band[i].lmin = *(lmin + j);
+ if (lsat->band[i].thermal ) {
+ lsat->band[i].K1 = 671.62;
+ lsat->band[i].K2 = 1284.30;
+ }
+ }
+ return;
+}
+
+
+/****************************************************************************
+ * PURPOSE: Store values of Landsat-5 MSS/TM
+ * March 1, 1984 to today
+ *****************************************************************************/
+void set_MSS5(lsat_data * lsat)
+{
+ int i, j;
+ double julian, *lmax, *lmin;
+
+ /** Brian L. Markham and John L. Barker.
+ EOSAT Landsat Technical Notes, No. 1, 1986 */
+ /* Spectral radiances at detector */
+ double Lmax[][4] = { { 240., 170., 150., 127. }, /* before April 6, 1984 */
+ { 268., 179., 159., 123. }, /* betweeen */
+ { 268., 179., 148., 123. } }; /* after November 9, 1984 */
+ double Lmin[][4] = { { 4., 3., 4., 2. },
+ { 3., 3., 4., 3. },
+ { 3., 3., 5., 3. } };
+ /* Solar exoatmospheric spectral irradiances */
+ double esun[] = { 1849., 1595., 1253., 870. };
+
+ julian = julian_char(lsat->creation);
+ if (julian < julian_char("1984-04-06")) i = 0;
+ else if (julian < julian_char("1984-11-09")) i = 1;
+ else i = 2;
+ lmax = Lmax[i];
+ lmin = Lmin[i];
+
+ lsat->number = 5;
+ sensor_MSS( lsat );
+
+ lsat->dist_es = earth_sun(lsat->date);
+
+ for (i = 0; i < lsat->bands; i++) {
+ j = lsat->band[i].number - 1;
+ lsat->band[i].esun = *(esun + j);
+ lsat->band[i].lmax = *(lmax + j);
+ lsat->band[i].lmin = *(lmin + j);
+ }
+ return;
+}
+
+void set_TM5(lsat_data * lsat)
+{
+ int i, j;
+ double julian, *lmax, *lmin;
+
+ /** Gyanesh Chander and Brian Markham.
+ IEEE Transactions On Geoscience And Remote Sensing, Vol. 41, No. 11, November 2003 */
+ /* Spectral radiances at detector */
+ double Lmax[][7] = { { 152.10, 296.81, 204.30, 206.20, 27.19, 15.303, 14.38 }, /* before May 4, 2003 */
+ { 193.00, 365.00, 264.00, 221.00, 30.20, 15.303, 16.50 }, /* after May 4, 2003 */
+ { 169.00, 333.00, 264.00, 221.00, 30.20, 15.303, 16.50 } }; /* after April 2, 2007 */
+ double Lmin[][7] = { { -1.52, -2.84, -1.17, -1.51, -0.37, 1.2378, -0.15 },
+ { -1.52, -2.84, -1.17, -1.51, -0.37, 1.2378, -0.15 },
+ { -1.52, -2.84, -1.17, -1.51, -0.37, 1.2378, -0.15 } };
+ /* Solar exoatmospheric spectral irradiances */
+ double esun[] = { 1957., 1826., 1554., 1036., 215.0, 0., 80.67 };
+ /* Thermal band calibration constants: K1 = 607.76 K2 = 1260.56 */
+
+ julian = julian_char(lsat->creation);
+ if (julian < julian_char("2003-05-04")) i = 0;
+ else if (julian < julian_char("2007-04-02")) i = 1;
+ else i = 2;
+ lmax = Lmax[i];
+ lmin = Lmin[i];
+ if ( i == 2 ) { /* in Chander, Markham and Barsi 2007 */
+ julian = julian_char(lsat->date); /* Yes, here acquisition date */
+ if (julian >= julian_char("1992-01-01")) {
+ lmax[0] = 193.0;
+ lmax[1] = 365.0;
+ }
+ }
+
+ lsat->number = 5;
+ sensor_TM( lsat );
+
+ lsat->dist_es = earth_sun(lsat->date);
+
+ for (i = 0; i < lsat->bands; i++) {
+ j = lsat->band[i].number - 1;
+ lsat->band[i].esun = *(esun + j);
+ lsat->band[i].lmax = *(lmax + j);
+ lsat->band[i].lmin = *(lmin + j);
+ if (lsat->band[i].thermal ) {
+ lsat->band[i].K1 = 607.76;
+ lsat->band[i].K2 = 1260.56;
+ }
+ }
+ return;
+}
+
+
+/****************************************************************************
+ * PURPOSE: Store values of Landsat-7 ETM+
+ * April 15, 1999 to today
+ *****************************************************************************/
+void set_ETM(lsat_data * lsat, char gain[])
+{
+ int i, k, j;
+ double julian, *lmax, *lmin;
+
+ /** Richard Irish.
+ Landsat 7. Science Data Users Handbook. Last update: February 17, 2007 */
+ /* Spectral radiances at detector */
+ /* - LOW GAIN - */
+ double LmaxL[][8] = { { 297.5, 303.4, 235.5, 235.0, 47.70, 17.04, 16.600, 244.0 }, /* before July 1, 2000 */
+ { 293.7, 300.9, 234.4, 241.1, 47.57, 17.04, 16.540, 243.1 } }; /* on or after July 1, 2000 */
+ double LminL[][8] = { { -6.2, -6.0, -4.5, -4.5, -1.0, 0.0, -0.35, -5.0 },
+ { -6.2, -6.4, -5.0, -5.1, -1.0, 0.0, -0.35, -4.7 } };
+ /* - HIGH GAIN - */
+ double LmaxH[][8] = { { 194.3, 202.4, 158.6, 157.5, 31.76, 12.65, 10.932, 158.4 },
+ { 191.6, 196.5, 152.9, 157.4, 31.06, 12.65, 10.800, 158.3 } };
+ double LminH[][8] = { { -6.2, -6.0, -4.5, -4.5, -1.0, 3.2, -0.35, -5.0 },
+ { -6.2, -6.4, -5.0, -5.1, -1.0, 3.2, -0.35, -4.7 } };
+ /* Solar exoatmospheric spectral irradiances */
+ double esun[] = { 1969., 1840., 1551., 1044., 225.7, 0., 82.07, 1368. };
+ /* Thermal band calibration constants: K1 = 666.09 K2 = 1282.71 */
+
+ julian = julian_char(lsat->creation);
+ if (julian < julian_char("2000-07-01")) k = 0;
+ else k = 1;
+
+ lsat->number = 7;
+ sensor_ETM( lsat );
+
+ lsat->dist_es = earth_sun(lsat->date);
+
+ for (i = 0; i < lsat->bands; i++) {
+ j = lsat->band[i].number - 1;
+ lsat->band[i].esun = *(esun + j);
+ if (gain[i] == 'H' || gain[i] == 'h') {
+ lmax = LmaxH[k];
+ lmin = LminH[k];
+ }
+ else {
+ lmax = LmaxL[k];
+ lmin = LminL[k];
+ }
+ lsat->band[i].lmax = *(lmax + j);
+ lsat->band[i].lmin = *(lmin + j);
+ if (lsat->band[i].thermal) {
+ lsat->band[i].K1 = 666.09;
+ lsat->band[i].K2 = 1282.71;
+ }
+ }
+ return;
+}
Added: grass-addons/grass7/imagery/i.landsat.toar/local_proto.h
===================================================================
--- grass-addons/grass7/imagery/i.landsat.toar/local_proto.h (rev 0)
+++ grass-addons/grass7/imagery/i.landsat.toar/local_proto.h 2009-01-31 16:37:15 UTC (rev 35689)
@@ -0,0 +1,20 @@
+#ifndef _LOCAL_PROTO_H
+#define _LOCAL_PROTO_H
+
+#include <string.h>
+#include "landsat.h"
+
+void met_ETM (char *, lsat_data *);
+void met_TM5 (char *, lsat_data *);
+
+void set_MSS1(lsat_data *);
+void set_MSS2(lsat_data *);
+void set_MSS3(lsat_data *);
+void set_MSS4(lsat_data *);
+void set_MSS5(lsat_data *);
+
+void set_TM4 (lsat_data *);
+void set_TM5 (lsat_data *);
+void set_ETM (lsat_data *, char []);
+
+#endif
Added: grass-addons/grass7/imagery/i.landsat.toar/main.c
===================================================================
--- grass-addons/grass7/imagery/i.landsat.toar/main.c (rev 0)
+++ grass-addons/grass7/imagery/i.landsat.toar/main.c 2009-01-31 16:37:15 UTC (rev 35689)
@@ -0,0 +1,575 @@
+
+/****************************************************************************
+ *
+ * MODULE: i.landsat.toar
+ *
+ * AUTHOR(S): E. Jorge Tizado - ej.tizado at unileon.es
+ *
+ * PURPOSE: Calculate TOA Radiance or Reflectance and Kinetic Temperature
+ * for Landsat 1/2/3/4/5 MS, 4/5 TM or 7 ETM+
+ *
+ * COPYRIGHT: (C) 2002, 2005 2008 by the GRASS Development Team
+ *
+ * This program is free software under the GNU General Public
+ * License (>=v2). Read the file COPYING that comes with GRASS
+ * for details.
+ *
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+
+int main(int argc, char *argv[])
+{
+ struct History history;
+ struct GModule *module;
+
+ struct Cell_head cellhd, window;
+ char *mapset;
+
+ void *inrast, *outrast;
+ int infd, outfd;
+ void *ptr;
+ int nrows, ncols, row, col;
+
+ RASTER_MAP_TYPE in_data_type;
+
+ int verbose = 1;
+ struct Option *input, *metfn,
+ *adate, *pdate, *elev, *bgain, *metho, *perc, *dark,
+ *satz, *atmo;
+ char *name, *met;
+ struct Flag *sat1, *sat2, *sat3, *sat4, *sat5, *sat7, *msss,
+ *verbo, *frad;
+
+ lsat_data lsat;
+ char band_in[127], band_out[127];
+ int i, j, q, method, pixel, dn_dark[MAX_BANDS], dn_mode[MAX_BANDS];
+ double qcal, rad, ref, percent, ref_mode, sat_zenith, rayleigh;
+
+ unsigned long hist[256], h_max;
+
+ /* initialize GIS environment */
+ G_gisinit(argv[0]);
+
+ /* initialize module */
+ module = G_define_module();
+ module->description = _("Calculates top-of-atmosphere radiance or reflectance and temperature for Landsat MSS/TM/ETM+");
+ module->keywords = _("Top-Of-Atmosphere Radiance or Reflectance.\n Landsat-1 MSS, Landsat-2 MSS, Landsat-3 MSS, Landsat-4 MSS, Landsat-5 MSS,\n Landsat-4 TM, Landsat-5 TM,\n Landsat-7 ETM+");
+
+ /* It defines the different parameters */
+ input = G_define_option();
+ input->key = _("band_prefix");
+ input->type = TYPE_STRING;
+ input->required = YES;
+ input->gisprompt = _("input,cell,raster");
+ input->description = _("Base name of the landsat band rasters (.#)");
+
+ metfn = G_define_option();
+ metfn->key = _("metfile");
+ metfn->type = TYPE_STRING;
+ metfn->required = NO;
+ metfn->gisprompt = _(".met file");
+ metfn->description = _("Landsat ETM+ or TM5 header file (.met)");
+
+ adate = G_define_option();
+ adate->key = _("date");
+ adate->type = TYPE_STRING;
+ adate->required = NO;
+ adate->gisprompt = _("image acquisition date");
+ adate->description = _("Image acquisition date (yyyy-mm-dd)");
+
+ elev = G_define_option();
+ elev->key = _("solar_elevation");
+ elev->type = TYPE_DOUBLE;
+ elev->required = NO;
+ elev->gisprompt = _("solar elevation");
+ elev->description = _("Solar elevation in degrees");
+
+ bgain = G_define_option();
+ bgain->key = _("gain");
+ bgain->type = TYPE_STRING;
+ bgain->required = NO;
+ bgain->gisprompt = _("band gain");
+ bgain->description = _("Gain (H/L) of all Landsat ETM+ bands (1,2,3,4,5,61,62,7,8)");
+
+ pdate = G_define_option();
+ pdate->key = _("product_date");
+ pdate->type = TYPE_STRING;
+ pdate->required = NO;
+ pdate->gisprompt = _("image production date");
+ pdate->description = _("Image creation date (yyyy-mm-dd)");
+
+ metho = G_define_option();
+ metho->key = _("method");
+ metho->type = TYPE_STRING;
+ metho->required = NO;
+ metho->options = "uncorrected,corrected,dos1,dos2,dos2b,dos3,dos4";
+ metho->gisprompt = _("atmosferic correction method");
+ metho->description = _("Atmosferic correction method");
+ metho->answer = "uncorrected";
+
+ perc = G_define_option();
+ perc->key = _("percent");
+ perc->type = TYPE_DOUBLE;
+ perc->required = NO;
+ perc->gisprompt = _("percent of solar radiance in path radiance");
+ perc->description = _("Percent of solar radiance in path radiance (for dos#)");
+ perc->answer = "0.01";
+
+ dark = G_define_option();
+ dark->key = _("pixel");
+ dark->type = TYPE_INTEGER;
+ dark->required = NO;
+ dark->gisprompt = _("pixels to dark object");
+ dark->description = _("Minimum pixels to consider digital number as dark object (for dos#)");
+ dark->answer = "1000";
+
+ satz = G_define_option();
+ satz->key = _("sat_zenith");
+ satz->type = TYPE_DOUBLE;
+ satz->required = NO;
+ satz->gisprompt = _("satellite zenith");
+ satz->description = _("Satellite zenith in degrees (for dos2b)");
+ satz->answer = "8.2000";
+
+ atmo = G_define_option();
+ atmo->key = _("rayleigh");
+ atmo->type = TYPE_DOUBLE;
+ atmo->required = NO;
+ atmo->gisprompt = _("Rayleigh atmosphere");
+ atmo->description = _("Rayleigh atmosphere (for dos3)");
+ atmo->answer = "0.0";
+
+ /* It defines the different flags */
+ frad = G_define_flag();
+ frad->key = 'r';
+ frad->description = _("Output at-sensor radiance for all bands");
+ frad->answer = 0;
+
+ sat1 = G_define_flag();
+ sat1->key = '1';
+ sat1->description = _("Landsat-1 MSS");
+ sat1->answer = 0;
+
+ sat2 = G_define_flag();
+ sat2->key = '2';
+ sat2->description = _("Landsat-2 MSS");
+ sat2->answer = 0;
+
+ sat3 = G_define_flag();
+ sat3->key = '3';
+ sat3->description = _("Landsat-3 MSS");
+ sat3->answer = 0;
+
+ sat4 = G_define_flag();
+ sat4->key = '4';
+ sat4->description = _("Landsat-4 TM");
+ sat4->answer = 0;
+
+ sat5 = G_define_flag();
+ sat5->key = '5';
+ sat5->description = _("Landsat-5 TM");
+ sat5->answer = 0;
+
+ sat7 = G_define_flag();
+ sat7->key = '7';
+ sat7->description = _("Landsat-7 ETM+");
+ sat7->answer = 0;
+
+ msss = G_define_flag();
+ msss->key = 's';
+ msss->description = _("Set sensor of Landsat-4/5 to MSS");
+ msss->answer = 0;
+
+ verbo = G_define_flag();
+ verbo->key = 'v';
+ verbo->description = _("Show parameters applied");
+ verbo->answer = 0;
+
+ /* options and afters parser */
+ if (G_parser(argc, argv))
+ exit(EXIT_FAILURE);
+
+ /*****************************************
+ * ---------- START --------------------
+ * Stores options and flag to variables
+ *****************************************/
+ met = metfn->answer;
+ name = input->answer;
+
+ if (adate->answer != NULL) {
+ strncpy(lsat.date, adate->answer, 11);
+ lsat.date[10] = '\0';
+ }
+ else
+ lsat.date[0] = '\0';
+
+ if (pdate->answer != NULL) {
+ strncpy(lsat.creation, pdate->answer, 11);
+ lsat.creation[10] = '\0';
+ }
+ else
+ lsat.creation[0] = '\0';
+
+ lsat.sun_elev = elev->answer == NULL ? 0. : atof(elev->answer);
+ percent = atof(perc->answer);
+ pixel = atoi(dark->answer);
+ sat_zenith = atof(satz->answer);
+ rayleigh = atof(atmo->answer);
+
+ if (met == NULL &&
+ (sat1->answer + sat2->answer + sat3->answer +
+ sat4->answer + sat5->answer + sat7->answer) != 1)
+ G_fatal_error(_("Select one and only one type of satellite"));
+
+ /* Data from MET file: only Landsat-7 ETM+ and Landsat-5 TM */
+ if (met != NULL) {
+ if (sat7->answer) met_ETM(met, &lsat); else met_TM5(met, &lsat);
+ G_message("Landsat-%d %s with data set in met file [%s]", lsat.number, lsat.sensor, met);
+ if (elev->answer != NULL)
+ lsat.sun_elev = atof(elev->answer); /* Overwrite solar elevation of met file */
+ }
+ /* Data from date and solar elevation */
+ else if (adate->answer == NULL || elev->answer == NULL) {
+ G_fatal_error(_("Lacking date or solar elevation for this satellite"));
+ }
+ else {
+ if (sat7->answer) { /* Need gain */
+ if (bgain->answer == NULL || strlen(bgain->answer) != 9) {
+ G_fatal_error(_("For Landsat-7 is necessary band gain with 9 (H/L) data"));
+ }
+ set_ETM(&lsat, bgain->answer);
+ G_message("Landsat 7 ETM+");
+ }
+ else { /* Not need gain */
+ if (sat5->answer) {
+ if (msss->answer) set_MSS5(&lsat); else set_TM5(&lsat);
+ G_message("Landsat-5 %s", lsat.sensor);
+ }
+ else if (sat4->answer) {
+ if (msss->answer) set_MSS4(&lsat); else set_TM4(&lsat);
+ G_message("Landsat-4 %s", lsat.sensor);
+ }
+ else if (sat3->answer) {
+ set_MSS3(&lsat);
+ G_message("Landsat-3 MSS");
+ }
+ else if (sat2->answer) {
+ set_MSS2(&lsat);
+ G_message("Landsat-2 MSS");
+ }
+ else if (sat1->answer) {
+ set_MSS1(&lsat);
+ G_message("Landsat-1 MSS");
+ }
+ else {
+ G_fatal_error(_("Lacking satellite type"));
+ }
+ }
+ }
+
+ /*****************************************
+ * ------------ PREPARATION --------------
+ *****************************************/
+ if (strcasecmp(metho->answer, "corrected") == 0) method = CORRECTED;
+ else if (strcasecmp(metho->answer, "dos1") == 0) method = DOS1;
+ else if (strcasecmp(metho->answer, "dos2") == 0) method = DOS2;
+ else if (strcasecmp(metho->answer, "dos2b")== 0) method = DOS2b;
+ else if (strcasecmp(metho->answer, "dos3") == 0) method = DOS3;
+ else if (strcasecmp(metho->answer, "dos4") == 0) method = DOS4;
+ else method = UNCORRECTED;
+
+// if (metho->answer[3] == 'r') method = CORRECTED;
+// else if (metho->answer[3] == '1') method = DOS1;
+// else if (metho->answer[3] == '2') method = (metho->answer[4] == '\0') ? DOS2 : DOS2b;
+// else if (metho->answer[3] == '3') method = DOS3;
+// else if (metho->answer[3] == '4') method = DOS4;
+// else method = UNCORRECTED;
+
+ for (i = 0; i < lsat.bands; i++)
+ {
+ dn_mode[i] = 0;
+ dn_dark[i] = (int)lsat.band[i].qcalmin;
+ /* Calculate dark pixel */
+ if (method > DOS && !lsat.band[i].thermal)
+ {
+ for (j = 0; j < 256; j++) hist[j] = 0L;
+
+ snprintf(band_in, 127, "%s.%d", name, lsat.band[i].code);
+ mapset = G_find_cell2(band_in, "");
+ if (mapset == NULL) {
+ G_warning(_("Raster file [%s] not found"), band_in);
+ continue;
+ }
+ if ((infd = G_open_cell_old(band_in, mapset)) < 0)
+ G_fatal_error(_("Cannot open cell file [%s]"), band_in);
+ if (G_get_cellhd(band_in, mapset, &cellhd) < 0)
+ G_fatal_error(_("Cannot read file header of [%s]"), band_in);
+ if (G_set_window(&cellhd) < 0)
+ G_fatal_error(_("Unable to set region"));
+
+ in_data_type = G_raster_map_type(band_in, mapset);
+ inrast = G_allocate_raster_buf(in_data_type);
+
+ nrows = G_window_rows();
+ ncols = G_window_cols();
+
+ G_message("Calculating dark pixel of [%s] ... ", band_in);
+ for (row = 0; row < nrows; row++)
+ {
+ G_get_raster_row(infd, inrast, row, in_data_type);
+ for (col = 0; col < ncols; col++)
+ {
+ switch(in_data_type)
+ {
+ case CELL_TYPE:
+ ptr = (void *)((CELL *)inrast + col);
+ q = (int)*((CELL *)ptr);
+ break;
+ case FCELL_TYPE:
+ ptr = (void *)((FCELL *)inrast + col);
+ q = (int)*((FCELL *)ptr);
+ break;
+ case DCELL_TYPE:
+ ptr = (void *)((DCELL *)inrast + col);
+ q = (int)*((DCELL *)ptr);
+ break;
+ }
+ if (!G_is_null_value(ptr, in_data_type) &&
+ q >= lsat.band[i].qcalmin && q < 256)
+ hist[q]++;
+ }
+ }
+ /* DN of dark object */
+ for (j = lsat.band[i].qcalmin; j < 256; j++)
+ {
+ if (hist[j] >= pixel)
+ {
+ dn_dark[i] = j;
+ break;
+ }
+ }
+ /* Mode of DN */
+ h_max = 0L;
+ for (j= lsat.band[i].qcalmin; j < 241; j++) /* Exclude potentially saturated <= 240 */
+ {
+// printf("%d-%ld\n", j, hist[j]);
+ if (hist[j] > h_max)
+ {
+ h_max = hist[j];
+ dn_mode[i] = j;
+ }
+ }
+ G_message("... DN = %.2d [%d] : mode %.2d [%d]",
+ dn_dark[i], hist[dn_dark[i]],
+ dn_mode[i], hist[dn_mode[i]],
+ hist[255] > hist[dn_mode[i]] ? ", excluding DN > 240" : "");
+
+ G_free(inrast);
+ G_close_cell(infd);
+ }
+ /* Calculate transformation constants */
+ lsat_bandctes(&lsat, i, method, percent, dn_dark[i], sat_zenith, rayleigh);
+ }
+
+ /*****************************************
+ * ------------ VERBOSE ------------------
+ *****************************************/
+ if (verbo->answer)
+ {
+ fprintf(stdout, " ACQUISITION DATE %s [production date %s]\n", lsat.date, lsat.creation);
+ fprintf(stdout, " earth-sun distance = %.8lf\n", lsat.dist_es);
+ fprintf(stdout, " solar elevation angle = %.8lf\n", lsat.sun_elev);
+ fprintf(stdout, " Method of calculus = %s\n",
+ (method==CORRECTED ? "CORRECTED"
+ : (method == UNCORRECTED ? "UNCORRECTED" : metho->answer)));
+ if (method > DOS) {
+ fprintf(stdout, " percent of solar irradiance in path radiance = %.4lf\n", percent);
+ }
+ for (i = 0; i < lsat.bands; i++)
+ {
+ fprintf(stdout, "-------------------\n");
+ fprintf(stdout, " BAND %d %s (code %d)\n",
+ lsat.band[i].number, (lsat.band[i].thermal ? "thermal " : ""),
+ lsat.band[i].code);
+ fprintf(stdout, " calibrated digital number (DN): %.1lf to %.1lf\n",
+ lsat.band[i].qcalmin, lsat.band[i].qcalmax);
+ fprintf(stdout, " calibration constants (L): %.3lf to %.3lf\n",
+ lsat.band[i].lmin, lsat.band[i].lmax);
+ fprintf(stdout, " at-%s radiance = %.5lf · DN + %.5lf\n",
+ (method > DOS ? "surface" : "sensor"),
+ lsat.band[i].gain, lsat.band[i].bias);
+ if (lsat.band[i].thermal) {
+ fprintf(stdout, " at-sensor temperature = %.3lf / log[(%.3lf / radiance) + 1.0]\n",
+ lsat.band[i].K2, lsat.band[i].K1);
+ }
+ else {
+ fprintf(stdout, " mean solar exoatmospheric irradiance (ESUN): %.3lf\n",
+ lsat.band[i].esun);
+ fprintf(stdout, " at-%s reflectance = radiance / %.5lf\n",
+ (method > DOS ? "surface" : "sensor"),
+ lsat.band[i].K2);
+ if (method > DOS) {
+ fprintf(stdout, " the darkness DN with a least %d pixels is %d\n", pixel, dn_dark[i] );
+ fprintf(stdout, " the mode of DN is %d\n", dn_mode[i] );
+ }
+ }
+ }
+ fprintf(stdout, "-------------------\n");
+ fflush(stdout);
+ }
+
+ /*****************************************
+ * ------------ CALCULUS -----------------
+ *****************************************/
+
+ for (i = 0; i < lsat.bands; i++)
+ {
+ snprintf(band_in, 127, "%s.%d", name, lsat.band[i].code);
+ snprintf(band_out, 127, "%s.toar.%d", name, lsat.band[i].code);
+
+ mapset = G_find_cell2(band_in, "");
+ if (mapset == NULL) {
+ G_warning(_("raster file [%s] not found"), band_in);
+ continue; }
+
+ in_data_type = G_raster_map_type(band_in, mapset);
+ if ((infd = G_open_cell_old(band_in, mapset)) < 0)
+ G_fatal_error(_("Cannot open cell file [%s]"), band_in);
+
+ if (G_get_cellhd(band_in, mapset, &cellhd) < 0)
+ G_fatal_error(_("Cannot read file header of [%s]"), band_in);
+
+ /* set same size as original band raster */
+ if (G_set_window(&cellhd) < 0)
+ G_fatal_error(_("Unable to set region"));
+
+ /* controlling, if we can write the raster */
+ if (G_legal_filename(band_out) < 0)
+ G_fatal_error(_("[%s] is an illegal name"), band_out);
+
+ if ((outfd = G_open_raster_new(band_out, DCELL_TYPE)) < 0)
+ G_fatal_error(_("Could not open <%s>"), band_out);
+
+ /* Allocate input and output buffer */
+ inrast = G_allocate_raster_buf(in_data_type);
+ outrast = G_allocate_raster_buf(DCELL_TYPE);
+
+ nrows = G_window_rows();
+ ncols = G_window_cols();
+ /* ================================================================= */
+ G_message("%s of %s to %s",
+ (frad->answer ? "Radiance"
+ : (lsat.band[i].thermal) ? "Temperature" : "Reflectance"),
+ band_in, band_out);
+
+ for (row = 0; row < nrows; row++)
+ {
+ if (verbose)
+ G_percent(row, nrows, 2);
+
+ G_get_raster_row(infd, inrast, row, in_data_type);
+ for (col = 0; col < ncols; col++)
+ {
+ switch(in_data_type)
+ {
+ case CELL_TYPE:
+ ptr = (void *)((CELL *)inrast + col);
+ qcal = (double)((CELL *) inrast)[col];
+ break;
+ case FCELL_TYPE:
+ ptr = (void *)((FCELL *)inrast + col);
+ qcal = (double)((FCELL *) inrast)[col];
+ break;
+ case DCELL_TYPE:
+ ptr = (void *)((DCELL *)inrast + col);
+ qcal = (double)((DCELL *) inrast)[col];
+ break;
+ }
+ if (G_is_null_value(ptr, in_data_type) ||
+ qcal < lsat.band[i].qcalmin)
+ {
+ G_set_d_null_value((DCELL *)outrast + col, 1);
+ }
+ else
+ {
+ rad = lsat_qcal2rad(qcal, &lsat.band[i]);
+ if (frad->answer)
+ {
+ ref = rad;
+ }
+ else
+ {
+ if (lsat.band[i].thermal)
+ {
+ ref = lsat_rad2temp(rad, &lsat.band[i]);
+ }
+ else
+ {
+ ref = lsat_rad2ref(rad, &lsat.band[i]);
+ if (ref < 0. && method > DOS) ref = 0.;
+ }
+ }
+ ((DCELL *) outrast)[col] = ref;
+ }
+ }
+ if (G_put_raster_row(outfd, outrast, DCELL_TYPE) < 0)
+ G_fatal_error(_("Cannot write to <%s>"), band_out);
+ }
+ ref_mode = 0.;
+ if (method > DOS && !lsat.band[i].thermal)
+ {
+ ref_mode = lsat_qcal2rad(dn_mode[i], &lsat.band[i]);
+ ref_mode = lsat_rad2ref(ref_mode, &lsat.band[i]);
+ }
+
+ /* ================================================================= */
+
+ G_free(inrast);
+ G_close_cell(infd);
+ G_free(outrast);
+ G_close_cell(outfd);
+
+ char command[300];
+ sprintf(command, "r.colors map=%s color=grey", band_out);
+ system(command);
+
+ G_short_history(band_out, "raster", &history);
+
+ sprintf(history.edhist[0], " %s of Landsat-%d %s (method %s)", lsat.band[i].thermal ? "Temperature": "Reflectance",
+ lsat.number, lsat.sensor, metho->answer);
+ sprintf(history.edhist[1], "----------------------------------------------------------------");
+ sprintf(history.edhist[2], " Acquisition date ...................... %s", lsat.date);
+ sprintf(history.edhist[3], " Production date ....................... %s\n", lsat.creation);
+ sprintf(history.edhist[4], " Earth-sun distance (d) ................ %.8lf", lsat.dist_es);
+ sprintf(history.edhist[5], " Digital number (DN) range ............. %.0lf to %.0lf", lsat.band[i].qcalmin, lsat.band[i].qcalmax);
+ sprintf(history.edhist[6], " Calibration constants (Lmin to Lmax) .. %+.3lf to %+.3lf", lsat.band[i].lmin, lsat.band[i].lmax);
+ sprintf(history.edhist[7], " DN to Radiance (gain and bias) ........ %+.5lf and %+.5lf", lsat.band[i].gain, lsat.band[i].bias);
+ if (lsat.band[i].thermal) {
+ sprintf(history.edhist[8], " Temperature (K1 and K2) ............... %.3lf and %.3lf", lsat.band[i].K1, lsat.band[i].K2);
+ history.edlinecnt = 9;
+ } else {
+ sprintf(history.edhist[8], " Mean solar irradiance (ESUN) .......... %.3lf", lsat.band[i].esun);
+ sprintf(history.edhist[9], " Reflectance = Radiance divided by ..... %.5lf", lsat.band[i].K2);
+ history.edlinecnt = 10;
+ if (method > DOS) {
+ sprintf(history.edhist[10], "");
+ sprintf(history.edhist[11], " Dark object (%4d pixels) DN = ........ %d", pixel, dn_dark[i]);
+ sprintf(history.edhist[12], " Mode in reflectance histogram ......... %.5lf", ref_mode);
+ history.edlinecnt = 13;
+ }
+ }
+ sprintf (history.edhist[history.edlinecnt], "-----------------------------------------------------------------");
+ history.edlinecnt++;
+
+ G_command_history(&history);
+ G_write_history(band_out, &history);
+ }
+
+ exit(EXIT_SUCCESS);
+}
More information about the grass-commit
mailing list