Google Earth

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Google Earth

Message par kernadec »

bonjour
sur le forum english, il y a un code d' idle pour dessiner sur Google Earth et aller à un endroit précis sur la terre....
seulement chez moi..... cela ne fonctionnait pas. Alors je me suis pris la tête avec la syntaxe et le passage des paramètres vers ce script
avec l'option Unicode oui et non etc.... enfin après plusieurs heures de recherche avec les bouquins sur java html etc...
je suis arrivé à le faire fonctionner seulement sans l'option Unicode.
voilà le code d' idle que j'ai légèrement modifié pour ma bécane, j'espère qu'il fonctionnera pour vous aussi..
avec le code UTM Mercator que j'ai déjà posté ici... On va pouvoir faire de la géométrie sur la terre avec les distances au mètre près...
Je vous laisse imaginer les possibilités de ces codes.. et j'ai posté également sur le forum anglais la petite modification à ce code génial.
qui fonctionne avec ma config...
il vous faudra pour cela installer le plugin Google Earth, si ce n'est déjà fait.

Cordialement

Code : Tout sélectionner

#DISPATCH_METHOD = $1
#DISPATCH_PROPERTYGET = $2
#DISPATCH_PROPERTYPUT = $4
#DISPATCH_PROPERTYPUTREF = $8

DataSection
  
  IID_IHTMLDocument: ; {626FC520-A41E-11CF-A731-00A0C9082637}
  Data.l $626FC520
  Data.w $A41E, $11CF
  Data.b $A7, $31, $00, $A0, $C9, $08, $26, $37
  
  IID_NULL: ; {00000000-0000-0000-0000-000000000000}
  Data.l $00000000
  Data.w $0000, $0000
  Data.b $00, $00, $00, $00, $00, $00, $00, $00       
  
EndDataSection

