r.li.setup.procedures.tcl 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757
  1. # This program is free software under the GPL (>=v2)
  2. # Read the COPYING file that comes with GRASS for details.
  3. ######################################################################
  4. # PROCEDURES
  5. ######################################################################
  6. #update sample frame environment variables
  7. proc updateSF_Environment { } {
  8. global env
  9. exec g.region rast=$env(RASTER)
  10. exec g.region -g > $env(TMP).tmp
  11. set n [ exec cat $env(TMP).tmp | grep "n=" | cut -f2 -d= ]
  12. set s [ exec cat $env(TMP).tmp | grep "s=" | head -n 1 | cut -f2 -d= ]
  13. set w [ exec cat $env(TMP).tmp | grep "w=" | cut -f2 -d= ]
  14. set e [ exec cat $env(TMP).tmp | grep "e=" | cut -f2 -d= ]
  15. set env(SF_N) $n
  16. set env(SF_S) $s
  17. set env(SF_E) $e
  18. set env(SF_W) $w
  19. set env(SF_NSRES) [ exec cat $env(TMP).tmp | grep "nsres=" | cut -f2 -d= ]
  20. set env(SF_EWRES) [ exec cat $env(TMP).tmp | grep "ewres=" | cut -f2 -d= ]
  21. set env(SF_X) 0
  22. set env(SF_Y) 0
  23. set env(SF_RL) [expr abs(round(double($s - $n) / double($env(SF_NSRES))))]
  24. set env(SF_CL) [expr abs(round(double($e - $w) / double($env(SF_EWRES))))]
  25. file delete $env(TMP).tmp
  26. #debug line
  27. #tk_messageBox -message "$env(SF_N)|$env(SF_S)|$env(SF_W)|$env(SF_E)|$env(SF_NSRES)|$env(SF_EWRES)|"
  28. }
  29. #shows the instruction for drawing squares
  30. proc squareInstruction {} {
  31. toplevel .instruction
  32. wm title .instruction "\[r.li.setup\] Commands"
  33. #wm maxsize .instruction 300 200
  34. frame .instruction.txt
  35. pack .instruction.txt
  36. text .instruction.txt.t -font Helvetica -height 12
  37. .instruction.txt.t tag configure big -font {Helvetica 16 bold}
  38. .instruction.txt.t tag configure normal -font {Helvetica 14}
  39. .instruction.txt.t insert end "Mouse buttons functions \n \n" big
  40. .instruction.txt.t insert end "Left button: " big
  41. .instruction.txt.t insert end "set first corner \n" normal
  42. .instruction.txt.t insert end "Center button: " big
  43. .instruction.txt.t insert end "set second corner \n" normal
  44. .instruction.txt.t insert end "Right button: " big
  45. .instruction.txt.t insert end "done \n" normal
  46. pack .instruction.txt.t
  47. frame .instruction.buttons
  48. pack .instruction.buttons -side bottom
  49. button .instruction.buttons.ok -text ok -command { destroy .instruction }
  50. pack .instruction.buttons.ok
  51. #.instruction.txt configure -state disabled
  52. return .instruction
  53. }
  54. proc vectorInstruction {} {
  55. toplevel .instruction
  56. wm title .instruction "\[r.li.setup\] Commands"
  57. #wm maxsize .instruction 300 200
  58. frame .instruction.txt
  59. pack .instruction.txt
  60. text .instruction.txt.t -font Helvetica -height 12
  61. .instruction.txt.t tag configure big -font {Helvetica 16 bold}
  62. .instruction.txt.t tag configure normal -font {Helvetica 14}
  63. .instruction.txt.t insert end "Mouse buttons functions \n \n" big
  64. .instruction.txt.t insert end "Left button: " big
  65. .instruction.txt.t insert end "none \n" normal
  66. .instruction.txt.t insert end "Center button: " big
  67. .instruction.txt.t insert end "toggle point \n" normal
  68. .instruction.txt.t insert end "Right button: " big
  69. .instruction.txt.t insert end "done \n" normal
  70. pack .instruction.txt.t
  71. frame .instruction.buttons
  72. pack .instruction.buttons -side bottom
  73. button .instruction.buttons.ok -text ok -command { destroy .instruction }
  74. pack .instruction.buttons.ok
  75. #.instruction.txt configure -state disabled
  76. return .instruction
  77. }
  78. proc circleInstruction {} {
  79. toplevel .instruction
  80. wm title .instruction "\[r.li.setup\] Commands"
  81. #wm maxsize .instruction 300 200
  82. frame .instruction.txt
  83. pack .instruction.txt
  84. text .instruction.txt.t -font Helvetica -height 12
  85. .instruction.txt.t tag configure big -font {Helvetica 16 bold}
  86. .instruction.txt.t tag configure normal -font {Helvetica 14}
  87. .instruction.txt.t insert end "Mouse buttons functions \n \n" big
  88. .instruction.txt.t insert end "Left button: " big
  89. .instruction.txt.t insert end "none \n" normal
  90. .instruction.txt.t insert end "Center button: " big
  91. .instruction.txt.t insert end "toggle center (first press) \n \t\t\ttoggle radius length (second press) \n" normal
  92. .instruction.txt.t insert end "Right button: " big
  93. .instruction.txt.t insert end "none \n" normal
  94. pack .instruction.txt.t
  95. frame .instruction.buttons
  96. pack .instruction.buttons -side bottom
  97. button .instruction.buttons.ok -text ok -command { destroy .instruction }
  98. pack .instruction.buttons.ok
  99. #.instruction.txt configure -state disabled
  100. return .instruction
  101. }
  102. # Create a simple file browser
  103. proc fileBrowser {path entry} {
  104. global p_entry
  105. set p_entry $entry
  106. toplevel .fileBrowser
  107. wm title .fileBrowser "\[r.li.setup\] File browser"
  108. #filelist frame
  109. frame .fileBrowser.top -relief flat
  110. pack .fileBrowser.top -side top -fill y -anchor center
  111. listbox .fileBrowser.top.listbox -selectmode single
  112. openDir .fileBrowser.top.listbox $path
  113. pack .fileBrowser.top.listbox -expand 1 -fill both -padx 7 -pady 7
  114. #browser buttons
  115. frame .fileBrowser.buttons
  116. pack .fileBrowser.buttons -side bottom -pady 2 -anchor center
  117. button .fileBrowser.buttons.open -text "Open" -command {set selection [fileSelect .fileBrowser .fileBrowser.top.listbox $p_entry]}
  118. pack .fileBrowser.buttons.open
  119. }
  120. proc fileSelect {widget listbox entry} {
  121. set selection [$listbox get [$listbox curselection]]
  122. switch [file type $selection] {
  123. directory {
  124. openDir $listbox $selection
  125. }
  126. file {
  127. destroy $widget
  128. $entry insert 0 [pwd]/$selection
  129. }
  130. }
  131. }
  132. #Open the specified directory
  133. proc openDir {listbox newpath} {
  134. catch {cd $newpath}
  135. $listbox delete 0 end
  136. foreach f [lsort [glob -nocomplain *]] {
  137. $listbox insert end $f
  138. }
  139. }
  140. # defines sampling frame
  141. proc defineSamplingFrame {selection button } {
  142. global env
  143. set tmp $env(TMP)
  144. switch $selection {
  145. whole {
  146. if { $env(RASTER) != "" } then {
  147. exec echo "SAMPLINGFRAME 0|0|1|1" >> $tmp.set
  148. updateSF_Environment
  149. tk_messageBox -message "Whole maplayer set as sampling frame" -type ok
  150. $button configure -state disabled
  151. } else {
  152. tk_messageBox -message "Please set raster name first" -type ok -icon error
  153. }
  154. }
  155. keyboard {
  156. kSamplingFrame
  157. $button configure -state disabled
  158. }
  159. mouse {
  160. if { $env(RASTER) == "" || $env(CONF) == "" } then {
  161. tk_messageBox -message "Please enter a raster map and a configuration file name first" -type ok -icon error
  162. } else {
  163. set ins [squareInstruction]
  164. tkwait window $ins
  165. catch { exec $env(F_PATH)/square_mouse_selection.sh raster=$env(RASTER) vector=$env(VECTOR) site=$env(SITE) conf=$tmp.tmp }
  166. set ok ""
  167. catch {set ok [exec cat $tmp.tmp | grep "SQUAREAREA" | cut -f1 -d\ ]}
  168. if { $ok == "SQUAREAREA" } then {
  169. #sampling frame accepted
  170. set start [exec cat $tmp.tmp | grep "START" | cut -f2 -d\ ]
  171. scan $start %f|%f|%f|%f|%f|%f s_n s_s s_e s_w s_nres s_sres
  172. set square [exec cat $tmp.tmp | grep "SQUAREAREA" | cut -f2 -d\ ]
  173. #resolution north-south
  174. set nres ""
  175. #resolution east-west
  176. set sres ""
  177. scan $square %f|%f|%f|%f|%f|%f n s e w nres sres
  178. set env(SF_N) $n
  179. set env(SF_S) $s
  180. set env(SF_E) $e
  181. set env(SF_W) $w
  182. set rows [exec r.info map=$env(RASTER) | grep "Rows" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  183. set cols [exec r.info map=$env(RASTER) | grep "Columns" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  184. # calulating area coordinates
  185. set env(SF_Y) [expr abs(round(($s_n - $n) / $nres)) ]
  186. set env(SF_X) [expr abs(round(($s_w - $w) / $sres)) ]
  187. set env(SF_RL) [expr abs(round(($n - $s) / $nres)) ]
  188. set env(SF_CL) [expr abs(round(($e - $w) / $sres)) ]
  189. set env(SF_NSRES) $nres
  190. set env(SF_EWRES) $sres
  191. set x [expr double($env(SF_X)) / double($cols)]
  192. set y [ expr double($env(SF_Y)) / double($rows)]
  193. set rl [ expr double($env(SF_RL)) / double($rows)]
  194. set cl [ expr double($env(SF_CL)) / double($cols) ]
  195. #debug line
  196. #tk_messageBox -message "$x|$y|$rl|$cl"
  197. exec echo "SAMPLINGFRAME $x|$y|$rl|$cl" >> $tmp.set
  198. tk_messageBox -message "Selected area set as sampling frame" -type ok
  199. file delete $tmp.tmp
  200. $button configure -state disabled
  201. } else {
  202. tk_messageBox -message "Warning sampling frame not set" -type ok -icon warning
  203. }
  204. }
  205. }
  206. }
  207. }
  208. # defines sampling area
  209. proc defineSamplingArea {selection widget} {
  210. global env
  211. set tmp $env(TMP)
  212. switch $selection {
  213. whole {
  214. set rows [exec r.info map=$env(RASTER) | grep "Rows" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  215. set cols [exec r.info map=$env(RASTER) | grep "Columns" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  216. set x [expr double($env(SF_X)) / double($cols) ]
  217. set y [expr double($env(SF_Y)) / double($rows) ]
  218. set rl [expr double($env(SF_RL)) /double($rows) ]
  219. set cl [expr double($env(SF_CL)) /double($cols) ]
  220. exec echo "SAMPLEAREA $x|$y|$rl|$cl" >> $tmp.set
  221. tk_messageBox -message "Whole maplayer set as sampling area" -type ok
  222. }
  223. regions {
  224. setSampleRegions $widget
  225. }
  226. units {
  227. setSampleUnits $widget
  228. }
  229. window {
  230. setMovWindow $widget
  231. }
  232. vector {
  233. tk_messageBox -message "WARNING: this configuration file will work only on $env(RASTER) raster map" -type ok -icon warning
  234. #TODO change here
  235. if { $env(RASTER) != "" && $env(VECTOR) != "" && $env(CONF) != "" } then {
  236. catch { exec $env(F_PATH)/sample_area_vector.sh raster=$env(RASTER) vector=$env(VECTOR) conf=$env(TMP).set }
  237. } else {
  238. tk_messageBox -message "Please set configuration file name, raster map and vector file to overlay" -type ok -icon error
  239. }
  240. }
  241. }
  242. }
  243. # defines sampling units distribuition
  244. proc defineSamplingUnits {selec rl cl maskname} {
  245. global env
  246. set tmp $env(TMP)
  247. #da modificare qua per le proiezioni
  248. switch $selec {
  249. nonoverlapping {
  250. toplevel .dialog
  251. wm title .dialog " Random Nonoverlapping "
  252. wm minsize .dialog 300 150
  253. frame .dialog.scale
  254. pack .dialog.scale
  255. label .dialog.scale.label1 -text " What number of Sampling Units to use?"
  256. entry .dialog.scale.e1 -width 5 -textvariable number1
  257. grid .dialog.scale.label1 .dialog.scale.e1 -padx 3
  258. button .dialog.button -text " Ok " -command {
  259. if { $number1!="" && ![catch { exec printf %i $number1 }]} then {
  260. exec echo "RANDOMNONOVERLAPPING $number1" >> $env(TMP).set
  261. tk_messageBox -message "Sampling units distribuition set as Random Nonoverlapping" -type ok
  262. set number1 ""
  263. destroy .dialog
  264. } else {
  265. tk_messageBox -message "Please type integer value" -type ok -icon error
  266. }
  267. }
  268. pack .dialog.button
  269. }
  270. contiguous {
  271. exec echo "SYSTEMATICCONTIGUOUS " >> $env(TMP).set
  272. tk_messageBox -message "Sampling units distribuition set as Systematic Contiguous" -type ok
  273. }
  274. noncontiguous {
  275. toplevel .dialog
  276. wm title .dialog " Systematic non contiguous "
  277. wm minsize .dialog 300 150
  278. frame .dialog.scale
  279. pack .dialog.scale
  280. label .dialog.scale.label1 -text " Insert distance between units"
  281. entry .dialog.scale.e1 -width 5 -textvariable number1
  282. grid .dialog.scale.label1 .dialog.scale.e1 -padx 3
  283. button .dialog.button -text " Ok " -command {
  284. if { $number1!="" && ![catch { exec printf %i $number1 }]} then {
  285. exec echo "SYSTEMATICNONCONTIGUOUS $number1" >> $env(TMP).set
  286. tk_messageBox -message "Sampling units distribuition set as Systematic Non Contiguous" -type ok
  287. set number1 ""
  288. destroy .dialog
  289. } else {
  290. tk_messageBox -message "Please type integer value" -type ok -icon error
  291. }
  292. }
  293. pack .dialog.button
  294. }
  295. random {
  296. toplevel .dialog
  297. wm title .dialog " Stratified Random "
  298. wm minsize .dialog 300 150
  299. frame .dialog.scale
  300. pack .dialog.scale
  301. label .dialog.scale.label1 -text " Insert number of row strates "
  302. entry .dialog.scale.e1 -width 5 -textvariable number1
  303. grid .dialog.scale.label1 .dialog.scale.e1 -padx 3
  304. frame .dialog.scale2
  305. pack .dialog.scale2
  306. label .dialog.scale2.label2 -text " Insert number of column strates "
  307. entry .dialog.scale2.e2 -width 5 -textvariable number2
  308. grid .dialog.scale2.label2 .dialog.scale2.e2 -padx 3
  309. button .dialog.button -text " Ok " -command {
  310. if { $number1!="" && $number2!="" && ![catch { exec printf %i%i $number1 $number2 }]} then {
  311. exec echo "STRATIFIEDRANDOM $number1|$number2" >> $env(TMP).set
  312. tk_messageBox -message "Sampling units distribuition set as Stratified random" -type ok
  313. set number1 ""
  314. destroy .dialog
  315. } else {
  316. tk_messageBox -message "Please type integer values" -type ok -icon error
  317. }
  318. }
  319. pack .dialog.button
  320. }
  321. sites {
  322. if { $env(RASTER) == "" || $env(SITE) == "" } then {
  323. tk_messageBox -message "Please set raster and site file names first" -icon error
  324. } else {
  325. centerOverSites $rl $cl $maskname
  326. }
  327. }
  328. }
  329. }
  330. proc saveWindow {sel number1 number2 number3 maskname widget} {
  331. global env
  332. set tmp $env(TMP)
  333. switch $sel {
  334. rectangle {
  335. #check if we have all values
  336. if { $number1 != "" && $number2!=""} then {
  337. if { [catch { exec printf %i%i $number1 $number2 }] } then {
  338. #check if we have integers
  339. tk_messageBox -message "Type integer values" -type ok -icon error
  340. } else {
  341. set rows [exec r.info map=$env(RASTER) | grep "Rows" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  342. set cols [exec r.info map=$env(RASTER) | grep "Columns" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  343. set rl [expr double($number2) / double($rows) ]
  344. set cl [expr double($number1) /double($cols) ]
  345. exec echo "SAMPLEAREA -1|-1|$rl|$cl" >> $env(TMP).set
  346. exec echo "MOVINGWINDOW" >> $env(TMP).set
  347. tk_messageBox -message " Moving Windows Setted " -type ok
  348. destroy $widget
  349. }
  350. } else {
  351. tk_messageBox -message "Set all entries first" -type ok -icon error
  352. }
  353. }
  354. circle {
  355. if { $number3 != "" } then {
  356. if { [catch { exec printf %i $number3 }] } then {
  357. #check if we have integers
  358. tk_messageBox -message "Type integer values" -type ok -icon error
  359. } else {
  360. circleMask $number3 $maskname
  361. set rows [exec r.info map=$env(RASTER) | grep "Rows" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  362. set cols [exec r.info map=$env(RASTER) | grep "Columns" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  363. set rl [expr double($env(CIR_RL)) /double($rows)]
  364. set cl [expr double($env(CIR_CL)) /double($cols)]
  365. exec echo "MASKEDSAMPLEAREA -1|-1|$rl|$cl|$maskname" >> $env(TMP).set
  366. tk_messageBox -message " Moving Windows Setted " -type ok
  367. exec echo "MOVINGWINDOW" >> $env(TMP).set
  368. destroy $widget
  369. }
  370. } else {
  371. tk_messageBox -message "Set all entries first" -type ok -icon error
  372. }
  373. }
  374. }
  375. }
  376. #draw regions with mouse
  377. proc drawRegions { number } {
  378. global env
  379. if { $env(RASTER) == "" } then {
  380. tk_messageBox -message "Please set the rastermap first" -type ok -icon error
  381. } else {
  382. set i 0
  383. set ins [vectorInstruction]
  384. tkwait window $ins
  385. while { $i < $number } {
  386. catch { exec $env(F_PATH)/masked_area_selection.sh -f north=$env(SF_N) south=$env(SF_S) west=$env(SF_W) east=$env(SF_E) raster=$env(RASTER) vector=$env(VECTOR) site=$env(SITE) conf=$env(TMP).tmp }
  387. set ok ""
  388. catch {set ok [exec cat $env(TMP).tmp | grep "SAMPLEAREAMASKED" | cut -f1 -d\ ]}
  389. if { $ok == "SAMPLEAREAMASKED" } then {
  390. #region accepted
  391. incr i
  392. set r_name [exec cat $env(TMP).tmp | grep "SAMPLEAREAMASKED" | cut -f2 -d\ ]
  393. set square [exec cat $env(TMP).tmp | grep "SAMPLEAREAMASKED" | cut -f3 -d\ ]
  394. scan $square %f|%f|%f|%f n s e w
  395. set rows [exec r.info map=$env(RASTER) | grep "Rows" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  396. set cols [exec r.info map=$env(RASTER) | grep "Columns" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  397. set abs_y [expr $env(SF_Y) + abs(round(($env(SF_N) - $n) / $env(SF_NSRES))) ]
  398. set abs_x [expr $env(SF_X)+ abs(round(($env(SF_W) - $w) / $env(SF_EWRES))) ]
  399. set abs_rl [expr abs(round(($n - $s) / $env(SF_NSRES))) ]
  400. set abs_cl [expr abs(round(($e - $w) / $env(SF_EWRES))) ]
  401. #debug line
  402. #tk_messageBox -message "$abs_x|$abs_y|$abs_rl|$abs_cl"
  403. set x [expr double($abs_x) / double($cols)]
  404. set y [ expr double($abs_y) / double($rows)]
  405. set rl [ expr double($abs_rl) / double($rows)]
  406. set cl [ expr double($abs_cl) / double($cols) ]
  407. #debug line
  408. #tk_messageBox -message "$x|$y|$rl|$cl"
  409. exec echo "MASKEDSAMPLEAREA $x|$y|$rl|$cl|$r_name" >> $env(TMP).set
  410. tk_messageBox -message "Selected region saved as sampling area" -type ok
  411. file delete $env(TMP).tmp
  412. } else {
  413. tk_messageBox -message "Please redraw region number $i" -type ok -icon warning
  414. }
  415. }
  416. }
  417. }
  418. #draw sample units with mouse
  419. proc drawMouseUnits { num sel } {
  420. global env
  421. # rectangular or circle units ?
  422. switch $sel {
  423. rectangle {
  424. #rectangular units
  425. set i 0
  426. set ins [squareInstruction]
  427. tkwait window $ins
  428. if { $env(RASTER) == "" || $env(CONF) == "" } then {
  429. tk_messageBox -message "Please enter a raster map and a configuration file name first" -type ok -icon error
  430. } else {
  431. while { $i < $num } {
  432. catch { exec $env(F_PATH)/square_mouse_selection.sh -f north=$env(SF_N) south=$env(SF_S) east=$env(SF_E) west=$env(SF_W) raster=$env(RASTER) vector=$env(VECTOR) site=$env(SITE) conf=$env(TMP).tmp }
  433. set ok ""
  434. catch {set ok [exec cat $env(TMP).tmp | grep "SQUAREAREA" | cut -f1 -d\ ]}
  435. if { $ok == "SQUAREAREA" } then {
  436. #sampling area accepted
  437. incr i
  438. set start [exec cat $env(TMP).tmp | grep "START" | cut -f2 -d\ ]
  439. scan $start %f|%f|%f|%f|%f|%f s_n s_s s_e s_w s_nres s_sres
  440. set square [exec cat $env(TMP).tmp | grep "SQUAREAREA" | cut -f2 -d\ ]
  441. #resolution north-south
  442. set nres ""
  443. #resolution east-west
  444. set sres ""
  445. scan $square %f|%f|%f|%f|%f|%f n s e w nres sres
  446. set rows [exec r.info map=$env(RASTER) | grep "Rows" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  447. set cols [exec r.info map=$env(RASTER) | grep "Columns" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  448. # calulating area coordinates
  449. set abs_y [expr abs(round(($s_n - $n) / $nres)) ]
  450. set abs_x [expr abs(round(($s_w - $w) / $sres)) ]
  451. set abs_rl [expr abs(round(($n - $s) / $nres)) ]
  452. set abs_cl [expr abs(round(($e - $w) / $sres)) ]
  453. #debug line
  454. #tk_messageBox -message "$abs_x|$abs_y|$abs_rl|$abs_cl"
  455. set x [expr double($abs_x) / double($cols)]
  456. set y [ expr double($abs_y) / double($rows)]
  457. set rl [ expr double($abs_rl) / double($rows)]
  458. set cl [ expr double($abs_cl) / double($cols) ]
  459. #debug line
  460. #tk_messageBox -message "$x|$y|$rl|$cl"
  461. exec echo "SAMPLEAREA $x|$y|$rl|$cl" >> $env(TMP).set
  462. tk_messageBox -message "Selected area saved as sample area" -type ok
  463. file delete $env(TMP).tmp
  464. } else {
  465. tk_messageBox -message "Warning sampling area not set" -type ok -icon warning
  466. }
  467. }
  468. }
  469. }
  470. circle {
  471. #circulars areas
  472. set i 0
  473. set ins [circleInstruction]
  474. tkwait window $ins
  475. while { $i < $num } {
  476. catch { exec $env(F_PATH)/masked_area_selection.sh -f -c north=$env(SF_N) south=$env(SF_S) west=$env(SF_W) east=$env(SF_E) raster=$env(RASTER) vector=$env(VECTOR) site=$env(SITE) conf=$env(TMP).tmp }
  477. set ok ""
  478. catch {set ok [exec cat $env(TMP).tmp | grep "SAMPLEAREAMASKED" | cut -f1 -d\ ]}
  479. if { $ok == "SAMPLEAREAMASKED" } then {
  480. #region accepted
  481. incr i
  482. set r_name [exec cat $env(TMP).tmp | grep "SAMPLEAREAMASKED" | cut -f2 -d\ ]
  483. set square [exec cat $env(TMP).tmp | grep "SAMPLEAREAMASKED" | cut -f3 -d\ ]
  484. scan $square %f|%f|%f|%f n s e w
  485. set rows [exec r.info map=$env(RASTER) | grep "Rows" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  486. set cols [exec r.info map=$env(RASTER) | grep "Columns" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  487. set abs_y [expr $env(SF_Y) + abs(round(($env(SF_N) - $n) / $env(SF_NSRES))) ]
  488. set abs_x [expr $env(SF_X)+ abs(round(($env(SF_W) - $w) / $env(SF_EWRES))) ]
  489. set abs_rl [expr abs(round(($n - $s) / $env(SF_NSRES))) ]
  490. set abs_cl [expr abs(round(($e - $w) / $env(SF_EWRES))) ]
  491. #debug line
  492. #tk_messageBox -message "$abs_x|$abs_y|$abs_rl|$abs_cl"
  493. set x [expr double($abs_x) / double($cols)]
  494. set y [ expr double($abs_y) / double($rows)]
  495. set rl [ expr double($abs_rl) / double($rows)]
  496. set cl [ expr double($abs_cl) / double($cols) ]
  497. #debug line
  498. #tk_messageBox -message "$x|$y|$rl|$cl"
  499. exec echo "MASKEDSAMPLEAREA $x|$y|$rl|$cl|$r_name" >> $env(TMP).set
  500. tk_messageBox -message "Selection saved as sampling area" -type ok
  501. file delete $env(TMP).tmp
  502. } else {
  503. tk_messageBox -message "Please redraw sample unit number $i" -type ok -icon warning
  504. }
  505. }
  506. }
  507. }
  508. }
  509. #draw moving window with mouse
  510. proc drawMouseWindow { sel } {
  511. global env
  512. #rectangular or circular window
  513. switch $sel {
  514. rectangle {
  515. set i 0
  516. set ins [squareInstruction]
  517. tkwait window $ins
  518. if { $env(RASTER) == "" || $env(CONF) == "" } then {
  519. tk_messageBox -message "Please enter a raster map and a configuration file name first" -type ok -icon error
  520. } else {
  521. while { $i == 0 } {
  522. catch { exec $env(F_PATH)/square_mouse_selection.sh -f north=$env(SF_N) south=$env(SF_S) east=$env(SF_E) west=$env(SF_W) raster=$env(RASTER) vector=$env(VECTOR) site=$env(SITE) conf=$env(TMP).tmp }
  523. set ok ""
  524. catch {set ok [exec cat $env(TMP).tmp | grep "SQUAREAREA" | cut -f1 -d\ ]}
  525. if { $ok == "SQUAREAREA" } then {
  526. #moving window accepted
  527. incr i
  528. set start [exec cat $env(TMP).tmp | grep "START" | cut -f2 -d\ ]
  529. scan $start %f|%f|%f|%f|%f|%f s_n s_s s_e s_w s_nres s_sres
  530. set square [exec cat $env(TMP).tmp | grep "SQUAREAREA" | cut -f2 -d\ ]
  531. #resolution north-south
  532. set nres ""
  533. #resolution east-west
  534. set sres ""
  535. scan $square %f|%f|%f|%f|%f|%f n s e w nres sres
  536. set rows [exec r.info map=$env(RASTER) | grep "Rows" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  537. set cols [exec r.info map=$env(RASTER) | grep "Columns" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  538. #calculating moving window width and length
  539. set abs_rl [expr abs(round(($n - $s) / $nres)) ]
  540. set abs_cl [expr abs(round(($e - $w) / $sres)) ]
  541. #debug line
  542. #tk_messageBox -message "$abs_x|$abs_y|$abs_rl|$abs_cl"
  543. set rl [ expr double($abs_rl) / double($rows)]
  544. set cl [ expr double($abs_cl) / double($cols) ]
  545. #debug line
  546. #tk_messageBox -message "$x|$y|$rl|$cl"
  547. exec echo "MOVINGWINDOW" >> $env(TMP).set
  548. exec echo "SAMPLEAREA -1|-1|$rl|$cl" >> $env(TMP).set
  549. tk_messageBox -message "Moving window set" -type ok
  550. file delete $env(TMP).tmp
  551. } else {
  552. tk_messageBox -message "Moving window not set" -type ok -icon warning
  553. }
  554. }
  555. }
  556. }
  557. circle {
  558. #circulars areas
  559. set i 0
  560. set ins [circleInstruction]
  561. tkwait window $ins
  562. while { $i == 0 } {
  563. catch { exec $env(F_PATH)/masked_area_selection.sh -f -c north=$env(SF_N) south=$env(SF_S) west=$env(SF_W) east=$env(SF_E) raster=$env(RASTER) vector=$env(VECTOR) site=$env(SITE) conf=$env(TMP).tmp }
  564. set ok ""
  565. catch {set ok [exec cat $env(TMP).tmp | grep "SAMPLEAREAMASKED" | cut -f1 -d\ ]}
  566. if { $ok == "SAMPLEAREAMASKED" } then {
  567. #region accepted
  568. incr i
  569. set r_name [exec cat $env(TMP).tmp | grep "SAMPLEAREAMASKED" | cut -f2 -d\ ]
  570. set square [exec cat $env(TMP).tmp | grep "SAMPLEAREAMASKED" | cut -f3 -d\ ]
  571. scan $square %f|%f|%f|%f n s e w
  572. set rows [exec r.info map=$env(RASTER) | grep "Rows" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  573. set cols [exec r.info map=$env(RASTER) | grep "Columns" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  574. set abs_rl [expr abs(round(($n - $s) / $env(SF_NSRES))) ]
  575. set abs_cl [expr abs(round(($e - $w) / $env(SF_EWRES))) ]
  576. #debug line
  577. #tk_messageBox -message "$abs_x|$abs_y|$abs_rl|$abs_cl"
  578. set rl [ expr double($abs_rl) / double($rows)]
  579. set cl [ expr double($abs_cl) / double($cols) ]
  580. #debug line
  581. #tk_messageBox -message "$x|$y|$rl|$cl"
  582. exec echo "MOVINGWINDOW" >> $env(TMP).set
  583. exec echo "MASKEDSAMPLEAREA -1|-1|$rl|$cl|$r_name" >> $env(TMP).set
  584. tk_messageBox -message "Moving window set" -type ok
  585. file delete $env(TMP).tmp
  586. } else {
  587. tk_messageBox -message "Moving window not set" -type ok -icon warning
  588. }
  589. }
  590. }
  591. }
  592. }
  593. #create a circle mask for the keyboard circle selection
  594. proc circleMask { radius name} {
  595. global env
  596. exec g.region rast=$env(RASTER)
  597. exec g.region -m > $env(TMP).tmp
  598. set nsres [ exec cat $env(TMP).tmp | grep "nsres=" | cut -f2 -d= ]
  599. set ewres [ exec cat $env(TMP).tmp | grep "ewres=" | cut -f2 -d= ]
  600. #calculating number of cell needed
  601. set xcell [expr round((2 * $radius) / $ewres) ]
  602. set ycell [expr round((2 * $radius) / $nsres) ]
  603. #to create a good raster circle the center of the circle have to be
  604. #in the center of a cell, then we need an odd number of cells...
  605. if { [ expr $xcell % 2 ] == 0 } then {
  606. incr xcell
  607. }
  608. if { [ expr $ycell % 2 ] == 0 } then {
  609. incr ycell
  610. }
  611. #store in environment xcell and ycell if we have to center this circle
  612. set env(CIR_RL) $ycell
  613. set env(CIR_CL) $xcell
  614. #calculating easth and south edge
  615. set easthEdge [expr double($env(SF_W) + ($xcell * $env(SF_EWRES)))]
  616. set southEdge [expr double($env(SF_N) - ($ycell * $env(SF_NSRES)))]
  617. #restrict region
  618. exec g.region n=$env(SF_N) s=$southEdge e=$easthEdge w=$env(SF_W)
  619. set xcenter [exec g.region -c | grep "region center easting:" | cut -f2 -d: | tr -d " "]
  620. set ycenter [exec g.region -c | grep "region center northing:" | cut -f2 -d: | tr -d " "]
  621. #debug line
  622. #tk_messageBox -message "$xcenter , $ycenter $env(SF_N) $southEdge $env(SF_W) $easthEdge"
  623. #creating circle
  624. catch {exec r.circle -b output=$name coordinate=$xcenter,$ycenter max=$radius }
  625. file delete $env(TMP).tmp
  626. }
  627. #set sample units from a site file
  628. proc centerOverSites { rl cl name} {
  629. global env
  630. if { $env(SITE) == "" || $env(RASTER) == "" } then {
  631. tk_messageBox -message "Please set raster and site file name first" -type ok -icon error
  632. } else {
  633. #raster boundaries
  634. exec g.region rast=$env(RASTER)
  635. exec g.region -g > $env(TMP).tmp
  636. set rows [exec r.info map=$env(RASTER) | grep "Rows" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  637. set cols [exec r.info map=$env(RASTER) | grep "Columns" | tr -d " " | cut -f 2 -d: | cut -f 1 -d\| ]
  638. #create ascii site file
  639. exec v.out.ascii input=$env(SITE) output=$env(TMP).asc format=point
  640. #counting points
  641. set num [exec cat $env(TMP).asc | grep -c "" ]
  642. set i 0
  643. # inserting point if they are into sample frame
  644. while { $i < $num } {
  645. incr i
  646. #read the line i
  647. exec head -n $i $env(TMP).asc | tail -n 1 > $env(TMP).line
  648. set x [exec cat $env(TMP).line | cut -f1 -d\| ]
  649. set y [exec cat $env(TMP).line | cut -f2 -d\| ]
  650. #check if selected point is into sample frame
  651. #debug line
  652. #tk_messageBox -message "a=$x b=$y c=$env(SF_N) d=$env(SF_S) e=$env(SF_W) f=$env(SF_E)"
  653. set ok "TRUE"
  654. if { $y < $env(SF_S) || $y > $env(SF_N) || $x < $env(SF_W) || $x > $env(SF_E) } then {
  655. set ok "FALSE"
  656. }
  657. if { $ok == "TRUE" } then {
  658. #the point is into sample frame
  659. #calculating what cell contains this point
  660. set p_c [expr int( abs($x - $env(SF_W)) / $env(SF_EWRES))]
  661. set p_r [expr int( abs($y - $env(SF_N)) / $env(SF_NSRES))]
  662. #debug line
  663. #tk_messageBox -message "$p_c $p_r"
  664. #the point is the center of the rectangle, we have to see if the rectangle is into sample frame
  665. set rl_delta [expr int( $rl/2)]
  666. set cl_delta [expr int( $cl/2)]
  667. set n_diff [expr ($p_r - $rl_delta) - $env(SF_Y)]
  668. set s_diff [expr ($env(SF_Y) + $env(SF_RL)) - ($p_r + $rl_delta +1) ]
  669. set e_diff [expr ($env(SF_X) + $env(SF_CL)) - ($p_c + $cl_delta + 1) ]
  670. set w_diff [expr ($p_c - $cl_delta) - $env(SF_X)]
  671. if { $n_diff > 0 && $s_diff > 0 && $e_diff > 0 && $w_diff > 0 } then {
  672. #the rectangle is into sampling frame
  673. set rel_x [expr double($p_c - $cl_delta) / double($cols)]
  674. set rel_y [expr double($p_r - $rl_delta) /double($rows)]
  675. set rel_rl [expr double($rl) / double($rows)]
  676. set rel_cl [expr double($cl) / double($cols)]
  677. if { $name == "" } then {
  678. #the sample frame don't have a mask
  679. exec echo "SAMPLEAREA $rel_x|$rel_y|$rel_rl|$rel_cl" >> $env(TMP).set
  680. } else {
  681. # the sample frame has a mask
  682. exec echo "MASKEDSAMPLEAREA $rel_x|$rel_y|$rel_rl|$rel_cl|$name" >> $env(TMP).set
  683. }
  684. }
  685. }
  686. }
  687. file delete $env(TMP).tmp $env(TMP).line $env(TMP).asc
  688. }
  689. }
  690. proc saveSettings { widget } {
  691. global env
  692. #write the sample frame
  693. exec cat $env(TMP).set | grep "SAMPLINGFRAME " | tail -n 1 > $env(CONF)
  694. #write sampling areas
  695. catch { exec cat $env(TMP).set | grep "SAMPLEAREA " >> $env(CONF) }
  696. catch { exec cat $env(TMP).set | grep "MASKEDSAMPLEAREA " >> $env(CONF) }
  697. set overlay 0
  698. catch { set overlay [ exec cat $env(TMP).set | grep "MASKEDOVERLAYAREA " -c ] }
  699. if { $overlay != 0 } then {
  700. exec cat $env(TMP).set | grep "MASKEDOVERLAYAREA " >> $env(CONF)
  701. exec echo "RASTERMAP $env(RASTER)" >> $env(CONF)
  702. exec echo "VECTORMAP $env(VECTOR)" >> $env(CONF)
  703. }
  704. #write disposition line
  705. catch { exec cat $env(TMP).set | grep "MOVINGWINDOW" >> $env(CONF) }
  706. catch { exec cat $env(TMP).set | grep "RANDOMNONOVERLAPPING " >> $env(CONF) }
  707. catch { exec cat $env(TMP).set | grep "SYSTEMATICCONTIGUOUS " >> $env(CONF) }
  708. catch { exec cat $env(TMP).set | grep "SYSTEMATICNONCONTIGUOUS " >> $env(CONF) }
  709. catch { exec cat $env(TMP).set | grep "STRATIFIEDRANDOM " >> $env(CONF) }
  710. file delete $env(TMP).set
  711. destroy $widget
  712. }