Page 1 sur 1

[RESOLU]Enregistrer l'image d'une requete leaflet/openstreetmap

Publié : ven. 13/janv./2023 5:50
par PhM
Bonjour,
Je prépare un (autre) programme destiné à la simulation de vol.
Actuellement, je butte sur sur l'action de pouvoir enregistrer l'image que PB génère avec un code html comme, par exemple, celui-ci :

Code : Tout sélectionner

<!DOCTYPE html>
<html>
   <head>
      <title>LFMT</title>
      <link rel = "stylesheet" href = "http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css"/>
      <script src = "http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
   </head>
   
   <body>
      <div id = "map" style = "width: 256px; height: 256px"></div>
      <script>
         // Créer la carte
         var mapOptions = {
            center: [43.5762, 3.96325],
            zoom: 13
         }
         // Créer un objet cartographique
         var map = L.map('map', mapOptions);
         
         // Création d'un objet Calque
         var layer = new L.TileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
		 
         // Ajouter une couche à la carte
         map.addLayer(layer);
         
         // Création des pistes
         var latlang = [
            [[43.5727, 3.98225], [43.5861, 3.95574]],
			[[43.5702, 3.96311], [43.5758, 3.95189]]
         ];
         
         // Création d'options de polyline
         var multiPolyLineOptions = {color:'black', weight:8};
         
         // Création de polylignes multiples
         var Pistes = L.multiPolyline(latlang , multiPolyLineOptions);
         
         // Ajout de multi polylignes à la carte
         Pistes.addTo(map);
      </script>
   </body>
   
</html>

Donc, le serveur me renvoi la carte sur mon navigateur (RunProgram) mais, comment enregistrer (convertir) cette carte affichée en une image enregistrée comme telle, en png, par exemple ?

Et, je ne souhaite pas, pendant ce processus, voir mon navigateur ouvrir cette carte ! Je voudrai simplement l'enregistrer pour l'utiliser ensuite.

J'ai lu les anciens posts sur ce sujet, qui, pour la plupart, ne fonctionnent plus avec les versions actuelles de leaflet/openstreetmap.

Re: Enregistrer l'image d'une requete leaflet/openstreetmap

Publié : ven. 13/janv./2023 9:24
par SPH
... tu vas avoir quelques problèmes car ton code est du HTML et pas du PB...

Re: Enregistrer l'image d'une requete leaflet/openstreetmap

Publié : ven. 13/janv./2023 9:47
par PhM
Oui, je sais et j'ai du mal m'expliqué.

En plus synthétique :

Je souhaite enregistrer l'image visible générée sur cette page html

Re: Enregistrer l'image d'une requete leaflet/openstreetmap

Publié : ven. 13/janv./2023 10:23
par Mesa
Je pense que tu pourrais t'inspirer de PBMap de djes qui marche bien:
https://github.com/djes/PBMap
viewtopic.php?f=3&t=16160


M.

Re: Enregistrer l'image d'une requete leaflet/openstreetmap

Publié : ven. 13/janv./2023 10:35
par PhM
Ok, merci, je regarde tout cela...

Re: Enregistrer l'image d'une requete leaflet/openstreetmap

Publié : ven. 13/janv./2023 13:30
par falsam
La difficulté est de récupérer uniquement la portion d'image qui t'intéresse et non pas la totalité de l'image qui est énorme :wink:

Re: Enregistrer l'image d'une requete leaflet/openstreetmap

Publié : ven. 13/janv./2023 14:12
par falsam
Ce n'est peut être pas la solution finale mais c'est un bon début.

Ce code de RASHAD et Kiffi (forum anglophone) permet de sauvegarder le résultat d'une url dans une image sans passer par un navigateur.

Tu saisis l'url de ton site puis tu cliques sur le bouton capture. Le résultat sera sauvegardé au format png dans le dossier téléchargement.

Code : Tout sélectionner

