begin process at 2012 02 11 22:24:03
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > PILOTER GOOGLEEARTH AVEC SES API

PILOTER GOOGLEEARTH AVEC SES API


 Information sur la source

Note :
Aucune note
Catégorie :API Classé sous :api, googleearth, google, earth Niveau :Débutant Date de création :23/10/2006 Date de mise à jour :10/05/2007 17:36:08 Vu / téléchargé :22 082 / 1 382

Auteur : cuq

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Petit code sans prétention montrant par une utilisation très simple le controle de GoogleEarth via ses API.

Deux petits exemples pour charger des données KML soit via la fonction LoadKmlData ou OpenKMLFile. Deux de déplacement et récupération de coordonnées. Et deux exemple de sélection de feature. Enfin deux "Bidouilles" pour sauver un fichier KML à partir d'un feature ou supprimer un feature.

Le Zip contient uniquement le fichier KML Exemple.

Pour les Grand débutant : pour que la source fonctionne ne pas oublié de rajouter dans Projet / Références /  "Earth 1.0 type library" Voir copie écran.


Source

  • 'A mettre dans une Feuille avec 8 boutons
  • Option explicit
  • 'Exemple de chargement de données KML dans googleEarth
  • Private Sub Command1_Click()
  • Dim GEI As ApplicationGE
  • Dim Fichier As String
  • Set GEI = CreateObject("GoogleEarth.ApplicationGE")
  • 'Attente que GoogleEarth soit initialisé
  • While (GEI.IsInitialized = 0)
  • DoEvents
  • Wend
  • Fichier = App.Path & "\Genève.kml"
  • Call GEI.OpenKmlFile(Fichier, 1) ' 1= pas de message dans GoogleEarth si le fichier n'existe pas par exemple
  • End Sub
  • Private Sub Command2_Click()
  • Dim GEI As ApplicationGE
  • Dim KMLData As String
  • Set GEI = CreateObject("GoogleEarth.ApplicationGE")
  • 'Attente que GoogleEarth soit initialisé
  • While (GEI.IsInitialized = 0)
  • DoEvents
  • Wend
  • 'Initialisation données KML
  • KMLData = "<?xml version=""1.0"" encoding=""UTF-8""?>" & _
  • "<kml xmlns=""http://earth.google.com/kml/2.1"">" & _
  • "<Placemark>" & _
  • "<name>Geneva</name>" & _
  • "<LookAt>" & _
  • "<longitude>6.156182706892176</longitude>" & _
  • "<latitude>46.20746317320977</latitude>" & _
  • "<altitude>0</altitude>" & _
  • "<range>316.3662914479763</range>" & _
  • "<tilt>0</tilt>" & _
  • "<heading>6.199453434125936</heading>" & _
  • "</LookAt>" & _
  • "<Point>" & _
  • "<coordinates>6.156019183879536,46.20743386584116,0</coordinates>" & _
  • "</Point>" & _
  • "</Placemark>" & _
  • "</kml>"
  • 'Chargement données dans GE
  • GEI.LoadKmlData KMLData
  • End Sub
  • 'Exemple de récupération de coordonnées de point et d'altitude
  • Private Sub Command3_Click()
  • Dim GEI As ApplicationGE
  • Dim PointOnTerrain() As Double
  • Dim PositionCherché(2) As Double
  • Dim Repeat As Integer
  • Dim Epsilon As Double
  • Dim LongDiff As Double
  • Dim LatDiff As Double
  • 'Initialisation
  • Epsilon = 0.0005
  • 'Coordonnées du mont Blanc
  • PositionCherché(0) = 45.8325541
  • PositionCherché(1) = 6.86437217
  • Set GEI = CreateObject("GoogleEarth.ApplicationGE")
  • 'Attente que GoogleEarth soit initialisé
  • While (GEI.IsInitialized = 0)
  • DoEvents
  • Wend
  • 'Fixe le mode Elevation à 1 ( Activation relief)
  • GEI.ElevationExaggeration = 1 'Si différent de 0, alors coords[2] est fixée à la vraie altitude du terrain.
  • 'Récupération de données de point centre écran les
  • Do
  • 'Positionne la caméra sur le Mont Blanc (La vitesse est fixé à 5 = Maxi donc pas d'effet de transition
  • Call GEI.SetCameraParams(PositionCherché(0), PositionCherché(1), 0, RelativeToGroundAltitudeGE, 100, 0, 0, 5)
  • PointOnTerrain = GEI.GetPointOnTerrainFromScreenCoords(0, 0)
  • 'Attente que le processus de striming soit terminé sur la zone concerné
  • While (GEI.StreamingProgressPercentage < 100)
  • DoEvents
  • Wend
  • LongDiff = Abs(PositionCherché(1) - PointOnTerrain(1))
  • LatDiff = Abs(PositionCherché(0) - PointOnTerrain(0))
  • Repeat = Repeat + 1
  • 'Controle que la position est bien celle demandée. Repeeat permet déviter de blocquer la procédure
  • 'avec une limite à 100 itérations
  • Loop While (LongDiff > Epsilon Or LatDiff > Epsilon Or PointOnTerrain(2) < 0) And Repeat < 100
  • MsgBox "Altitude Mont Blanc dans GoogleEarth " & PointOnTerrain(2)
  • End Sub
  • 'Affiche la position courante d'un repère présent dans GE
  • Private Sub Command4_Click()
  • Dim GEI As ApplicationGE
  • Dim Feat As FeatureGE
  • Dim Child As FeatureCollectionGE
  • Dim CameraInfo As CameraInfoGE
  • Set GEI = CreateObject("GoogleEarth.ApplicationGE")
  • 'Attente que GoogleEarth soit initialisé
  • While (GEI.IsInitialized = 0)
  • DoEvents
  • Wend
  • ' Charge la position default. Cette fonction permet de récupérer les infos en donnant le nom du repère
  • Set Feat = GEI.GetFeatureByName("default")
  • 'Set Child = Feat.GetChildren
  • 'Debug.Print Child.Count
  • 'Si elle a une vue on y va
  • If Feat.HasView Then
  • Call GEI.SetFeatureView(Feat, 5)
  • End If
  • 'Retourne la position courant
  • Set CameraInfo = GEI.GetCamera(1)
  • MsgBox "Latitude=" & CameraInfo.FocusPointLatitude & " Longitude=" & CameraInfo.FocusPointLongitude
  • End Sub
  • 'fonction pour récupérér un feature GE depuis la base de données primaire
  • Private Sub Command5_Click()
  • Dim Indice As Long
  • Dim GEI As ApplicationGE
  • Dim Feat As FeatureGE
  • Dim Child As FeatureCollectionGE
  • Dim CameraInfo As CameraInfoGE
  • Set GEI = CreateObject("GoogleEarth.ApplicationGE")
  • 'Attente que GoogleEarth soit initialisé
  • While (GEI.IsInitialized = 0)
  • DoEvents
  • Wend
  • 'Racine du layersdatabase
  • 'Récupère les enfants
  • Set Child = GEI.GetLayersDatabases.Item(1).GetChildren
  • For Indice = 1 To Child.Count
  • 'Si elle a une vue et si c'est bien ce qui m'intéresse on y va
  • If Child.Item(Indice).HasView And InStr(Child.Item(Indice).Name, "Élection présidentielle France 2007") Then
  • Call GEI.SetFeatureView(Child.Item(Indice), 5)
  • End If
  • Next Indice
  • End Sub
  • 'fonction pour récupérer un feature GE depuis son nom
  • Private Sub Command6_Click()
  • Dim Indice As Long
  • Dim GEI As ApplicationGE
  • Dim Feat As FeatureGE
  • Dim Child As FeatureCollectionGE
  • Dim CameraInfo As CameraInfoGE
  • Set GEI = CreateObject("GoogleEarth.ApplicationGE")
  • 'Attente que GoogleEarth soit initialisé
  • While (GEI.IsInitialized = 0)
  • DoEvents
  • Wend
  • 'Récupère les enfants du feature "Geneva" selon exemple
  • Set Feat = GEI.GetFeatureByName("Geneva")
  • Call Feat.Highlight
  • Call GEI.SetFeatureView(Feat, 5)
  • Set Child = Feat.GetChildren
  • For Indice = 1 To Child.Count
  • 'Si elle a une vue et si c'est bien ce qui m'intéresse on y va
  • Debug.Print Child.Item(Indice).Name
  • 'Rend visible le Feature
  • Child.Item(Indice).Visibility = True
  • ' Se déplace sur le feature
  • Call GEI.SetFeatureView(Child.Item(Indice), 1)
  • Call Sleep(1000)
  • 'Attente que le processus de striming soit terminé sur la zone concerné
  • While (GEI.StreamingProgressPercentage < 100)
  • DoEvents
  • Wend
  • Call Child.Item(Indice).Highlight
  • Next Indice
  • End Sub
  • 'Fonction pour sauver le feature sous un format KML
  • Private Sub Command7_Click()
  • SauverFeature "Geneva", "C:\tmp\test"
  • End Sub
  • Private Sub Command8_Click()
  • DeleteFeature "Geneva"
  • End Sub
  • '------------------------------------------------
  • ' CODE A RAJOUTER DANS UN MODULE
  • '------------------------------------------------
  • Option Explicit
  • Const HWND_TOPMOST = -1&
  • Const HWND_NOTOPMOST = -2&
  • Const HWND_TOP = 0
  • Const SWP_NOSIZE = &H1&
  • Const SWP_NOMOVE = &H2&
  • Const SWP_NOACTIVATE = &H10&
  • Const SWP_SHOWWINDOW = &H40&
  • Const THREAD_BASE_PRIORITY_MAX = 2
  • Const HIGH_PRIORITY_CLASS = &H80
  • Declare Sub SetWindowPos Lib "User32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
  • 'Declaration fonction sleep
  • Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  • Private Declare Function IsWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
  • Private Declare Function MapVirtualKey Lib "user32.dll" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
  • Private Declare Function GetKeyboardState Lib "user32.dll" (ByRef pbKeyState As Byte) As Long
  • Private Declare Function SetKeyboardState Lib "user32.dll" (ByRef lppbKeyState As Byte) As Long
  • Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  • 'Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  • 'Private Declare Function GetWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
  • Private Declare Function AttachThreadInput Lib "user32.dll" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
  • Private Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Long
  • Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long
  • Private Const GW_CHILD As Long = 5
  • Private Const WM_KEYDOWN As Long = &H100
  • Private Const WM_KEYUP As Long = &H101
  • Private Const WM_SYSKEYDOWN As Long = &H104
  • Private Const WM_SYSKEYUP As Long = &H105
  • ' Fonction venant à l'origine de www.vbfrance.com
  • ' http://www.vbfrance.com/codes/SENDKEYSEX-SIMULER-TOUCHE-DANS-FENETRE-PRECISE_41974.aspx
  • ' par Renfield
  • Public Sub SendKeysEx(ByVal vhTargetWnd As Long, ByVal veKey As VBRUN.KeyCodeConstants, Optional ByVal veShift As VBRUN.ShiftConstants, Optional ByVal vbExtendedKey As Boolean = False)
  • Dim xbMemBuffer(255) As Byte
  • Dim xbNewBuffer(255) As Byte
  • Dim nKeyParam As Long
  • Dim nTargetThreadID As Long
  • '# Si la cible est valide...
  • If IsWindow(vhTargetWnd) Then
  • nTargetThreadID = GetWindowThreadProcessId(vhTargetWnd, ByVal 0&)
  • AttachThreadInput GetCurrentThreadId, nTargetThreadID, 1&
  • nKeyParam = MapVirtualKey(veKey, 0) * &H10000
  • If vbExtendedKey Then
  • nKeyParam = nKeyParam Or &H1000000 '# bit 24
  • End If
  • '# On mémorise l'etat du clavier
  • GetKeyboardState xbMemBuffer(0)
  • If (veShift And vbShiftMask) <> 0 Then
  • xbNewBuffer(vbKeyShift) = &H80
  • End If
  • If (veShift And vbCtrlMask) <> 0 Then
  • xbNewBuffer(vbKeyControl) = &H80
  • End If
  • '# On place notre image du clavier en mémoire
  • SetKeyboardState xbNewBuffer(0)
  • '# On prévient la cible que le clavier a été manipulé
  • PostMessage vhTargetWnd, WM_KEYDOWN, veKey, nKeyParam
  • PostMessage vhTargetWnd, WM_KEYUP, veKey, nKeyParam Or &HC0000000
  • '# On 'force' la cible a prendre en compte les changements effectués
  • Sleep 1
  • '# Il ne nous reste plus alors qu'a restaurer l'image du clavier.
  • SetKeyboardState xbMemBuffer(0)
  • AttachThreadInput GetCurrentThreadId, nTargetThreadID, 0&
  • End If
  • End Sub
  • '-------------------------------------------------------------------------------------------------------------
  • 'Fonction permetant de sauver un feature dans un Fichier KML
  • 'Ce fichier étant un format Ascii, il sera par la suite facile de le traiter pour récupérer les informations
  • 'Seul moyen trouvé pour le moment pour avoir accès aux informations.
  • '
  • ' Retourne 1 si Feature trouvé et sauvegardé 0 dans le cas contraire
  • '
  • ' Note la fonction utilise sendkeys et donc elle est dépendante de la langue (CTL+S, ALT+E etc ..)
  • '
  • ' Pour le moment j'ai rien trouvé de mieux désolé.
  • '-------------------------------------------------------------------------------------------------------------
  • Function SauverFeature(NomDuFeature As String, Optional Fichier As String) As Long
  • Dim Indice As Long
  • Dim GEI As ApplicationGE
  • Dim Feat As FeatureGE
  • Dim Child As FeatureCollectionGE
  • Dim CameraInfo As CameraInfoGE
  • Dim retval As Long ' return value
  • Dim hwnd As Long
  • Set GEI = CreateObject("GoogleEarth.ApplicationGE")
  • 'Attente que GoogleEarth soit initialisé
  • While (GEI.IsInitialized = 0)
  • DoEvents
  • Wend
  • hwnd = GEI.GetMainHwnd
  • Sleep 1000
  • 'Récupère un feature par son nom
  • Set Feat = GEI.GetFeatureByName(NomDuFeature)
  • 'Si le feature à été trouvé
  • If Feat Is Nothing Then
  • SauverFeature = 0
  • Else
  • 'Sélectionne le Feature
  • Call Feat.Highlight
  • '# Ctrl + S
  • 'SendKeys "^s"
  • SendKeysEx hwnd, vbKeyS, vbCtrlMask
  • 'Normalement là on ouvre une autre fenetre donc utilise sendkeys car sinon il faut récupérer le handle
  • 'Rajoute extension .kml si pas présente
  • If Len(Fichier) Then
  • Debug.Print InStr(Len(Fichier) - 4, Fichier, ".kml")
  • If InStr(Len(Fichier) - 4, Fichier, ".kml") = 0 Then
  • Fichier = Fichier & ".kml"
  • End If
  • SendKeys Fichier
  • End If
  • 'Alt+E
  • SendKeys "%(E)"
  • 'au cas ou le fichier existe déjà enter
  • SendKeys "{ENTER}"
  • ' Se déplace sur le feature
  • Call GEI.SetFeatureView(Feat, 5)
  • SauverFeature = 1
  • End If
  • End Function
  • Function DeleteFeature(NomDuFeature As String) As Long
  • Dim Indice As Long
  • Dim GEI As ApplicationGE
  • Dim Feat As FeatureGE
  • Dim Child As FeatureCollectionGE
  • Dim CameraInfo As CameraInfoGE
  • Dim hwnd As Long
  • Set GEI = CreateObject("GoogleEarth.ApplicationGE")
  • 'Attente que GoogleEarth soit initialisé
  • While (GEI.IsInitialized = 0)
  • DoEvents
  • Wend
  • 'Handle de la fenêtre
  • hwnd = GEI.GetMainHwnd
  • Sleep 1000
  • 'Récupère un feature par son nom
  • Set Feat = GEI.GetFeatureByName(NomDuFeature)
  • 'Si le feature à été trouvé
  • If Feat Is Nothing Then
  • MsgBox "Rien a supprimer"
  • DeleteFeature = 0
  • Else
  • 'Sélectionne le Feature
  • Call Feat.Highlight
  • ' DELETE
  • ' SendKeys "{DELETE}"
  • SendKeysEx hwnd, vbKeyDelete
  • ' Valid
  • SendKeys "{ENTER}"
  • DeleteFeature = 1
  • End If
  • End Function
