1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
|
Option Explicit
Public chemin As String
Public monraster_2 As String
Public chaine_gdalinfo As String
Public T As Double
Public L_Y As Variant
Public Function RoundUp(ByVal vvaleur As Variant, Optional ByVal iNbDecimal As Integer) As Variant
If Abs(iNbDecimal) < 5 Then RoundUp = -Int(-vvaleur * 10 ^ iNbDecimal) / 10 ^ iNbDecimal
End Function
Public Sub batch()
Dim Coordxmin As Long
Dim I As Long
Dim J As Long
Dim I2 As Long
Dim J2 As Long
Dim Pas As Long
Dim Pas_Y As Long
Dim Pas2 As Long
Dim Pas3 As Long
Dim CoordXvalid As Long
Dim CoordYvalid As Long
Dim Coordxmax As Long
Dim Coordymin As Long
Dim Coordymax As Long
Dim Gdalcy2 As Long
Dim Gdalcy1 As Long
Dim Gdalcx1 As Long
Dim Gdalcx2 As Long
Dim X As Integer
Dim Y As Integer
Dim T As Double
Dim L As Variant
Dim L_Y As Variant
Dim dossier As Object, Rep As Object
Dim chemin As String
Dim MonBatch As String
Dim Monbacth_info As String
Dim bat As String
Dim monraster_src As Object
Dim objFichier As Object
Dim objAppli As Object
Dim descrFichier As String
Dim monraster As String
'Dim monraster_2 As String
'Dim chaine_gdalinfo As String
Dim NomFic As String, Chaine As String, Chaine2 As String, Chaine3 As String, chaine4 As String
Dim bat_sans_bat As String
Dim nom_dossier As String
Dim nom_dossier_txt As String
Dim gdal_acces As String
Dim gdal As String
Dim metadonnees As String
Dim laligne
Dim position_pixel As Long
Dim newHour As Variant
Dim newMinute As Variant
Dim newSecond As Variant
Dim waitTime As Variant
Dim OuvrFich
'fonction GDAL
Const Gdalinfo As String = "gdalinfo"
Const Gdal_translate As String = "gdal_translate -of GTiff -srcwin "
'taille du pixel en mètre fournit par GDALINFO
'coordo en pixel des coins nord ouest et sud est
'Coordxmin = 530
Coordxmin = Range("A2")
'Coordxmax = 13496
Coordxmax = Range("B2")
'Coordymin = 551
Coordymin = Range("C2")
'Coordymax = 9400
Coordymax = Range("D2")
'calcul du pas pour en pixel
'Pas = (L / T)
'T = 5.805
'T = Range("E2")
'pas terrain que l'on souhaite avoir pour découpage en mètre
'L = 10000
L = Range("E2")
L_Y = Range("F2")
I = 0
J = 0
'calcul du nombre d'itérations nécessaires pour les calculs en appliquant la focntion d'arrondi supérieur
'X = RoundUp((Coordxmax - Coordxmin) / Pas - 1)
'Y = RoundUp((Coordymax - Coordymin) / Pas - 1)
'Initialisation de tous les paramètres, afin de compléter le fichier batch
'Active l'appli shell pour lancer l'ouverture du répertoire
Set dossier = CreateObject("Shell.Application")
'Ouvre la boîte de dialogue "sélection d'un répertoire"
Set Rep = dossier.BrowseForFolder(&H0&, "Sélectionner un répertoire", &H1&)
'Si le chemin est vide, alors prend le chemin que l'on donne
If Not Rep Is Nothing Then
Set Rep = Rep.items.Item
chemin = Rep.Path
End If
'saisir le nom du fichier batch que l'on va mettre dans le répertoire choisit précédemment
MonBatch = InputBox("Saisir le nom du Fichier batch TRANSLATE")
Monbacth_info = InputBox("saisir le nom du batch pour GDALINFO")
'concatenation du chemin d'accès
bat = chemin & "\" & MonBatch
'retire au chemin d'accès l'extention du fichier .bat
bat_sans_bat = Left(bat, Len(bat) - 4)
OuvrFich = Application _
.GetOpenFilename("Files (*.*), *.*")
If OuvrFich <> False Then
MsgBox "Fichier sélectionner = " & OuvrFich
End If
'Active l'appli shell pour lancer l'ouverture du répertoire source des données raster
'set monraster_src = CreateObject("Shell.Application")
'Ouverture de la boîte de dialogue pour sélectionner le fichier voulu
'Set objFichier = monraster_src.BrowseForFolder(&H0&, "Veuillez indiquer le chemin d'accès au fichier " & descrFichier & " à importer", &H4000&)
monraster = chemin & "\" & OuvrFich
monraster_2 = chemin & "\" & Monbacth_info
gdal = "C:\soft\FWTOOL~1.2\bin"
Open monraster_2 For Output As #1
gdal_acces = "cd" & " " & gdal
chaine_gdalinfo = Gdalinfo & " " & monraster & " " & ">" & " " & monraster & ".txt"
Print #1, gdal_acces
Print #1, chaine_gdalinfo
Close #1
'nom_dossier = "C:\soft\FWTools2.1.1\setfw.bat"
'execute le batch qui créer le fichier texte relatif aux metadonnées
Shell "cmd.exe /c" & monraster_2, vbNormalFocus
'si on veut supprimer le fichier batch, employer un kill apres execution
metadonnees = monraster & ".txt"
'temporisation de 2 secondes entre la création du fichier txt et la recherche de la valeur du pixel
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 5
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime
Open metadonnees For Input As #1
Do While Not EOF(1)
Line Input #1, laligne
position_pixel = InStr(1, laligne, "Pixel Size = (", vbTextCompare)
If position_pixel > 0 Then
T = Mid(laligne, position_pixel + 14, 7)
MsgBox "Taille du pixel de l'image = " & T
Exit Do
End If
Loop
'Print #1, T
Close #1
'calcul du pas pour en pixel
Pas = (L / T)
Pas_Y = (L_Y / T)
'calcul du nombre d'itérations nécessaires pour les calculs en appliquant la focntion d'arrondi supérieur
X = RoundUp((Coordxmax - Coordxmin) / Pas - 1)
Y = RoundUp((Coordymax - Coordymin) / Pas_Y - 1)
'lance la commande pour créer et remplir le fichier batch
Open bat For Output As #1
'Boucle sur les lignes et colonnes de l'image
For I = 0 To X
For J = 0 To Y
gdal_acces = "cd" & " " & gdal
NomFic = bat_sans_bat & "_" & I & "_" & J & "ok.tif"
'NomFic = Chemin & "\" & MonBatch & "_" & I & "_" & J & "ok.tif"
'NomFic = "c:/temp/7349/7349" & "_" & I & "_" & J & "ok.tif"
'calcul de la nouvelle coordonnée de départ en X
Gdalcx1 = Coordxmin + I * Pas
'calcul de la nouvelle coordonnée de départ pour Y
Gdalcy1 = Coordymin + J * Pas_Y
I2 = Gdalcx1 + Pas
J2 = Gdalcy1 + Pas_Y
'Condition d'itération, si la valeur de la coord X maximale est supérieure à l'emprise de l'image
'il faut appliquer un nouveau Pas de calcul, inférieur au pas général. Il faut l'appliquer dans
'la chaine de concaténation de la formule
If I2 > Coordxmax Then
NomFic = bat_sans_bat & "_" & I2 & "_" & J2 & "ok.tif"
'NomFic = Chemin & "\" & MonBatch & "_" & I2 & "_" & J2 & "ok.tif"
'NomFic = "c:/temp/7349/7349" & "_" & I2 & "_" & J2 & "ok.tif"
CoordXvalid = I2 - Pas
Pas2 = Coordxmax - CoordXvalid
Chaine2 = Gdal_translate & " " & Gdalcx1 & " " & Gdalcy1 & " " & Pas2 & " " & Pas & " " & "-co compress=lzw" & " " & monraster & " " & NomFic
'Condition d'itération, si la valeur de la coord Y maximale est supérieure à l'emprise de l'image
'il faut appliquer un nouveau Pas de calcul, inférieur au pas général. Il faut l'appliquer dans
'la chaine de concaténation de la formule
ElseIf J2 > Coordymax Then
CoordYvalid = J2 - Pas_Y
Pas3 = Coordymax - CoordYvalid
Chaine3 = Gdal_translate & " " & Gdalcx1 & " " & Gdalcy1 & " " & Pas & " " & Pas3 & " " & "-co compress=lzw" & " " & monraster & " " & NomFic
End If
'Il ne faut pas oublier le cas, où X et Y sont hors de l'emprise (le coin sud-est), c'est pourquoi
'il faut spécifier qu'à la fois I2 et J2 sont supérieurs aux max X et Y
'C'est pourquoi, il est nécessaire d'appliquer le Pas de X inférieur au pas normal et le pas de Y inférieur au pas normal
If I2 > Coordxmax And J2 > Coordymax Then
chaine4 = Gdal_translate & " " & Gdalcx1 & " " & Gdalcy1 & " " & Pas2 & " " & Pas3 & " " & "-co compress=lzw" & " " & monraster & " " & NomFic
End If
'Condition si, la coordo de départ est hors "cadre" alors il faut que la chaine soit vide, c'est-à-dire non utilisée
Select Case Gdalcx1 + Pas > Coordxmax
Case Gdalcy1 + Pas_Y > Coordymax
Chaine = Gdal_translate & " " & Gdalcx1 & " " & Gdalcy1 & " " & Pas & " " & Pas_Y & " " & "-co compress=lzw" & " " & monraster & " " & NomFic
Case Else
Chaine = ""
End Select
'applique dans le batch les différentes chaines de calcul GDAL
Print #1, gdal_acces
Print #1, Chaine
Print #1, Chaine2
Print #1, Chaine3
Print #1, chaine4
'fin des boucles
Next J
Next I
'ferme le fichier batch
Close #1
'execute le batch qui découpe l'image
Shell "cmd.exe /c" & bat, vbNormalFocus
End Sub |