Page 1 sur 1
[R] Extraction de latitude/longitude à partir d'une carte
Posté : sam. 21 sept. 2013 13:51
par tomy46
Bonjour à tous

!
J’ai encore une fois besoin de vos talents !
Je fais un logiciel de base de données client. Etant dans une zone géographique ou les adresses ne sont pas suffisamment précises pour être affiché sur une carte, j’ai besoin de repérer les maisons des clients grâce à leur latitude et leur longitude.
Pour l’affichage de la carte, j’utilise Google Map UDF de Seangriffin …
Seulement je n’arrive pas à trouver un moyen en « pointant » sur la carte, d’extraire les coordonnés géographique des domiciles …
Je suis ouvert à toute idées/propositions même si on doit passer par un autre système que google map …
Merci
P.S : J'avais cru lire que The Google Latitude API permettait de faire ca, mais celui-ci est fermé depuis Août 2013 ... il nous faut donc une autre solution/idée ...
Re: [..] Extraction de latitude/longitude à partir d'une car
Posté : sam. 21 sept. 2013 14:15
par jchd
Avec Map, tu fais clic droit à l'endroit choisi et "plus d'info sur cet endroit". Les coordonnées GPS déboulent dans le champ adresse géographique (pas URL). Tu dois pouvoir automatiser ça (ou plus simple) avec AutoIt.
Désolé je n'ai pas trop le temps ce w-e.
Re: [..] Extraction de latitude/longitude à partir d'une car
Posté : sam. 21 sept. 2013 19:40
par mikell
D'après ce site
http://universimmedia.pagesperso-orange.fr/geo/loc.htm
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <IE.au3>
Opt("GUIOnEventMode", 1)
$html = StringRegExpReplace(FileRead(@scriptfullpath), '(?s).+#cs(.+?)#ce.*?', "$1")
$file = @tempdir & "\loc.html"
$f = FileOpen($file, 130)
FileWrite($f, $html)
FileClose($f)
$oIE = ObjCreate("Shell.Explorer.2")
GUICreate("test", 740, 600)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$input_lat = GUICtrlCreateInput("", 20, 550, 200, 30)
GUICtrlSetFont(-1, 14, 600, 0, "Tahoma")
$input_long = GUICtrlCreateInput("", 240, 550, 200, 30)
GUICtrlSetFont(-1, 14, 600, 0, "Tahoma")
GUICtrlCreateObj($oIE, 0, 0, 740, 540)
GUISetState()
$oIE.navigate("file://" & $file)
While $oIE.busy
sleep(100)
Wend
$long = _IEGetObjById($oIE, "lng")
$lat = _IEGetObjById($oIE, "lat")
While 1
$old_long = GuiCtrlRead($input_long)
$old_lat = GuiCtrlRead($input_lat)
Sleep(100)
$new_long = $long.innertext
$new_lat = $lat.innertext
If $new_long<>$old_long OR $new_lat<>$old_lat Then
GuiCtrlSetData($input_long, $new_long)
GuiCtrlSetData($input_lat, $new_lat)
EndIf
Wend
Func _Exit()
Exit
EndFunc
;===================================================
; http://universimmedia.pagesperso-orange.fr/geo/loc.htm
#cs
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Latitude et longitude avec Google Maps</title>
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAgrj58PbXr2YriiRDqbnL1RSqrCjdkglBijPNIIYrqkVvD1R4QxRl47Yh2D_0C1l5KXQJGrbkSDvXFA"
type="text/javascript"></script>
<script type="text/javascript">
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
var center = new GLatLng(0, 0);
map.setCenter(center, 15);
geocoder = new GClientGeocoder();
var marker = new GMarker(center, {draggable: true});
map.addOverlay(marker);
document.getElementById("lat").innerHTML = center.lat().toFixed(7);
document.getElementById("lng").innerHTML = center.lng().toFixed(7);
GEvent.addListener(marker, "dragend", function() {
var point = marker.getPoint();
map.panTo(point);
document.getElementById("lat").innerHTML = point.lat().toFixed(7);
document.getElementById("lng").innerHTML = point.lng().toFixed(7);
});
GEvent.addListener(map, "moveend", function() {
map.clearOverlays();
var center = map.getCenter();
var marker = new GMarker(center, {draggable: true});
map.addOverlay(marker);
document.getElementById("lat").innerHTML = center.lat().toFixed(7);
document.getElementById("lng").innerHTML = center.lng().toFixed(7);
GEvent.addListener(marker, "dragend", function() {
var point =marker.getPoint();
map.panTo(point);
document.getElementById("lat").innerHTML = point.lat().toFixed(7);
document.getElementById("lng").innerHTML = point.lng().toFixed(7);
});
});
}
}
function showAddress(address) {
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
if (geocoder) {
geocoder.getLatLng(
address,
function(point) {
if (!point) {
alert(address + " not found");
} else {
document.getElementById("lat").innerHTML = point.lat().toFixed(7);
document.getElementById("lng").innerHTML = point.lng().toFixed(7);
map.clearOverlays()
map.setCenter(point, 14);
var marker = new GMarker(point, {draggable: true});
map.addOverlay(marker);
GEvent.addListener(marker, "dragend", function() {
var pt = marker.getPoint();
map.panTo(pt);
document.getElementById("lat").innerHTML = pt.lat().toFixed(7);
document.getElementById("lng").innerHTML = pt.lng().toFixed(7);
});
GEvent.addListener(map, "moveend", function() {
map.clearOverlays();
var center = map.getCenter();
var marker = new GMarker(center, {draggable: true});
map.addOverlay(marker);
document.getElementById("lat").innerHTML = center.lat().toFixed(7);
document.getElementById("lng").innerHTML = center.lng().toFixed(7);
GEvent.addListener(marker, "dragend", function() {
var pt = marker.getPoint();
map.panTo(pt);
document.getElementById("lat").innerHTML = pt.lat().toFixed(7);
document.getElementById("lng").innerHTML = pt.lng().toFixed(7);
});
});
}
}
);
}
}
</script>
</head>
<body onload="load()" onunload="GUnload()" >
<p>Glisser-déplacer le pointeur central pour un positionnement fin. Les coordonnées sont rafraichies à la fin de chaque déplacement. </p>
<p>
</p>
<table bgcolor="#FFFFCC" width="700">
<td>
<tr>
<td width="90"><b>Latitude</b></td>
<td><b>Longitude</b></td>
<td rowspan="2" width="40"> </td>
<td rowspan="2"> <form action="#" onsubmit="showAddress(this.address.value); return false">
<input type="text" size="60" name="address" value="place de la comédie montpellier" />
<input type="submit" value="Chercher" /> </form></td>
</tr>
<tr>
<td id="lat"></td>
<td id="lng"></td>
</tr>
</table>
<br/>
<div align="center" id="map" style="width: 700px; height: 500px"><br/></div>
</body>
</html>
#ce
Re: [..] Extraction de latitude/longitude à partir d'une car
Posté : dim. 22 sept. 2013 02:40
par tomy46
Ouaaa que dire :
PARFAIT
Juste, c'est possible de me l'expliquer grosso modo car les incrustations IE de ce style avec interaction
IE<>Autoit je suis complètement pommé :
Pourquoi le code web se trouve à la fin du script sous forme de "commentaire" ?
C'est possible de l'inclure réellement dans mes fonction autoit?
Voir même d'y "injecter" des variables spécifiques comme la lat' long' du point d'origine ?
C'est quoi ce :
Code : Tout sélectionner
StringRegExpReplace(FileRead(@scriptfullpath), '(?s).+#cs(.+?)#ce.*?', "$1")
La fonction en elle même je la connais, mais là, mystère mystère...
Sans parler du fait que je suis une bille en JS...
Bref ce que j'ai compris, c'est que Autoit récupère la valeur des deux champs "lng" et "lat" en cas de modification ... mais c'est à peu près tout ...
Bref comme cette magnifique fonction est soumise a modification si google le décide, j'aimerai bien savoir un peu comment ça marche histoire de suivre le mouvement