'A mettre dans une Feuille avec 8 boutons
Option explicit

'Exemple de chargement de données KML dans googleEarth
Private Sub Command1_Click()
Dim GEI As ApplicationGE
Dim Fichier As String

Set GEI = CreateObject("GoogleEarth.ApplicationGE")

'Attente que GoogleEarth soit initialisé
While (GEI.IsInitialized = 0)
 DoEvents
Wend
Fichier = App.Path & "\Genève.kml"

Call GEI.OpenKmlFile(Fichier, 1) ' 1= pas de message dans GoogleEarth si le fichier n'existe pas par exemple

End Sub

Private Sub Command2_Click()
Dim GEI As ApplicationGE
Dim KMLData As String


Set GEI = CreateObject("GoogleEarth.ApplicationGE")

'Attente que GoogleEarth soit initialisé
While (GEI.IsInitialized = 0)
DoEvents
Wend

'Initialisation données KML
KMLData = "<?xml version=""1.0"" encoding=""UTF-8""?>" & _
          "<kml xmlns=""http://earth.google.com/kml/2.1"">" & _
          "<Placemark>" & _
          "<name>Geneva</name>" & _
          "<LookAt>" & _
          "<longitude>6.156182706892176</longitude>" & _
          "<latitude>46.20746317320977</latitude>" & _
          "<altitude>0</altitude>" & _
          "<range>316.3662914479763</range>" & _
          "<tilt>0</tilt>" & _
          "<heading>6.199453434125936</heading>" & _
          "</LookAt>" & _
          "<Point>" & _
          "<coordinates>6.156019183879536,46.20743386584116,0</coordinates>" & _
          "</Point>" & _
          "</Placemark>" & _
          "</kml>"

