Bounds

Author

Andres Calderon

── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.6     ✓ dplyr   1.0.8
✓ tidyr   1.2.0     ✓ stringr 1.4.0
✓ readr   2.1.2     ✓ forcats 0.5.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
Rows: 1560922 Columns: 12
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (1): clase
dbl (11): B2, B3, B4, B5, B6, B7, B8, B11, B12, DEM, Slopes

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Tabla con limites superior e inferior para cada clase…
print.data.frame(bounds )
             Class Bounds          B2          B3           B4         B5
1            palma  upper  132.250007  244.557853  211.0690791  430.80031
2            palma  lower   20.549452   59.816027    6.5125466  107.89656
3    cafe_expuesto  upper  153.402626  286.451210  232.0744809  511.56313
4    cafe_expuesto  lower   -6.316362   16.816442  -12.6206003   68.62392
5  cafe_semisombra  upper  119.867561  251.672862  177.8825598  464.92778
6  cafe_semisombra  lower    1.020018   21.695818    0.2267684   70.45270
7      cafe_sombra  upper  108.931694  253.129559  157.5318403  472.96497
8      cafe_sombra  lower    8.319460   26.368956    8.8189069   78.15437
9       vegetacion  upper  132.897410  242.473488  197.2285140  438.08348
10      vegetacion  lower  -10.101088    8.822518   -8.9678002   47.48948
11          ciudad  upper  424.658449  535.997020  625.8042198  700.12046
12          ciudad  lower -101.345008 -110.291510 -233.1455704 -121.83639
13            agua  upper  133.563187  261.480501  197.0918024  421.39507
14            agua  lower    7.532024  -23.192416  -15.0142093 -111.22450
          B6        B7         B8       B11        B12        DEM       Slopes
1  1335.0259 1726.0884 1782.38443  955.1218  489.36840  135.31218    7.8455832
2   347.7550  426.4164  437.35131  271.3141   94.45857   51.61031    0.5191916
3  1488.8353 1815.4894 1948.92639 1058.7544  555.93285 2048.17617   42.1074509
4   206.2268  260.0312  240.45055  203.7253   79.26970 1073.06182   13.0165803
5  1463.9662 1815.5011 1958.26222  995.8490  483.71075 1842.10254   42.3744288
6   232.8089  294.8069  275.31100  207.0160   83.61501  973.69736   12.8370326
7  1652.1542 2098.7067 2254.84497 1083.2089  492.86517 1748.81212   41.0399148
8   270.1715  342.5408  312.76196  211.6086   86.32620  901.65207   13.7832911
9  1182.1337 1453.3073 1572.38500  950.1666  497.72496 1615.25847   38.3298281
10  106.3732  123.2299   87.13021  164.3350   58.87195 -479.47429   -5.8765562
11  877.0691  980.3268  994.73399 1023.0424  938.55481  239.86557   38.0724534
12 -142.2970 -265.7054 -271.62550 -275.1948 -265.69212 -146.12761 -114.3049785
13  854.7607  984.2878 1003.90731  542.7321  282.21016   88.36626    8.0659371
14 -413.5432 -473.1328 -513.75816 -249.0520 -119.62812   30.61908   -0.8774983
Posible pseudocodigo del filtro para el caso de palma…
if(B2 <= 132.25 && B2 >= 20.55)

  if(B3 <= 244.55 && B3 >= 59.81)

    if(B4 <= 211.06 && B4 >= 6.51)

      …

        if(Slopes <= 7.84 && Slopes >= 0.52 )

          keep this record

Otherwise

  prune it
Trabajando en un formato alternativo…
uppers <- bounds |> 
  #select(B2,B3,B4,B5,B6,B7,B8,B11,B12,DEM, Slopes) |> 
  filter(Bounds == "upper") |>
  select(-Bounds) |>
  pivot_longer(cols = -Class, names_to = "BandU", values_to = "Upper")