Procedure MakeBSTR(String$)
  Unicode$ = Space(Len(String$)*2+2)
  MultiByteToWideChar_(#CP_ACP, 0, @String$, -1, @Unicode$, Len(String$)*2+2)
  ProcedureReturn SysAllocString_(@Unicode$)
EndProcedure

Procedure.s ReadBSTR(bstr)
  length = WideCharToMultiByte_(#CP_ACP, 0, bstr, -1, 0, 0, 0, 0)
  Text$ = Space(length)
  WideCharToMultiByte_(#CP_ACP, 0, bstr, -1, @Text$, length, 0, 0)   
  ProcedureReturn Text$
EndProcedure

Procedure.s StringFromVARIANT(*var.VARIANT)
  
  If VariantChangeType_(*var, *var, $2, #VT_BSTR) = #S_OK
    Result$ = ReadBSTR(*var\bstrVal)
    SysFreeString_(*var\bstrVal)
  Else
    Result$ = "ERROR : Cannot convert VARIANT to String!"
  EndIf
  
  ProcedureReturn Result$
EndProcedure

Procedure.s ExecuteJavaScript(Gadget, Function$, Arguments$, Separator$)
  Result$ = "ERROR"
  
  Browser.IWebBrowser2 = GetWindowLong_(GadgetID(Gadget), #GWL_USERDATA)
  If Browser\get_Document(@DocumentDispatch.IDispatch) = #S_OK
    If DocumentDispatch\QueryInterface(?IID_IHTMLDocument, @Document.IHTMLDocument) = #S_OK
      If Document\get_Script(@Script.IDispatch) = #S_OK
        
        bstr_command = MakeBSTR(Function$)
        result = Script\GetIDsOfNames(?IID_NULL, @bstr_command, 1, 0, @dispID.l)
        If result = #S_OK
          
          ; parse the arguments         
          ;
          If Trim(Arguments$) = ""
            Count = 0
            *Arguments = 0
          Else           
            Count = CountString(Arguments$, Separator$)+1
            *Arguments = AllocateMemory(SizeOf(VARIANT)*Count)       
            *Arg.VARIANT = *Arguments
            
            For i = 1 To Count           
              *Arg\vt = #VT_BSTR
              *Arg\bstrVal = MakeBSTR(StringField(Arguments$, i, Separator$))
              *Arg + SizeOf(VARIANT)
            Next i
          EndIf
          
          params.DISPPARAMS\cArgs = Count
          params\cNamedArgs = 0
          params\rgvarg = *Arguments
          
          result = Script\Invoke(dispID, ?IID_NULL, 0, #DISPATCH_METHOD, @params, @varResult.VARIANT, 0, 0)
          If result = #S_OK
            Result$ = StringFromVARIANT(@varResult)
          Else
            Message$ = Space(3000)
            FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, result, 0, @Message$, 3000, 0)         
            Result$ = "ERROR: Invoke() "+Message$           
          EndIf
          
          If *Arguments
            *Arg.VARIANT = *Arguments
            For i = 1 To Count
              SysFreeString_(*Arg\bstrVal)
              *Arg + SizeOf(VARIANT)
            Next i         
            FreeMemory(*Arguments)
          EndIf
          
        Else
          Message$ = Space(3000)
          FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, result, 0, @Message$, 3000, 0)         
          Result$ = "ERROR: GetIDsOfNames() "+Message$         
          
        EndIf
        SysFreeString_(bstr_command)
        
        Script\Release()
      EndIf
      Document\Release()
    EndIf
    DocumentDispatch\Release()
  EndIf
  
  ProcedureReturn Result$
EndProcedure

#web_1 = 1

strfile$ = "file:///" + GetCurrentDirectory() + "google.html"

If OpenWindow(0,0,0,850,700,"test",#PB_Window_SizeGadget | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget |#PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
  
  WebGadget(#Web_1, 0, 0, 850, 650, strfile$) ;,#PB_Web_Mozilla )
  ButtonGadget(2,20,650,60,20,"PlaceMark")
  ButtonGadget(3,80,650,60,20,"ZigZag")
  ButtonGadget(4,140,650,60,20,"Idles Beach")
  
  
  Repeat
    
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
      
      Select EventGadget() 
          
        Case 2
          
          executejavascript(#web_1,"CreatePlaceMark","Purebasic","")
        Case 3 
          
          executejavascript(#web_1,"CreateZigZag","","") 
          
        Case 4   
          executejavascript(#web_1,"LookAt","300,0;174,8128;-36,8255",";")
          ;executejavascript(#web_1,"LookAt","300,0;-0,363;49,1872",";") ; kernadec lives in the city of Caen City Or Is castle of William the Conqueror of Normandy Duke ancestor of the Queen of England (the Year 1027 and 1087)  
          
          Delay(1500)
          executejavascript(#web_1,"CreatePlaceMark","idles Beach","")  
      EndSelect 
    EndIf 
    
  Until Event = #PB_Event_CloseWindow
  
EndIf 
[code]


Script:  "google.html"

[code]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html> 
  <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
	<head> 
	<title>Hello Google Earth!</title> 
	<!-- *** Replace the key below below With your own API key, available at http://code.google.com/apis/maps/signup.html *** --> 
	<script src="http://www.google.com/jsapi?key=ABQIAAAAwbkbZLyhsmTCWXbTcjbgbRSzHs7K5SvaUdm8ua-Xxy_-2dYwMxQMhnagaawTo7L1FE1-amhuQxIlXw"></script> 
	<script> 
	google.load("earth", "1"); 
	
	
	
	var ge = null; 
	
	
	function init() { 
	google.earth.createInstance("map3d", initCallback, failureCallback); 
  
	} 
	 
	function initCallback(object) { 
	ge = object; 
	ge.getWindow().setVisibility(true); 
	} 
	 
	function failureCallback(object) { 
	} 
	 
	</script> 
	 
	</head> 
	<body onload='init()' id='body'> 
	<center> 
	<div id='map3d_container' 
	style='border: 1px solid silver; height: 600px; width: 800px;'> 
	<div id='map3d' style='height: 100%;'></div> 
	</div> 
	 
	</center> 
	 
	<script type="text/javascript"> 
	 
	var counter; 
	 
	function addToLineString(lineString, lat, lng, latOffset, lngOffset) { 
	lineString.getCoordinates().pushLatLngAlt(lat + latOffset, lng + lngOffset, 0); 
	} 
	 
	function CreateZigZag() { 
	var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND); 
	var lat = lookAt.getLatitude(); 
	var lng = lookAt.getLongitude(); 
	var lineStringPlacemark = ge.createPlacemark(''); 
	var lineString = ge.createLineString(''); 
	lineStringPlacemark.setGeometry(lineString); 
	lineString.setTessellate(true); 
	 
	addToLineString(lineString, lat, lng,   0,   0, 0); 
	addToLineString(lineString, lat, lng, 1.5,  .5, 0); 
	addToLineString(lineString, lat, lng,   0, 1.0, 0); 
	addToLineString(lineString, lat, lng, 1.5, 1.5, 0); 
	addToLineString(lineString, lat, lng,   0, 2.0, 0); 
	addToLineString(lineString, lat, lng, 1.5, 2.5, 0); 
	addToLineString(lineString, lat, lng,   0, 3.0, 0); 
	addToLineString(lineString, lat, lng, 1.5, 3.5, 0); 
	addToLineString(lineString, lat, lng,   0, 4.0, 0); 
	addToLineString(lineString, lat, lng, 1.5, 4.5, 0); 
	 
	ge.getFeatures().appendChild(lineStringPlacemark); 
	} 
	 
	function CreatePlaceMark(strname) { 
	 
	var placemark = ge.createPlacemark(''); 
	placemark.setName(strname); 
	ge.getFeatures().appendChild(placemark); 
	 
	// Create style Map For placemark 
	var normal = ge.createIcon(''); 
	normal.setHref('http://maps.google.com/mapfiles/kml/paddle/red-circle.png'); 
	var iconNormal = ge.createStyle(''); 
	iconNormal.getIconStyle().setIcon(normal); 
	var highlight = ge.createIcon(''); 
	//highlight.setHref('http://maps.google.com/mapfiles/kml/paddle/red-circle.png'); 
	highlight.setHref('http://gregcookland.com/journal/uploaded_images/picHasselHoff-747711.jpg'); 
	var iconHighlight = ge.createStyle(''); 
	iconHighlight.getIconStyle().setIcon(highlight); 
	var styleMap = ge.createStyleMap(''); 
	styleMap.setNormalStyle(iconNormal); 
	styleMap.setHighlightStyle(iconHighlight); 
	placemark.setStyleSelector(styleMap); 
	 
	// Create point 
	var la = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND); 
	var point = ge.createPoint(''); 
	point.setLatitude(la.getLatitude()); 
	point.setLongitude(la.getLongitude()); 
	placemark.setGeometry(point); 
	 
	counter++; 
	}    
	
	
	function LookAt(lat, long, alt) { 
	
	var lookAt = ge.getView().copyAsCamera(ge.ALTITUDE_RELATIVE_TO_GROUND); 
	lookAt.setLatitude(lat); 
	lookAt.setLongitude(long); 
	lookAt.setAltitude(alt); 
	ge.getView().setAbstractView(lookAt);
	
	Return =	(lat+" "+long+" "+alt); 
	}   
	 
	</script> 
	 
	</body> 
	</html> 
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Google Earth

Message par Progi1984 »

Code : Tout sélectionner

kernadec lives in the city of Caen City Or Is castle of William the Conqueror of Normandy Duke ancestor of the Queen of England (the Year 1027 and 1087)  
Kernadec serait il normand ?
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Google Earth

Message par kernadec »

bonjour Progi1984
oui je suis de Caen même, mais je crois que toi aussi.

Ce code d'idle est génial, je suis en train de me faire un truc de ouf... car à Paris par exemple,
quand on prend l'axe de l'arc de triomphe avec les coordonnées très précise et l'axe de la tour Eiffel
et bien cette distance représente 1000 fois la racine de trois = 1732m~ et cette base forme avec l'obélisque
un remarquable triangle isocèle et je parle pas des trois palais qui passe par la médiane de ce triangle.
Mais il y à aussi l' Égypte la Grèce de l'Italie, et bien d'autre lieux remarquable dans le monde à explorer de cette manière.

Cordialement
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Google Earth

Message par TazNormand »

Yeahhh Les Normands envahissent le forum !!!

OK je sors :oops:
Image
Image
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: Google Earth

Message par Frenchy Pilou »

ça me rappelle une épopée que j'avais faite qui allait de Shönbrunn
à ... :D Suspense :mrgreen:
(je ne sais si on voit les images sans être inscrit, je pense que oui)
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Google Earth

Message par case »

t'es un grand malade frenchy pilou :)
ImageImage
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Google Earth

Message par kernadec »

salut
@Frenchy Pilou génial merci
je crois que j'ai chopé la même maladie..

http://quikmaps.com/new

on peut aussi en rouler en voiture à 160km heure sur les champs elysées http://geoquake.jp/en/webgame/DrivingSimulatorGM/

Cordialement
Dernière modification par kernadec le mer. 21/juil./2010 8:23, modifié 1 fois.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Google Earth

Message par Progi1984 »

kernadec a écrit :bonjour Progi1984
oui je suis de Caen même, mais je crois que toi aussi.
Si ca continue, on va pouvoir créer un PureBasic User Group (Genre LUG (Linux) ou JUG (Java)) juste pour la Normandie...
Répondre