'Chargement données dans GE
GEI.LoadKmlData KMLData

End Sub

'Exemple de récupération de coordonnées de point et d'altitude
Private Sub Command3_Click()
Dim GEI As ApplicationGE
Dim PointOnTerrain() As Double
Dim PositionCherché(2) As Double
Dim Repeat As Integer
Dim Epsilon As Double
Dim LongDiff As Double
Dim LatDiff As Double

'Initialisation
Epsilon = 0.0005

'Coordonnées du mont Blanc
PositionCherché(0) = 45.8325541
PositionCherché(1) = 6.86437217

Set GEI = CreateObject("GoogleEarth.ApplicationGE")

'Attente que GoogleEarth soit initialisé
While (GEI.IsInitialized = 0)
DoEvents
Wend


'Fixe le mode Elevation à 1 ( Activation relief)
GEI.ElevationExaggeration = 1 'Si différent de 0, alors coords[2] est fixée à la vraie altitude du terrain.





'Récupération de données de point centre écran les
   Do
   'Positionne la caméra sur le Mont Blanc (La vitesse est fixé à 5 = Maxi donc pas d'effet de transition
   Call GEI.SetCameraParams(PositionCherché(0), PositionCherché(1), 0, RelativeToGroundAltitudeGE, 100, 0, 0, 5)

    PointOnTerrain = GEI.GetPointOnTerrainFromScreenCoords(0, 0)
        'Attente que le processus de striming soit terminé sur la zone concerné
        While (GEI.StreamingProgressPercentage < 100)
            DoEvents
        Wend
    LongDiff = Abs(PositionCherché(1) - PointOnTerrain(1))
    LatDiff = Abs(PositionCherché(0) - PointOnTerrain(0))
    Repeat = Repeat + 1
    'Controle que la position est bien celle demandée. Repeeat permet déviter de blocquer la procédure
    'avec une limite à 100 itérations
   Loop While (LongDiff > Epsilon Or LatDiff > Epsilon Or PointOnTerrain(2) < 0) And Repeat < 100
    