lowers <- bounds |> 
  #select(B2,B3,B4,B5,B6,B7,B8,B11,B12,DEM, Slopes) |> 
  filter(Bounds == "lower") |>
  select(-Bounds) |>
  pivot_longer(cols = -Class, names_to = "BandL", values_to = "Lower")

ifs <- bind_cols(lowers, uppers |> select(-Class))
ifs
# A tibble: 77 × 5
   Class BandL  Lower BandU Upper
   <chr> <chr>  <dbl> <chr> <dbl>
 1 palma B2     20.5  B2     132.
 2 palma B3     59.8  B3     245.
 3 palma B4      6.51 B4     211.
 4 palma B5    108.   B5     431.
 5 palma B6    348.   B6    1335.
 6 palma B7    426.   B7    1726.
 7 palma B8    437.   B8    1782.
 8 palma B11   271.   B11    955.
 9 palma B12    94.5  B12    489.
10 palma DEM    51.6  DEM    135.
# … with 67 more rows
Esta seria una tabla intermedia para obtener un formato mas util…
filters <- ifs |> 
  mutate(ifs = paste0("if(clase == ", Class, " && ", BandL, " >= ", Lower, " && ", BandU, " <= ", Upper, ")")) |>
  select (ifs)

print(filters, n = 77)
# A tibble: 77 × 1
   ifs                                                                          
   <chr>                                                                        
 1 if(clase == palma && B2 >= 20.5494521483389 && B2 <= 132.250007432836)       
 2 if(clase == palma && B3 >= 59.8160268500471 && B3 <= 244.557852906764)       
 3 if(clase == palma && B4 >= 6.51254664707307 && B4 <= 211.069079112891)       
 4 if(clase == palma && B5 >= 107.896564432917 && B5 <= 430.80030564139)        
 5 if(clase == palma && B6 >= 347.754963005186 && B6 <= 1335.02594219635)       
 6 if(clase == palma && B7 >= 426.416355409537 && B7 <= 1726.08839577263)       
 7 if(clase == palma && B8 >= 437.35130729583 && B8 <= 1782.38442789895)        
 8 if(clase == palma && B11 >= 271.314089904972 && B11 <= 955.121847946863)     
 9 if(clase == palma && B12 >= 94.4585748588907 && B12 <= 489.368401047437)     
