Bonjour,
J'utilise depuis quelques temps l'excellent tuto http://qwazerty.developpez.com/tutor...-et-vba-excel/ fait par http://www.developpez.net/forums/u723/qwazerty/.
Néanmoins, je me heurte à un problème bien spécifique.
Je cherche à automatiser l'enregistrement d'images PNG.
Ces images PNG décrivent le couvert forestier d'un département et je cherche, dans un cadre privé, à avoir la possibilité de reconstituer avec précision la couverture globale d'un département.
Ainsi donc à l'adresse http://inventaire-forestier.ign.fr/c...ficherCarto/58 un visuel est disponible.
En utilisant l'inspection d'éléments sous Chrome ou autres, j'ai pu remarquer rapidement que la requête
http://inventaire-forestier.ign.fr/cartov2/proxy/getTile?LAYERS=v58tf&TRANSPARENT=true&VISIBILITY=true&FORMAT=image%2FPNG&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A27572&BBOX=666938.372965495,2193033.3729654946,711035.57137523,2237130.57137523&WIDTH=1000&HEIGHT=1000
permettait d'atteindre une image spécifique.
En jouant avec les bornes X/Y de la zone, en coordonnées Lambert 2 étendu, ainsi qu'avec les valeurs de BBOX, il était possible de cibler une zone bien défini et d'obtenir une image précise du couvert forestier sur celle-ci.
La requête n'est utilisable que si la fenêtre de visualisation à l'adresse http://inventaire-forestier.ign.fr/c...ficherCarto/58 est ouverte.
Je pressens l'utilisation de cookies.
Initialement, je pensais m'en sortir rapidement en utilisant la méthode décrite au point IV-J. Télécharger un fichier du tuto.
L'analyse de la page web affichée suite à la requête
http://inventaire-forestier.ign.fr/cartov2/proxy/getTile?LAYERS=v58tf&TRANSPARENT=true&VISIBILITY=true&FORMAT=image%2FPNG&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A27572&BBOX=666938.372965495,2193033.3729654946,711035.57137523,2237130.57137523&WIDTH=1000&HEIGHT=1000
donne:
1 2 3 4 5 6 7 8
| <html>
<head>
<meta name="viewport" content="width=device-width, minimum-scale=0.1"><title>getTile (1000×1000)</title>
</head>
<body style="margin: 0px;">
<img style="-webkit-user-select: none; cursor: zoom-in;" src="http://inventaire-forestier.ign.fr/cartov2/proxy/getTile?LAYERS=v58tf&TRANSPARENT=true&VISIBILITY=true&FORMAT=image%2FPNG&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A27572&BBOX=666938.372965495,2193033.3729654946,711035.57137523,2237130.57137523&WIDTH=1000&HEIGHT=1000" width="939" height="939">
</body>
</html> |
Or, aucune image n'est décrite dans le src. L'adaptation de la macro décrite dans le tuto permet bien de charger l'adresse et afficher l'image dans une fenêtre IE mais ImgElem reste désespérément vide et WinHttpReq.Status renvoie un code 404 "Not found".
Ci joint la bidouille de code qui demande de charger, avant d’exécuter la macro, dans une fenêtre IE le visualisateur à l'adresse http://inventaire-forestier.ign.fr/c...ficherCarto/58:
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
| Sub ImageSite()
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Dim TableObj As HTMLGenericElement
Dim htmlTagCol As IHTMLElementCollection
Dim ImgElem As HTMLImg
Const CheminRep As String = "E:\#GIS\Shapefiles\Inventaire forestier IGN\Extraction IFN V2\Essai automatisation excel\essai\"
'Ouvre la page Web
IE.navigate "http://inventaire-forestier.ign.fr/cartov2/proxy/getTile?LAYERS=v58tf&TRANSPARENT=true&VISIBILITY=true&FORMAT=image%2FPNG&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A27572&BBOX=640480,2281227,642480,2283227&WIDTH=1000&HEIGHT=1000"
IE.Visible = True
WaitIE IE
Set IEDoc = IE.document
'On recherche l'élément contenant le logo
Set htmlTagCol = IEDoc.getElementsByTagName("img")
For Each TableObj In htmlTagCol
Set ImgElem = TableObj
Next
'On crée le répertoire où sera placée l'image
'Si celui-ci existe déjà on ne gère pas l'erreur retournée et on passe à la suite
On Error Resume Next
MkDir CheminRep
On Error GoTo 0 'On réactive la gestion d'erreur
'On passe le chemin de l'image et le répertoire où elle sera copiée
SaveHtmlFile ImgElem.href, CheminRep & "essai.png"
End Sub
Sub SaveHtmlFile(aUrl As String, aDestination As String)
'Pris sur le forum de la msdn (avec quelques menues modifs)
'http://social.msdn.microsoft.com/Forums/en/isvvba/thread/bd0ee306-7bb5-4ce4-8341-edd9475f84ad
Dim WinHttpReq As Object, oStream As Object
Dim TheURL As String
On Error Resume Next 'On ne gère pas les erreurs
Set WinHttpReq = New WinHttp.WinHttpRequest 'CreateObject("Microsoft.XMLHTTP")
WinHttpReq.Open "GET", aUrl, False
WinHttpReq.send
TheURL = WinHttpReq.responseBody
If WinHttpReq.Status = 200 Then
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1
oStream.Write WinHttpReq.responseBody
oStream.SaveToFile aDestination
oStream.Close
End If
End Sub
Sub WaitIE(IE As InternetExplorer)
'On boucle tant que la page n'est pas totalement chargée
Do Until IE.readyState = READYSTATE_COMPLETE
DoEvents
Loop
End Sub |
Qu'en pensez-vous ? Auriez-vous une idée ou une piste permettant de résoudre ce problème ?
Merci,
Michel
Partager