MsgBox "Altitude Mont Blanc dans GoogleEarth " & PointOnTerrain(2)

End Sub

'Affiche la position courante d'un repère présent dans GE
Private Sub Command4_Click()
Dim GEI As ApplicationGE
Dim Feat As FeatureGE
Dim Child As FeatureCollectionGE
Dim CameraInfo As CameraInfoGE


Set GEI = CreateObject("GoogleEarth.ApplicationGE")

'Attente que GoogleEarth soit initialisé
While (GEI.IsInitialized = 0)
DoEvents
Wend
 
' Charge la position default. Cette fonction permet de récupérer les infos en donnant le nom du repère
Set Feat = GEI.GetFeatureByName("default")
'Set Child = Feat.GetChildren
'Debug.Print Child.Count

'Si elle a une vue on y va
If Feat.HasView Then
    Call GEI.SetFeatureView(Feat, 5)
End If

'Retourne la position courant
Set CameraInfo = GEI.GetCamera(1)

MsgBox "Latitude=" & CameraInfo.FocusPointLatitude & " Longitude=" & CameraInfo.FocusPointLongitude

End Sub

'fonction pour récupérér un feature GE depuis la base de données primaire
Private Sub Command5_Click()
     Dim Indice As Long
     Dim GEI As ApplicationGE
     Dim Feat As FeatureGE
     Dim Child As FeatureCollectionGE
     Dim CameraInfo As CameraInfoGE
    
    
     Set GEI = CreateObject("GoogleEarth.ApplicationGE")
    
     'Attente que GoogleEarth soit initialisé
     While (GEI.IsInitialized = 0)
     DoEvents
     Wend

    'Racine du layersdatabase
    'Récupère les enfants
    Set Child = GEI.GetLayersDatabases.Item(1).GetChildren
    For Indice = 1 To Child.Count
     'Si elle a une vue et si c'est bien ce qui m'intéresse on y va
     If Child.Item(Indice).HasView And InStr(Child.Item(Indice).Name, "Élection présidentielle France 2007") Then
            Call GEI.SetFeatureView(Child.Item(Indice), 5)
     End If
    Next Indice

End Sub

'fonction pour récupérer un feature GE depuis son nom
Private Sub Command6_Click()

     Dim Indice As Long
     Dim GEI As ApplicationGE
     Dim Feat As FeatureGE
     Dim Child As FeatureCollectionGE
     Dim CameraInfo As CameraInfoGE

    
     Set GEI = CreateObject("GoogleEarth.ApplicationGE")
    

     
     'Attente que GoogleEarth soit initialisé
     While (GEI.IsInitialized = 0)
     DoEvents
     Wend





    'Récupère les enfants du feature "Geneva" selon exemple
    Set Feat = GEI.GetFeatureByName("Geneva")
    Call Feat.Highlight
    Call GEI.SetFeatureView(Feat, 5)
    
    
    Set Child = Feat.GetChildren
    For Indice = 1 To Child.Count
     'Si elle a une vue et si c'est bien ce qui m'intéresse on y va
     Debug.Print Child.Item(Indice).Name
     'Rend visible le Feature
        Child.Item(Indice).Visibility = True
        
        ' Se déplace sur le feature
        Call GEI.SetFeatureView(Child.Item(Indice), 1)
        
        Call Sleep(1000)
        
        'Attente que le processus de striming soit terminé sur la zone concerné
        While (GEI.StreamingProgressPercentage < 100)
            DoEvents
        Wend
        Call Child.Item(Indice).Highlight
        
    Next Indice
    

