Page 1 sur 1

Google Earth

Publié : mar. 20/juil./2010 9:06
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> 

Re: Google Earth

Publié : mar. 20/juil./2010 9:48
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 ?

Re: Google Earth

Publié : mar. 20/juil./2010 10:57
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

Re: Google Earth

Publié : mar. 20/juil./2010 13:13
par TazNormand
Yeahhh Les Normands envahissent le forum !!!

OK je sors :oops:

Re: Google Earth

Publié : mer. 21/juil./2010 0:31
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)

Re: Google Earth

Publié : mer. 21/juil./2010 0:38
par case
t'es un grand malade frenchy pilou :)

Re: Google Earth

Publié : mer. 21/juil./2010 7:06
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

Re: Google Earth

Publié : mer. 21/juil./2010 8:22
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...