10 if(clase == palma && DEM >= 51.6103100996285 && DEM <= 135.312184833945)     
11 if(clase == palma && Slopes >= 0.519191552851886 && Slopes <= 7.845583171663…
12 if(clase == cafe_expuesto && B2 >= -6.31636178838249 && B2 <= 153.4026264018…
13 if(clase == cafe_expuesto && B3 >= 16.8164422876509 && B3 <= 286.45120976982…
14 if(clase == cafe_expuesto && B4 >= -12.6206002690243 && B4 <= 232.0744808890…
15 if(clase == cafe_expuesto && B5 >= 68.6239237259282 && B5 <= 511.56312885686)
16 if(clase == cafe_expuesto && B6 >= 206.226792439498 && B6 <= 1488.8352665809…
17 if(clase == cafe_expuesto && B7 >= 260.031226990659 && B7 <= 1815.4893992646…
18 if(clase == cafe_expuesto && B8 >= 240.450552032499 && B8 <= 1948.9263857024…
19 if(clase == cafe_expuesto && B11 >= 203.725252997808 && B11 <= 1058.75442975…
20 if(clase == cafe_expuesto && B12 >= 79.2696998152688 && B12 <= 555.932854647…
21 if(clase == cafe_expuesto && DEM >= 1073.0618210985 && DEM <= 2048.176166232…
22 if(clase == cafe_expuesto && Slopes >= 13.0165802538461 && Slopes <= 42.1074…
23 if(clase == cafe_semisombra && B2 >= 1.02001758830353 && B2 <= 119.867560952…
24 if(clase == cafe_semisombra && B3 >= 21.6958181134443 && B3 <= 251.672862408…
25 if(clase == cafe_semisombra && B4 >= 0.22676842669128 && B4 <= 177.882559751…
26 if(clase == cafe_semisombra && B5 >= 70.452695632031 && B5 <= 464.9277780267…
27 if(clase == cafe_semisombra && B6 >= 232.808893445122 && B6 <= 1463.96616697…
28 if(clase == cafe_semisombra && B7 >= 294.806868929256 && B7 <= 1815.50110593…
29 if(clase == cafe_semisombra && B8 >= 275.310999386096 && B8 <= 1958.26222439…
30 if(clase == cafe_semisombra && B11 >= 207.0160477941 && B11 <= 995.849007788…
31 if(clase == cafe_semisombra && B12 >= 83.6150078761761 && B12 <= 483.7107533…
32 if(clase == cafe_semisombra && DEM >= 973.697359155141 && DEM <= 1842.102544…
33 if(clase == cafe_semisombra && Slopes >= 12.8370326462096 && Slopes <= 42.37…
34 if(clase == cafe_sombra && B2 >= 8.3194599337196 && B2 <= 108.931694140964)  
35 if(clase == cafe_sombra && B3 >= 26.368955904879 && B3 <= 253.129558652459)  
36 if(clase == cafe_sombra && B4 >= 8.81890694959374 && B4 <= 157.53184034233)  
37 if(clase == cafe_sombra && B5 >= 78.1543675411933 && B5 <= 472.964970636968) 
38 if(clase == cafe_sombra && B6 >= 270.171458724718 && B6 <= 1652.15415030677) 
39 if(clase == cafe_sombra && B7 >= 342.540784051051 && B7 <= 2098.70671354939) 
40 if(clase == cafe_sombra && B8 >= 312.761963657695 && B8 <= 2254.844965361)   
41 if(clase == cafe_sombra && B11 >= 211.608638776582 && B11 <= 1083.2089488645…
42 if(clase == cafe_sombra && B12 >= 86.3262040698783 && B12 <= 492.86516665090…
43 if(clase == cafe_sombra && DEM >= 901.652065059982 && DEM <= 1748.8121243453…
44 if(clase == cafe_sombra && Slopes >= 13.78329107251 && Slopes <= 41.03991475…
45 if(clase == vegetacion && B2 >= -10.1010883384941 && B2 <= 132.897410098549) 
46 if(clase == vegetacion && B3 >= 8.82251815568148 && B3 <= 242.47348849036)   
47 if(clase == vegetacion && B4 >= -8.96780017070738 && B4 <= 197.228514047183) 
48 if(clase == vegetacion && B5 >= 47.4894846737214 && B5 <= 438.083478543879)  
49 if(clase == vegetacion && B6 >= 106.373215418443 && B6 <= 1182.13374573659)  
50 if(clase == vegetacion && B7 >= 123.229892953039 && B7 <= 1453.30731914734)  
51 if(clase == vegetacion && B8 >= 87.1302064902071 && B8 <= 1572.38500492265)  
52 if(clase == vegetacion && B11 >= 164.335033704678 && B11 <= 950.166570512121)
53 if(clase == vegetacion && B12 >= 58.8719526952577 && B12 <= 497.724959187405)
54 if(clase == vegetacion && DEM >= -479.474292241509 && DEM <= 1615.2584677886…
55 if(clase == vegetacion && Slopes >= -5.87655616191386 && Slopes <= 38.329828…
56 if(clase == ciudad && B2 >= -101.345007983575 && B2 <= 424.658448690827)     
57 if(clase == ciudad && B3 >= -110.291509729133 && B3 <= 535.997020217868)     
58 if(clase == ciudad && B4 >= -233.145570351915 && B4 <= 625.804219827652)     
59 if(clase == ciudad && B5 >= -121.836390183146 && B5 <= 700.120463822871)     
60 if(clase == ciudad && B6 >= -142.297005085981 && B6 <= 877.069091105397)     
61 if(clase == ciudad && B7 >= -265.705393696662 && B7 <= 980.326751437784)     
62 if(clase == ciudad && B8 >= -271.625497638619 && B8 <= 994.733993409123)     
63 if(clase == ciudad && B11 >= -275.194784851293 && B11 <= 1023.04241196171)   
64 if(clase == ciudad && B12 >= -265.69211566644 && B12 <= 938.554807971462)    
65 if(clase == ciudad && DEM >= -146.12760665744 && DEM <= 239.865565257647)    
66 if(clase == ciudad && Slopes >= -114.30497848086 && Slopes <= 38.07245343193…
67 if(clase == agua && B2 >= 7.53202364318135 && B2 <= 133.563186522997)        
68 if(clase == agua && B3 >= -23.1924160561508 && B3 <= 261.480501208752)       
69 if(clase == agua && B4 >= -15.0142092967729 && B4 <= 197.09180243243)        
70 if(clase == agua && B5 >= -111.224500880692 && B5 <= 421.395066754484)       
71 if(clase == agua && B6 >= -413.543187668862 && B6 <= 854.76069608637)        
72 if(clase == agua && B7 >= -473.132828610313 && B7 <= 984.287819378207)       
73 if(clase == agua && B8 >= -513.758158180085 && B8 <= 1003.90730556794)       
74 if(clase == agua && B11 >= -249.051992276668 && B11 <= 542.732061788995)     
75 if(clase == agua && B12 >= -119.628121693813 && B12 <= 282.210157101655)     
76 if(clase == agua && DEM >= 30.6190768608236 && DEM <= 88.3662603825781)      
77 if(clase == agua && Slopes >= -0.87749829044026 && Slopes <= 8.0659371151480…
Guardando el resultado en un archivo para posterior edicion…
write_csv(filters, "/home/and/filters.csv")
Dependiendo del lenguaje los filtros se aplicarian diferente, en R por ejemplo seria algo asi en el caso de palma:
pixels_palma <- pixels |>
  filter(clase == "palma") |>
  filter( B2  >= 20.5494521483389 ) |> filter( B2  <= 132.250007432836 ) |>
  filter( B3  >= 59.8160268500471 ) |> filter( B3  <= 244.557852906764 ) |>
  filter( B4  >= 6.51254664707307 ) |> filter( B4  <= 211.069079112891 ) |>
  filter( B5  >= 107.896564432917 ) |> filter( B5  <= 430.800305641390 ) |>
  filter( B6  >= 347.754963005186 ) |> filter( B6  <= 1335.02594219635 ) |>
  filter( B7  >= 426.416355409537 ) |> filter( B7  <= 1726.08839577263 ) |>
  filter( B8  >= 437.351307295830 ) |> filter( B8  <= 1782.38442789895 ) |>
  filter( B11 >= 271.314089904972 ) |> filter( B11 <= 955.121847946863 ) |>
  filter( B12 >= 94.4585748588907 ) |> filter( B12 <= 489.368401047437 ) |>
  filter( DEM >= 51.6103100996285 ) |> filter( DEM <= 135.312184833945 ) |>
  filter( Slopes >= 0.519191552851886 ) |> filter(Slopes <= 7.8455831716636)

pixels_palma |> tally()
# A tibble: 1 × 1
      n
  <int>
1 13283
Al final deberian quedarnos 13283 registros de palma despues de aplicar el filtro.

Sin embargo hay un par de consideraciones:

(1) No deberiamos trabajar palma hasta entender que pasa con las dos coverturas que se distinguen en la visualizacion de sus firmas espectrales…

(2) Antes de aplicar estos filtros debemos limpiar valores negativos en las bandas y en el slope lo que seguramente afectara el promedio que utilice para cada caso y (muy seguramente) tendremos que repetir este analisis…

(3) Disculpen la ausencia total de acentos…