End Sub

'Fonction pour sauver le feature sous un format KML
Private Sub Command7_Click()
  SauverFeature "Geneva", "C:\tmp\test"
End Sub

Private Sub Command8_Click()
     DeleteFeature "Geneva"    
End Sub

'------------------------------------------------
' CODE A RAJOUTER DANS UN MODULE
'------------------------------------------------

Option Explicit

 Const HWND_TOPMOST = -1&
 Const HWND_NOTOPMOST = -2&
 Const HWND_TOP = 0
 Const SWP_NOSIZE = &H1&
 Const SWP_NOMOVE = &H2&
 Const SWP_NOACTIVATE = &H10&
 Const SWP_SHOWWINDOW = &H40&
 Const THREAD_BASE_PRIORITY_MAX = 2
 Const HIGH_PRIORITY_CLASS = &H80



Declare Sub SetWindowPos Lib "User32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)


'Declaration fonction sleep
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    

Private Declare Function IsWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function MapVirtualKey Lib "user32.dll" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Private Declare Function GetKeyboardState Lib "user32.dll" (ByRef pbKeyState As Byte) As Long
Private Declare Function SetKeyboardState Lib "user32.dll" (ByRef lppbKeyState As Byte) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Private Declare Function GetWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function AttachThreadInput Lib "user32.dll" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long


Private Const GW_CHILD As Long = 5

Private Const WM_KEYDOWN As Long = &H100
Private Const WM_KEYUP As Long = &H101
Private Const WM_SYSKEYDOWN As Long = &H104
Private Const WM_SYSKEYUP As Long = &H105

' Fonction venant à l'origine de www.vbfrance.com
' http://www.vbfrance.com/codes/SENDKEYSEX-SIMULER-TOUCHE-DANS-FENETRE-PRECISE_41974.aspx
' par Renfield
Public Sub SendKeysEx(ByVal vhTargetWnd As Long, ByVal veKey As VBRUN.KeyCodeConstants, Optional ByVal veShift As VBRUN.ShiftConstants, Optional ByVal vbExtendedKey As Boolean = False)
Dim xbMemBuffer(255) As Byte
Dim xbNewBuffer(255) As Byte
Dim nKeyParam As Long
Dim nTargetThreadID As Long
    '# Si la cible est valide...
    If IsWindow(vhTargetWnd) Then
        nTargetThreadID = GetWindowThreadProcessId(vhTargetWnd, ByVal 0&)
        AttachThreadInput GetCurrentThreadId, nTargetThreadID, 1&
        
        nKeyParam = MapVirtualKey(veKey, 0) * &H10000
        If vbExtendedKey Then
            nKeyParam = nKeyParam Or &H1000000 '# bit 24
        End If
    
        '# On mémorise l'etat du clavier
        GetKeyboardState xbMemBuffer(0)
        
        If (veShift And vbShiftMask) <> 0 Then
            xbNewBuffer(vbKeyShift) = &H80
        End If
        If (veShift And vbCtrlMask) <> 0 Then
            xbNewBuffer(vbKeyControl) = &H80
        End If
        
        '# On place notre image du clavier en mémoire
        SetKeyboardState xbNewBuffer(0)
            
        '# On prévient la cible que le clavier a été manipulé
        PostMessage vhTargetWnd, WM_KEYDOWN, veKey, nKeyParam
        PostMessage vhTargetWnd, WM_KEYUP, veKey, nKeyParam Or &HC0000000
        
        '# On 'force' la cible a prendre en compte les changements effectués
        Sleep 1
                
        '# Il ne nous reste plus alors qu'a restaurer l'image du clavier.
        SetKeyboardState xbMemBuffer(0)
        AttachThreadInput GetCurrentThreadId, nTargetThreadID, 0&
    End If
End Sub


'-------------------------------------------------------------------------------------------------------------
'Fonction permetant de sauver un feature dans un Fichier KML
'Ce fichier étant un format Ascii, il sera par la suite facile de le traiter pour récupérer les informations
'Seul moyen trouvé pour le moment pour avoir accès aux informations.
'
' Retourne 1 si Feature trouvé et  sauvegardé 0 dans le cas contraire
'
' Note la fonction utilise sendkeys et donc elle est dépendante de la langue (CTL+S, ALT+E etc ..)
'
' Pour le moment j'ai rien trouvé de mieux désolé.
'-------------------------------------------------------------------------------------------------------------

Function SauverFeature(NomDuFeature As String, Optional Fichier As String) As Long

     Dim Indice As Long
     Dim GEI As ApplicationGE
     Dim Feat As FeatureGE
     Dim Child As FeatureCollectionGE
     Dim CameraInfo As CameraInfoGE
     Dim retval As Long  ' return value
     Dim hwnd As Long
    
    
     Set GEI = CreateObject("GoogleEarth.ApplicationGE")
    

     
     'Attente que GoogleEarth soit initialisé
     While (GEI.IsInitialized = 0)
     DoEvents
     Wend


     hwnd = GEI.GetMainHwnd

     Sleep 1000


    'Récupère un feature par son nom
    Set Feat = GEI.GetFeatureByName(NomDuFeature)
    
    'Si le feature à été trouvé
    If Feat Is Nothing Then
            SauverFeature = 0
        Else

        'Sélectionne le Feature
        Call Feat.Highlight
        
    
        '# Ctrl + S
        'SendKeys "^s"
        SendKeysEx hwnd, vbKeyS, vbCtrlMask
    
        'Normalement là on ouvre une autre fenetre donc utilise sendkeys car sinon il faut récupérer le handle
    
    
        'Rajoute extension .kml si pas présente
        If Len(Fichier) Then
        Debug.Print InStr(Len(Fichier) - 4, Fichier, ".kml")
            If InStr(Len(Fichier) - 4, Fichier, ".kml") = 0 Then
                Fichier = Fichier & ".kml"
            End If
        
            SendKeys Fichier
        End If
        
        
        'Alt+E
        SendKeys "%(E)"
        'au cas ou le fichier existe déjà enter
        SendKeys "{ENTER}"
        
       ' Se déplace sur le feature
        Call GEI.SetFeatureView(Feat, 5)
        
        SauverFeature = 1

    End If
    
