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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

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

Message 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.
Dernière modification par PhM le lun. 16/janv./2023 8:04, modifié 1 fois.
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

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

Message par SPH »

... tu vas avoir quelques problèmes car ton code est du HTML et pas du PB...

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

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

Message 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
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

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

Message 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.
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

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

Message par PhM »

Ok, merci, je regarde tout cela...
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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

Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

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

Message 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%
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

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

Message 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
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

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

Message 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:
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

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

Message 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 !)
Répondre