; Author RASHAD  & Kiffi (2013)

UsePNGImageEncoder()

Global sURL.s,imgn

Enumeration
  #WinSnapShot
  #WebSnapShot
EndEnumeration

#DVASPECT_CONTENT  = 1
#DVASPECT_THUMBNAIL = 2
#DVASPECT_ICON = 4
#DVASPECT_DOCPRINT = 8


Procedure CaptureWebPage(URL$, WBWidth.i, WBHeight.i, Filename.s)
  ;----------------------------------------------------------------
  
  Define.IWebBrowser2   m_pWebBrowser
  
  Define.IHTMLDocument2 pDocument
  Define.IHTMLDocument3 pDocument3
  Define.IHTMLElement   pElement
  Define.IHTMLElement2  pElement2
  Define.iDispatch      pDispatch
  Define.IViewObject2   pViewObject
  
  Define.i bodyHeight
  Define.i bodyWidth
  Define.i rootHeight
  Define.i rootWidth
  
  Define.RECT rcBounds
  
  Define.i bolFlag
  Define.i IsBusy
  Define.i hr
  
  bolFlag = #False
  
  If OpenWindow(#WinSnapShot, 0, 0, 0, 0, "", #PB_Window_Invisible | #PB_Window_BorderLess)
    
    WebGadget(#WebSnapShot, 0, 0, 0, 0, URL$)
    
    Repeat
      If GetGadgetAttribute(#WebSnapShot, #PB_Web_Busy) = 0
        Break
      EndIf
      
      While WindowEvent(): Delay(1) : Wend
    ForEver
    
    m_pWebBrowser = GetWindowLongPtr_(GadgetID(#WebSnapShot), #GWL_USERDATA)
    
    hr = m_pWebBrowser\get_document(@pDispatch)
    If hr = #S_OK
      
      If pDispatch
        
        hr = pDispatch\QueryInterface(?IID_IHTMLDocument2, @pDocument)
        If hr = #S_OK
          
          If pDocument
            
            hr = pDocument\get_body(@pElement)
            If hr = #S_OK
              If pElement
                
                hr = pElement\QueryInterface(?IID_IHTMLElement2, @pElement2)
                If hr = #S_OK
                  If pElement2
                    
                    hr = pElement2\get_scrollHeight(@bodyHeight)
                    If hr = #S_OK
                      ;Debug "bodyHeight: " + Str(bodyHeight)
                      
                      hr = pElement2\get_scrollWidth(@bodyWidth)
                      If hr = #S_OK
                        ;Debug "bodyWidth: " + Str(bodyWidth)
                        
                        hr = pDispatch\QueryInterface(?IID_IHTMLDocument3, @pDocument3)
                        If hr = #S_OK
                          
                          If pDocument3
                            
                            hr = pDocument3\get_documentElement(@pElement)
                            If hr <> #S_OK : ProcedureReturn #False : EndIf
                            
                            hr = pElement\QueryInterface(?IID_IHTMLElement2, @pElement2)
                            If hr <> #S_OK : ProcedureReturn #False : EndIf
                            
                            hr = pElement2\get_scrollHeight(@rootHeight)
                            If hr <> #S_OK : ProcedureReturn #False : EndIf
                            ;Debug "rootHeight: " + Str(rootHeight)
                            
                            hr = pElement2\get_scrollWidth(@rootWidth)
                            If hr <> #S_OK : ProcedureReturn #False : EndIf
                            ;Debug "rootWidth: " + Str(rootWidth)
                            
                            Define.i width
                            Define.i height
                            width = bodyWidth
                            If rootWidth > bodyWidth : width = rootWidth : EndIf
                            
                            height = bodyHeight
                            If rootHeight > bodyHeight : height = rootHeight : EndIf
                            
                            width + 22
                            
                            ResizeGadget(#WebSnapShot, 0, 0, width, height)
                            
                            hr = m_pWebBrowser\QueryInterface(?IID_IViewObject2, @pViewObject)
                            
                            If hr = #S_OK
                              
                              If pViewObject
                                
                                Define.i hdcMain
                                
                                hdcMain = GetDC_(0)
                                If hdcMain
                                  
                                  Define.i hdcMem
                                  
                                  hdcMem  = CreateCompatibleDC_(hdcMain)
                                  If hdcMem
                                    
                                    Define.i hBitmap
                                    
                                    hBitmap = CreateCompatibleBitmap_(hdcMain, width, height)
                                    If hBitmap
                                      
                                      Define.i oldImage
                                      
                                      oldImage = SelectObject_(hdcMem, hBitmap)
                                      
                                      rcBounds\top = 0
                                      rcBounds\left = 0
                                      rcBounds\right = width
                                      rcBounds\bottom = height
                                      
                                      pViewObject\Draw(#DVASPECT_CONTENT, -1, 0, 0, hdcMain, hdcMem, rcBounds, 0, 0, 0)
                                      
                                      Define.i Image
                                      
                                      Image = CreateImage(#PB_Any, width, height)
                                      If Image
                                        
                                        Define.i img_hDC
                                        
                                        img_hDC = StartDrawing(ImageOutput(Image))
                                        If img_hDC
                                          
                                          BitBlt_(img_hDC, 0, 0, width, height, hdcMem, 0, 0, #SRCCOPY)
                                          StopDrawing()
                                          
                                          SaveImage(Image,Filename,#PB_ImagePlugin_PNG)
                                          bolFlag = #True
                                          
                                        EndIf ; img_hDC
                                        
                                        FreeImage(Image)
                                        
                                      EndIf ; Image
                                      
                                      SelectObject_(hdcMem, oldImage)
                                      
                                    EndIf ; hBitmap
                                    
                                    DeleteDC_(hdcMem)
                                    
                                  EndIf ; hdcMem
                                  
                                  ReleaseDC_(0, hdcMain)
                                  
                                EndIf ; hdcMain
                                
                                pViewObject\Release()
                                
                              EndIf ; pViewObject
                            EndIf   ; HR
                            
                            pDocument3\Release()
                            
                          EndIf ; pDocument3
                          
                        EndIf ; HR
                        
                      EndIf ; HR
                      
                    EndIf ; HR
                    
                    pElement2\Release()
                    
                  EndIf ; pElement2
                  
                EndIf ; HR
                
                pElement\Release()
                
              EndIf ; pElement
              
            EndIf ; HR
            
            pDocument\Release()
            
          EndIf ; pDocument
          
        EndIf ; HR
        
        pDispatch\Release()
        
      EndIf ; pDispatch
      
    EndIf ; HR
    
    CloseWindow(#WinSnapShot)
    
  EndIf
  
  ProcedureReturn bolFlag
  
EndProcedure

Procedure Snapshot()
  ;-------------------
  
  ;Define sURL.s
  Define sFileOut.s
  Define sNow.s
  
  
  ExamineDesktops()
  sFileOut = GetUserDirectory(#PB_Directory_Downloads)+"web_image_"+Str(imgn)+".png"
  imgn+1
  If CaptureWebPage(sURL, DesktopWidth(0), DesktopHeight(0), sFileOut)
    
  Else
    MessageRequester("Web Page", "Capture Failed")
  EndIf
  
EndProcedure

;Snapshot()
LoadFont(0,"Broadway",24)

OpenWindow(10,0,0,400,80,"Capture Web",#PB_Window_SystemMenu |#PB_Window_ScreenCentered)
StickyWindow(10,1)
StringGadget(20,10,10,380,24,"")
ButtonGadget(30,10,50,60,24,"Capture")
TextGadget(40,140,50,80,40,"")
SetGadgetFont(40,0)
SetGadgetColor(40,#PB_Gadget_FrontColor,#Red)


Repeat
  Select WaitWindowEvent()
      
    Case #PB_Event_CloseWindow
      Quit = 1
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 30
          SetGadgetText(40,"")
          sURL.s = GetGadgetText(20)
          If sURL.s
            Snapshot()
          EndIf
          SetGadgetText(20,"")
          SetGadgetText(40,"FINISHED")
          
      EndSelect          
      
  EndSelect 
  
Until Quit = 1
End

End


DataSection
  
  IID_IHTMLDocument2:
  ;332C4425-26CB-11D0-B483-00C04FD90119
  Data.i $332C4425
  Data.w $26CB, $11D0
  Data.b $B4, $83, $00, $C0, $4F, $D9, $01, $19
  
  IID_IHTMLDocument3:
  ;3050F485-98B5-11CF-BB82-00AA00BDCE0B
  Data.i $3050F485
  Data.w $98B5, $11CF
  Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
  
  IID_IHTMLElement2:
  ;3050f434-98b5-11cf-bb82-00aa00bdce0b
  Data.i $3050F434
  Data.w $98B5, $11CF
  Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
  
  IID_IViewObject2:
  ;00000127-0000-0000-c000-000000000046
  Data.i $00000127
  Data.w $0000, $0000
  Data.b $C0, $00, $00, $00, $00, $00, $00, $46
  
  
EndDataSection


Re: Enregistrer l'image d'une requete leaflet/openstreetmap

Publié : ven. 13/janv./2023 15:56
par PhM
Merci Falsam pour cette nouvelle piste car, comme tu le pensais la piste PBMap n'est pas du tout adaptée...
Je vais donc voir avec ce code.

Sinon, es-tu le Falsam de Pilote-Virtuel, entre autres ?

Car, dans ce cas, je suis Philippe de Pilote-Virtuel qui a conçu quelques soft mis à disposition comme CARTOVAC ou encore CARTO+.

Le soft sur lequel je travaille permettra de surveiller l'arrivée à destination avec tous les paramètres de la météo, y compris un bulletin météo transcrit du METAR brut et le sens du vent reporté graphiquement sur les pistes et donc une carte en situation de l'aéroport (objet de ce post). Tout cela sera en temps réel avec un rafraichissement automatique des données.

Il s'appellera LANDING et il est réalisé à 75%

Re: [RESOLU]Enregistrer l'image d'une requete leaflet/openstreetmap

Publié : lun. 16/janv./2023 8:08
par PhM
Je considère que la question est résolue car, j'ai changé d'approche.

Au lieu d'essayer de créer une image à partir d'un fichier html préalablement construit en local, je crée un WebGadget minimal qui viendra s'insérer dans une autre fenêtre du programme et affichera ce fichier html.

If OpenWindow(0,0,0,fenetre,fenetre,"WebGadget", #PB_Window_ScreenCentered | #PB_Window_BorderLess)
WebGadget(0,0,0,fenetre,fenetre,"file://" + "chemin d'accès" + "LFMT.html")
EndIf

Re: [RESOLU]Enregistrer l'image d'une requete leaflet/openstreetmap

Publié : lun. 16/janv./2023 8:38
par Marc56
Si c'est une image créée par le serveur, alors il te suffit de charger la source de la page (HTTPRequest(...)) puis extraire le lien de l'image (<img src=" ... /img>) puis faire une deuxième requête pour l'image seule.
Si l'image est modifiée par le navigateur (javascript) alors cela ne fonctionne pas.
:wink:

Re: [RESOLU]Enregistrer l'image d'une requete leaflet/openstreetmap

Publié : lun. 16/janv./2023 9:23
par PhM
Oui, mais il ne s'agit pas d'une image présente sur un serveur https, cette image est créée, en local, par la construction d'un page html sur le disque local.

Je ne pense pas pouvoir, dans ce cas, la transformer en image (ce qui est ma question depuis le début de ce post !)