End Function

Function DeleteFeature(NomDuFeature As String) As Long

     Dim Indice As Long
     Dim GEI As ApplicationGE
     Dim Feat As FeatureGE
     Dim Child As FeatureCollectionGE
     Dim CameraInfo As CameraInfoGE
     Dim hwnd As Long
    
    
     Set GEI = CreateObject("GoogleEarth.ApplicationGE")
    

     
     'Attente que GoogleEarth soit initialisé
     While (GEI.IsInitialized = 0)
     DoEvents
     Wend

     'Handle de la fenêtre
     hwnd = GEI.GetMainHwnd

     Sleep 1000


    'Récupère un feature par son nom
    Set Feat = GEI.GetFeatureByName(NomDuFeature)
    
    'Si le feature à été trouvé
    If Feat Is Nothing Then
            MsgBox "Rien a supprimer"
            DeleteFeature = 0
        Else

        'Sélectionne le Feature
        Call Feat.Highlight
        
    
        ' DELETE
        ' SendKeys "{DELETE}"
        SendKeysEx hwnd, vbKeyDelete
        ' Valid
        SendKeys "{ENTER}"
        
        DeleteFeature = 1

    End If
    
End Function

 Conclusion

Descriptif API GoogleEarth (en anglais) http://earth.google.com/comapi/interfaceIApplicati onGE.html

Comme indiqué sur le site de GoogleEarth  cette API est pour le moment au stade BETA. J'espère qu'elle évoluera avec le temps. Les méthodes de récupération d'information étant plus que limitées pour le moment.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • Genève.kmlTélécharger ce fichier [Réservé aux membres club]475 octets

Télécharger le zip


 Historique

24 octobre 2006 10:43:51 :
Ajout d'un exemple un peu plus évolué avec déplacement du point de vision et récupéartion des coordonnées du centre écran. Bon normalement on devrait avoir l'altitude du Mont Blanc entre 4810 et 4807 (Merci pas de polémique...) Bon ici c'est plus 4086 ... Le but n'étant pas de déclencher une polémique sur se sujet merci d'en rester à ce qui nous intéresse dans ce Post...
24 octobre 2006 11:53:58 :
Voir Remarque Renfield
24 octobre 2006 12:53:13 :
J'ai modifié la relecture d'un point car même en attentant la fin streaming la coordonnée n'était pas forcément la même. Il n'y a pas d'attente entre SetCameraParams et la suite du programme. Là ca doit être bon.
24 octobre 2006 13:42:30 :
Modif sur position si GE pas chargé
24 octobre 2006 14:17:05 :
Ajout exemple 4
26 octobre 2006 09:56:58 :
Modif sur code 3 car problème de latence entre position demandée et position retournée
10 mai 2007 16:38:40 :
Ajout d'une fonction permetant de sauver un feature dans un Fichier KML. Cette fonction est une béquille en attendant une solution via L'api (Si elle arrive un jour, ce qui semble mal partie ( version béta 4.1 dispo et toujours pas d'évolution) Le fichier KML étant un format Ascii, il sera par la suite facile de le traiter pour récupérer les informations c'est le seul moyen trouvé pour le moment pour avoir accès aux informations. Si vous avez mieux ...
10 mai 2007 17:36:09 :
Ajout fonction DeleteFeature

 Sources du même auteur

Source avec Zip Source avec une capture VISUALISATEUR / EDITEUR OPENGL
Source avec Zip Source avec une capture FORCER LE "." POINT COMME PARAMÈTRE DÉCIMAL DANS LES PARAMÈT...
Source avec Zip Source avec une capture JEUX DE COMBAT OPENGL
Source avec Zip Source avec une capture ROTATION 3D
Source avec Zip Source avec une capture MENU DÉROULANT FAÇON XP SANS OCX

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) .NET DEPENDENCY VIEWER : ARBRE DES DÉPENDANCES D'UN ASSEMBLY... par ShareVB
Source avec Zip Source .NET (Dotnet) UTILITAIRE SKYDRIVE par MasterShadows
Source avec Zip ROTATION RAPIDE D'IMAGE par trex70
Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ... par Renfield
Source avec Zip Source avec une capture MOUSE SPEED AND WEIGHT : RETOUR DE FORCE VIRTUEL ! par ScSami

 Sources en rapport avec celle ci

Source avec Zip COMMUNICATION MODBUS MASTER par sergelapointe
Source avec Zip Source avec une capture [VBS] GOOGLE EASTER EGGS par hackoo
Source avec Zip Source avec une capture GOOGLE EARTH IN VB6 par ZaidMarkabi
Source avec Zip Source avec une capture GOOMULE CHERCHER DES FICHIERS AVEC GOOGLE par zork74
Source avec Zip Source avec une capture Source .NET (Dotnet) UTILISATION DE L' API GOOGLE YOUTUBE RECHERCHER ET LIRE DES ... par tresorsdevie

Commentaires et avis

Commentaire de Nix le 23/10/2006 19:14:59 administrateur CS

Génial, exactement le genre de choses que je voulais faire mais je n'avais pas encore eu le temps de regarder de près les API. Maintenant je sais que c'est possible ;)
Merci pour cette petite source qui me sera bien utile !

Commentaire de Renfield le 24/10/2006 09:41:16 administrateur CS

gaffe a tes concaténations :