Re: [..] Extraction de latitude/longitude à partir d'une car
Posté : dim. 22 sept. 2013 12:45
par mikell
C'est vrai je t'ai balancé tout ça sans explications
Le StringRegExpReplace lit le code html qui est en commentaire et s'en sert pour créer le fichier .html qui s'affiche ensuite dans la gui, j'ai fait comme ça pour avoir tout dans un seul fichier au3 mais tu peux très bien éviter ce trafic en lisant un fichier html déjà existant
Mais tu peux aussi te passer de fichier html externe en faisant comme ça
Code : Tout sélectionner
$oIE = ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($oIE, 0, 0, 740, 660)
_IENavigate($oIE, "about:blank") ; ":" c'est les 2 points
_IEDocWriteHTML($oIE, $html)
$oIE.refresh()
Pour que la carte se cale sur un point d'origine à l'ouverture, tu peux écrire les coordonnées dans le html, ou encore injecter l'adresse dans le html au moment de sa création ,ou commander directement la page à l'ouverture avec les fonctions _IE
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <IE.au3>
Opt("GUIOnEventMode", 1)
[color=#BF0000]$loc_init = "place de la comédie montpellier"
$coord_init = "43.6090105, 3.8800616"[/color]
$html = StringRegExpReplace(FileRead(@scriptfullpath), '(?s).+#cs(.+?)#ce.*?', "$1")
[color=#BF0000]$html = StringReplace($html, "mypersolocation", $loc_init)
$html = StringReplace($html, "mypersocoord", $coord_init)[/color]
GUICreate("test", 740, 700)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$input_lat = GUICtrlCreateInput("", 70, 660, 150, 30)
GUICtrlSetFont(-1, 14, 600, 0, "Tahoma")
$input_long = GUICtrlCreateInput("", 240, 660, 150, 30)
GUICtrlSetFont(-1, 14, 600, 0, "Tahoma")
$oIE = ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($oIE, 0, 0, 740, 660)
_IENavigate($oIE, "about:blank")
_IEDocWriteHTML($oIE, $html)
$oIE.refresh()
While $oIE.busy
sleep(100)
Wend
$long = _IEGetObjById($oIE, "lng")
$lat = _IEGetObjById($oIE, "lat")
;_IEAction(_IETagNameGetCollection($oIE, "input", 1), "click") ; clique sur 'chercher'
GUISetState()
While 1
$old_long = GuiCtrlRead($input_long)
$old_lat = GuiCtrlRead($input_lat)
Sleep(100)
$new_long = $long.innertext
$new_lat = $lat.innertext
If $new_long<>$old_long OR $new_lat<>$old_lat Then
GuiCtrlSetData($input_long, $new_long)
GuiCtrlSetData($input_lat, $new_lat)
EndIf
Wend
Func _Exit()
Exit
EndFunc
;===================================================
; http://universimmedia.pagesperso-orange.fr/geo/loc.htm
#cs
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Latitude et longitude avec Google Maps</title>
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAgrj58PbXr2YriiRDqbnL1RSqrCjdkglBijPNIIYrqkVvD1R4QxRl47Yh2D_0C1l5KXQJGrbkSDvXFA"
type="text/javascript"></script>
<script type="text/javascript">
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
var center = new GLatLng([color=#BF0000]mypersocoord[/color]);
map.setCenter(center, 15);
geocoder = new GClientGeocoder();
var marker = new GMarker(center, {draggable: true});
map.addOverlay(marker);
document.getElementById("lat").innerHTML = center.lat().toFixed(7);
document.getElementById("lng").innerHTML = center.lng().toFixed(7);
GEvent.addListener(marker, "dragend", function() {
var point = marker.getPoint();
map.panTo(point);
document.getElementById("lat").innerHTML = point.lat().toFixed(7);
document.getElementById("lng").innerHTML = point.lng().toFixed(7);
});
GEvent.addListener(map, "moveend", function() {
map.clearOverlays();
var center = map.getCenter();
var marker = new GMarker(center, {draggable: true});
map.addOverlay(marker);
document.getElementById("lat").innerHTML = center.lat().toFixed(7);
document.getElementById("lng").innerHTML = center.lng().toFixed(7);
GEvent.addListener(marker, "dragend", function() {
var point =marker.getPoint();
map.panTo(point);
document.getElementById("lat").innerHTML = point.lat().toFixed(7);
document.getElementById("lng").innerHTML = point.lng().toFixed(7);
});
});
}
}
function showAddress(address) {
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
if (geocoder) {
geocoder.getLatLng(
address,
function(point) {
if (!point) {
alert(address + " not found");
} else {
document.getElementById("lat").innerHTML = point.lat().toFixed(7);
document.getElementById("lng").innerHTML = point.lng().toFixed(7);
map.clearOverlays()
map.setCenter(point, 14);
var marker = new GMarker(point, {draggable: true});
map.addOverlay(marker);
GEvent.addListener(marker, "dragend", function() {
var pt = marker.getPoint();
map.panTo(pt);
document.getElementById("lat").innerHTML = pt.lat().toFixed(7);
document.getElementById("lng").innerHTML = pt.lng().toFixed(7);
});
GEvent.addListener(map, "moveend", function() {
map.clearOverlays();
var center = map.getCenter();
var marker = new GMarker(center, {draggable: true});
map.addOverlay(marker);
document.getElementById("lat").innerHTML = center.lat().toFixed(7);
document.getElementById("lng").innerHTML = center.lng().toFixed(7);
GEvent.addListener(marker, "dragend", function() {
var pt = marker.getPoint();
map.panTo(pt);
document.getElementById("lat").innerHTML = pt.lat().toFixed(7);
document.getElementById("lng").innerHTML = pt.lng().toFixed(7);
});
});
}
}
);
}
}
</script>
</head>
<body onload="load()" onunload="GUnload()" >
<p>Glisser-déplacer le pointeur central pour un positionnement fin. Les coordonnées sont rafraichies à la fin de chaque déplacement. </p>
<table bgcolor="#FFFFCC" width="700">
<td>
<tr>
<td width="90"><b>Latitude</b></td>
<td><b>Longitude</b></td>
<td rowspan="2" width="40"> </td>
<td rowspan="2"> <form action="#" onsubmit="showAddress(this.address.value); return false">
<input type="text" size="60" name="address" [color=#BF0000]value="mypersolocation"[/color] />
<input type="submit" value="Chercher" /> </form></td>
</tr>
<tr>
<td id="lat"></td>
<td id="lng"></td>
</tr>
</table>
<br/>
<div align="center" id="map" style="width: 700px; height: 500px"><br/></div>
</body>
</html>
#ce
etc
En fait je me suis pas foulé (un grand merci au site où j'ai pris ce code) nous on a juste à manipuler la carte comme des blaireaux parce que c'est les 2 fonctions javascript de la page qui se tapent tout le boulot de communication avec les apis google

Re: [..] Extraction de latitude/longitude à partir d'une car
Posté : dim. 22 sept. 2013 20:26
par tomy46
Yes tip top ...
En tout cas, nickel pour la réponse a ma question et nickel pour les explications !
Un grand merci à toi !!

Re: [R] Extraction de latitude/longitude à partir d'une cart
Posté : lun. 23 sept. 2013 00:10
par tomy46
Petite info de dernière minute :
Pour le "about:blank" pas besoin du ":" les "
:" suffisent.
Et surtout ne pas oublier le :
Sinon ça passe trop vite à la suite avant la fin du chargement de la carte et ça plante sur le
Voila la version final du code avec toute la page dans la variable
"$html" :
Code : Tout sélectionner
GUICreate("Localisation : Longitude / Latitude", 740, 600)
$oIE = ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($oIE, 0, 0, 740, 540)
_IENavigate($oIE, "about:blank")
_IEDocWriteHTML($oIE, $html)
$oIE.refresh()
$input_lat = GUICtrlCreateInput("", 20, 550, 200, 30)
$input_long = GUICtrlCreateInput("", 240, 550, 200, 30)
GUISetState()
While $oIE.busy
sleep(200)
Wend
$long = _IEGetObjById($oIE, "lng")
$lat = _IEGetObjById($oIE, "lat")
While 1
$old_long = GuiCtrlRead($input_long)
$old_lat = GuiCtrlRead($input_lat)
Sleep(100)
$new_long = $long.innertext
$new_lat = $lat.innertext
If $new_long <> $old_long OR $new_lat <> $old_lat Then
GuiCtrlSetData($input_long, $new_long)
GuiCtrlSetData($input_lat, $new_lat)
EndIf
Wend
Re: [R] Extraction de latitude/longitude à partir d'une cart
Posté : lun. 23 sept. 2013 00:47
par mikell
tomy46 a écrit :Et surtout ne pas oublier le :
Sinon ça passe trop vite à la suite avant la fin du chargement de la carte et ça plante
Foutre c'est vrai j'y avais pas pensé, heureusement que ça s'est trouvé là par hasard dans le code, quelle merveilleuse et bien opportune coïncidence
Pour info la fonction _IENavigate($oIE, "url") a par défaut un paramètre pour attendre la fin du chargement de la page (idem pour _IEAction($oIE, "refresh") ), mais les commandes $oIE.navigate() et $oIE.refresh() n'en disposent pas
Pour le "about:blank" c'est le forum qui de façon indésirable mais carrément autoritaire te remplace le ":" par le ":" (ce qui s'est produit aussi dans le code que tu as posté

)
Re: [R] Extraction de latitude/longitude à partir d'une cart
Posté : lun. 23 sept. 2013 00:52
par tomy46
Je viens de voir les ":" ^^
Petit bonus pour ceux qui voudrait aller un peu plus loin :
Voici une balise Body un peu modifiée pour rendre l'intégration IE plus transparente au sein de l'appli :
Code : Tout sélectionner
<body oncontextmenu=""return false"" ondragstart=""return false"" onselectstart=""return false"" onload=""load()"" onunload=""GUnload()"" >
Re: [R] Extraction de latitude/longitude à partir d'une cart
Posté : lun. 23 sept. 2013 01:02
par mikell
Bonne idée mais pourquoi les double double-quotes ?
Re: [R] Extraction de latitude/longitude à partir d'une cart
Posté : lun. 23 sept. 2013 01:11
par tomy46
Car j'ai tout fait passer dans ce style :
Simple question de goût et d'habitude je dirais ^^
Je boss avec pas mal de commande SQL à coté du coup ça me permet de pas trop jongler avec différentes syntaxes ...