KMLData = "<?xml version=""1.0"" encoding=""UTF-8""?>" & _
          "<kml xmlns=""http://earth.google.com/kml/2.1"">" & _
              "<Placemark>" & _
                  "<name>Le Jet d&apos;eau Genève</name>" & _
                  "<LookAt>" & _
                      "<longitude>6.156182706892176</longitude>" & _
                      "<latitude>46.20746317320977</latitude>" & _
                      "<altitude>0</altitude>" & _
                      "<range>316.3662914479763</range>" & _
                      "<tilt>0</tilt>" & _
                      "<heading>6.199453434125936</heading>" & _
                  "</LookAt>" & _
                  "<Point>" & _
                      "<coordinates>6.156019183879536,46.20743386584116,0</coordinates>" & _
                  "</Point>" & _
              "</Placemark>" & _
          "</kml>"

Commentaire de cuq le 24/10/2006 10:44:59

Eu c'est quoi le problème avec mes concaténations ?

Commentaire de Renfield le 24/10/2006 10:50:59 administrateur CS

tu utilises '+' ce qui est discutable...

mais surtout, tu effectue multes concaténations

KMLData = KMLData + ...
KMLData = KMLData + ...
KMLData = KMLData + ...

ce qui fais réallouer l'espace, déplacer la chaine existente, maintes fois, inutilement

Commentaire de fredoj le 25/10/2006 22:24:20

Bonkour,
j'ai téléchargé le Zip et il n'y a pas la source je ne comprends pas tres bien. Je n'ai que geneve.kml "@Source telecharge depuis ce lien" et @Readme-CodeS-SourceS-FR.txt. J'ai essayé avec winrar et 7Zip. Si cela vient de moi merci de me prévenir.
Bonne prog à tous.

Commentaire de Renfield le 25/10/2006 22:29:29 administrateur CS

Zip testé et OK (Winrar)

"Le Zip contient uniquement le fichier KML Exemple.

Pour les Grand débutant : pour que la source fonctionne ne pas oublié de rajouter dans Projet / Références / "Earth 1.0 type library" Voir copie écran."

Commentaire de fredoj le 25/10/2006 23:23:12

Oki merci autant pour moi Renfield j'avais pas bien lu lol.
Bonne soiree, je vais le faire tourner de ce pas j'avais pas eu le temps non plus de me pencher sur cet api c'est du travail maché merci cuq.

Commentaire de mak10 le 03/11/2006 12:54:23

bonjour et merci pour ce code. mais j'ai un probleme a le faire fonctionner . meme avec la reference a jouté dans les references du projet, il y a une erreur de ref inconnu dans l'excecution du code et il s'arrete a la premiere ligne de : GEI as ApplicationGE.

merci de vos conseils.

Commentaire de cuq le 03/11/2006 13:05:36

Je pense que cela peut venir de la version de googleearth que tu utilises:

Pour ma part : 4.0.2091 (Beta) je ne pense pas que l'api existait avant la version 4.0 . Met à jour ta version si tu n'es pas dans ce cas là . Sinon : "Nous ne voyons pas d'autre explication"

Commentaire de mak10 le 03/11/2006 13:57:15

merci, c'est bien la version qui est a l'origine du probleme et j'etais a la version 4.0.15xx (beta) de juin 2006.
avec la version actuelle 4.0.2416 (beta) d'octobre 2006, ca marche tres bien. Merci

Commentaire de cuq le 03/11/2006 14:44:26

De rien, ca ma permis de voir que ma version n'était plus à jour. De plus  avec la version 4.0.2416 (beta) la possibilité de créer des polygones  et des trajets est maintenant dans la version de base gratuite Y a plus qu'a attendre qu'ils mettent à jour l'API et ce sera parfait ..

Commentaire de cuq le 03/11/2006 15:01:08

A ce propos j'ai regardé mon exemple 3 ne marche plus ... petite modif il faut maintenant écrire en version 4.0.2416

'Exemple de récupération de coordonnées de point et d'altitude
Private Sub Command3_Click()
Dim GEI As ApplicationGE

Dim PointOnTerrain As PointOnTerrainGE

Dim PositionCherché(2) As Double
Dim Repeat As Integer
Dim Epsilon As Double
Dim LongDiff As Double
Dim LatDiff As Double

'Initialisation
Epsilon = 0.0005

'Coordonnées du mont Blanc
PositionCherché(0) = 45.8325541
PositionCherché(1) = 6.86437217

Set GEI = CreateObject("GoogleEarth.ApplicationGE")

'Attente que GoogleEarth soit initialisé
While (GEI.IsInitialized = 0)
DoEvents
Wend


'Fixe le mode Elevation à 1 ( Activation relief)
GEI.ElevationExaggeration = 1 'Si différent de 0, alors coords[2] est fixée à la vraie altitude du terrain.


'Récupération de données de point centre écran les
   Do
   'Positionne la caméra sur le Mont Blanc (La vitesse est fixé à 5 = Maxi donc pas d'effet de transition
   Call GEI.SetCameraParams(PositionCherché(0), PositionCherché(1), 0, RelativeToGroundAltitudeGE, 100, 0, 0, 5)

    Set PointOnTerrain = GEI.GetPointOnTerrainFromScreenCoords(0, 0)
        'Attente que le processus de striming soit terminé sur la zone concerné
        While (GEI.StreamingProgressPercentage < 100)
            DoEvents
        Wend
    LongDiff = Abs(PositionCherché(1) - PointOnTerrain.Longitude)
    LatDiff = Abs(PositionCherché(0) - PointOnTerrain.Latitude)
    Repeat = Repeat + 1
    'Controle que la position est bien celle demandée. Repeeat permet déviter de blocquer la procédure
    'avec une limite à 100 itérations
   Loop While (LongDiff > Epsilon Or LatDiff > Epsilon Or PointOnTerrain.Altitude < 0) And Repeat < 100
    
MsgBox "Altitude Mont Blanc dans GoogleEarth " & PointOnTerrain.Altitude

End Sub

Pas grand chose de nouveau a part ça on va attendre la mise à jour de la doc

Commentaire de fredoj le 05/11/2006 17:41:42

Bien le bonjour,
c'est juste pour dire que je trouve cela excellent lol Merci.
Bonne prog à tous.

Commentaire de adirat le 19/12/2006 09:23:17

la référence type library "earth 1.0" pointe directement sur l'exe (et pas une bibliothèque .tlb . Donc comment préparer le package de distribution d'un prog organisé comme ça ? Qq'un a pensé au déploiement ? Pas de probème en vue? Et si GE est installé dans un autre répertoire que celui par défaut ? ça marche quand même? J'ai un p'tit doute là ! Mais c'est super quand même!

Commentaire de adirat le 19/12/2006 16:09:53

Eh be je me répond à moi même vu que ça peut intéresser des vieux comme moi, qu'on pas l'habitude de saloper le boulot , arf arf arf .. Bon et bien je dis bravo les p'tits gars: pas de soucis à se faire pour la redistribution , c'est simple pour le déploiement : oubliez GE: il suffit qu'il soit sur le poste et GO!! evidemment si l'API change au cours du temps.. god bless you. mais ça on a l'habitude !

Commentaire de cuq le 25/04/2007 14:57:17

Un nouvel exemple avec GetLayersDatabases.
Je poste cette exemple n'ayant pas trouvé sur le web ce genre de chose. Sachant que ce n'est pas ce que je voulais faire au départ :

Vous avez peut-être vu que dans Google Earth au lendemain des élections on peut (pouvait) voir les résultats de l'élection présidentielle par département/commune etc. Je voulais voir si il était possible de me balader automatiquement dans toutes les références histoire de récupérer en automatique les résulats par commune (par exemple pour voir à quoi resemblai la commune de ceux qui votent certains candidats et si elle ressemblai à ce que l'on pouvait attendre de ce genre d'endroit ... bon la je m'égare .... ca devient de la politique plus du code VB. Donc j'ai commnecé par ça ...

'fonction pour récupérér un feature GE depuis la base de données primaire
Private Sub Command5_Click()
     Dim Indice As Long
     Dim GEI As ApplicationGE
     Dim Feat As FeatureGE
     Dim Child As FeatureCollectionGE
     Dim CameraInfo As CameraInfoGE
    
    
     Set GEI = CreateObject("GoogleEarth.ApplicationGE")
    
     'Attente que GoogleEarth soit initialisé
     While (GEI.IsInitialized = 0)
     DoEvents
     Wend

    'Racine du layersdatabase
    'Debug.Print GEI.GetLayersDatabases.Count
    'Debug.Print GEI.GetLayersDatabases.Item(1).Name
    'Récupère les enfants
    Set Child = GEI.GetLayersDatabases.Item(1).GetChildren
    For Indice = 1 To Child.Count
     'Si elle a une vue et si c'est bien ce qui m'intéresse on y va
     Debug.Print Child.Item(Indice).Name
     If Child.Item(Indice).HasView And InStr(Child.Item(Indice).Name, "Élection présidentielle France 2007") Then
            Call GEI.SetFeatureView(Child.Item(Indice), 5)
     End If
    Next Indice

End Sub


Mais j'arrive toujours sur le premier feature c'est à dire celui de la france.  Bon au final j'ai utilisé une autre solution en passant directement par les pages web donnant les mêmes infos. (au passage merci à NIX pour sa source sur la récupération de page par winsock qui m'a été super utile) et pour mes résulats j'ai eu la confirmation de ce que je pensais : moi j'irai pas habiter à Veney beaucoup trop tranquille comme coin ...

Commentaire de cuq le 10/05/2007 16:41:19

J'ai essayé de rajouter une fonction pour sauver un feature dans un fichier KML.
C'est une grosse béquille en attendant mieux.

Merci à RENFIELD pour son code

http://www.vbfrance.com/codes/SENDKEYSEX-SIMULER-TOUCHE-DANS-FENETRE-PRECISE_41974.aspx

que j'ai réutilisé dans cette fonction

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Google Map API ? ou autre ? [ par C35 ] Bonjour,Je cherche une fonction qui retournerait une liste de ville en fonction :- d'une ville donnée- d'un nombre de kilomètresLa fonction retournera base de donnee et google earth [ par sabrachatilla ] salutje suis débutante  dans le domaine des forumes et j ai une question à poser.  je veux connecter google earth à une base de donnée pour enregistre Créer un fichier kmz pour Google Earth [ par steffy64 ] Bonjour, je ne sais pas très bien dans quel thème poser cette question. J'ai ouvert un fichier sous google earth, et j'ai été surprise de voir qu'on Utiliser l'api google map pour vb.net [ par dratcliff ] bonjours, je suis peut etre en train de poser une question bête, mais je voudrais effectuer des recherches via l'api google map en dans un programme e [BAR]Utilisation de l'API GOOGLE MAP sous Access 2003 [ par MeShoggun ] Bonjour à tous, et tout d'abord un grand merci pour la qualité des informations disponibles sur les différents forums. Je développe actuellement une Google Maps API Javascript [ par mimimiao ] [^^clinoeil3] bonjour tout le monde j'ai un projet a réaliser et pour ceci j'ai a utiliser l'api google map javascript dans du html je voudrais savoir Problème d'intégration de l'API Youtube [ par aloisio11 ] Bonjour à tous,Je voudrais créer un application pour envoyer des vidéos sur mon compte Youtube automatiquement.Je voulais donc utiliser l'API de Youtu PictureBox [ par KIPRE74 ] Bonjour à tous !Je développe une petite application pour lire mes fichier kml avec google earth, et j'ai deux soucis :1- lorsque je sélection mon fich utilisation de l'API sleep en vb6 [ par yvesdudu ] bonjour à tous, J'ai voulu utiliser l'API sleep dans mon code mais je n'arrive pas à avoir une tempo réelle en fonction du code . Voilà mon bout de co


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,356 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales