FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Distancias por carretera entre dos puntos con GoogleMaps
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Distancias por carretera entre dos puntos con GoogleMaps
Posted: Tue Jun 08, 2010 09:54 PM
Necesito hacer un programa que mida distancias entre dos puntos "por carretera" con el API de GoogleMaps.
Es decir: Hacer una llamada CGI del tipo http://maps.google.es/maps?hl=es&tab=wl........ etc... y capturar la pagina de retorno con funciones de oIE:=Createobject("InternetExplorer.Application") oIE:Navigate2(cUrl) oIE:innerHTML() oIE:innerText() etc... y coger la distancia.

Creo haberme explicado, gracias.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 566
Joined: Thu Aug 30, 2007 03:40 PM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Fri Jun 11, 2010 11:29 AM

hi, i need this too, someone can help?

Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Fri Jun 11, 2010 01:23 PM
I think you need MapPoint software and use their methods to get that info:

You can try the following code:
Code (fw): Select all Collapse
local hToolBar, hStandard, oMapPoint, nDist, oMap, oActive
oActive = TActiveX():New( oWnd, "MapPoint.Control.16" )

oMap := oActive:Do( "Newmap", 1 )
hToolBar = oActive:GetProp( "Toolbars" )

oMap := oActive:ActiveMap()
oStartLocation:= oMap:FindResults("205 Broadway, Lawrence, MA"):Item(1)
oEndLocation:= oMap:FindResults("77 Centre Street, Roxbury, MA"):Item(1)

msgInfo( oMap:Distance( oStartLocation, oEndLocation ), "Distance" )



Regards

George
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Fri Jun 11, 2010 08:52 PM
Tanks George
George wrote:I think you need MapPoint software...
I what I want am that she is free.

I have solved it using WinHTTP windows services and the URL http://maps.google.es/maps...

Example: Distance Madrid to Paris.
Code (fw): Select all Collapse
local oHttp,cTextoHTML
   Try
      oHttp:=CreateObject("winhttp.winhttprequest.5.1")
      oHttp:SetTimeouts(30000,30000,30000,30000)
      oHttp:Open("GET","<strong>http://maps.google.es/maps?saddr=Madrid&daddr=París</strong>",.F.)
      oHttp:Send()
      cTextoHTML:=oHttp:ResponseText()
   Catch
      cTextoHTML:="Error"
   End Try


Search string in var cTextoHTML "1.270 km – aprox. 12h 11 min" in HTML code is "<div><b>1.270&#160;km</b> &#8211; aprox. <b>12h 11 min</b></div>".
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 581
Joined: Tue Oct 11, 2005 11:28 AM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Mon Jun 14, 2010 05:56 PM

JmGarcia,

Y como hiciste para coger el string?

Kleyber Derick



FWH / xHb / xDevStudio / SQLLIB
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Mon Jun 14, 2010 09:02 PM
Kleyber wrote:Y como hiciste para coger el string?
Con un "sniffer".
Justo antes de pulsar el boton de enviar (en Google Maps) pongo el "snifer a escuchar" la trama ethernet que envia el navegador. Los snifer que uso son el Analyzer y el Ethereal

Despues solo es cuestion de buscar la cadena GET o POST que se ha enviado. Es algo asi:
GET /maps?f=d&source=s_d&saddr=madrid&daddr=paris&hl=es&geocode=&abauth=b5f75994:aQ681J0Cduy_G3Fuv48v8fvBOr4&mra=ls&vps=1&output=js&jsv=247a&sll=40.396764,-3.713379&sspn=17.117291,14.128418 HTTP/1.1

Entonces la cadena que interesa es /maps?f=d&source=s_d&saddr=madrid&daddr=paris y como el site es "maps.google.es" pues se añade y ya esta:
http://maps.google.es/maps?f=d&source=s_d&saddr=madrid&daddr=paris

Solo es cuestion de ir cambiando las cadenas de las ciudades.

Saludos.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 632
Joined: Thu Jan 19, 2006 10:45 AM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Mon Jun 14, 2010 09:24 PM

Hola JMGarcia, estoy siguiendo de cerca tu trabajo y ahora me he puesto a investigar como trabaja GoogleMaps y me surgen una serie de preguntas, para medir la distancia entre dos puntos, supongo que se tiene que tener instalando un Mapplet, puesto que segun creo GoogleMaps no tiene instalado alguno por defecto, cual tienes instalado?. La distancia entre dos puntos es lineal, supongo, no te refieres a trayectorias entre dos puntos, que creo que también hace googlemaps por lo que he visto en algún ejemplo.

Por otra parte, supongo que a los metodos GET y POST a que te refieres son ejemplos que ya han salido en el foro, o son propios del objeto oHttp:=CreateObject("winhttp.winhttprequest.5.1"). Por otra parte, con esos metodos puedes obtener la latitud y longitud de un punto determinado del mapa que marques con el raton, sabes como hacerlo?.

Hay forma de contactar contigo para hablar sobre el tema?

Saludos



Andrés González desde Mallorca
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Mon Jun 14, 2010 09:35 PM
Andrés González wrote:...para medir la distancia entre dos puntos...
Esto que he hecho GoogleMaps me devuelve la distancia por carretera.
Una vez que me devuelve la pagina HTML con cTextoHTML:=oHttp:ResponseText() me dedico a "analizar" el contenido en busca de los datos de los km que estan en un string de este tipo <div><b>1.270&#160;km</b> &#8211; aprox. <b>12h 11 min</b></div>
Yo no tengo nada instalado, ni Mapplet ni nada, solo uso GoogleMaps haciendole una peticion como si la hiciera "a mano".



Andrés González wrote:...Por otra parte, con esos metodos puedes obtener la latitud y longitud de un punto determinado del mapa que marques con el raton, sabes como hacerlo?...
Todo lo que te de GoogleMaps en formato HTML es posible cogerlo.



Andrés González wrote:...Hay forma de contactar contigo para hablar sobre el tema?...
Te envio un e-mail a tu correo de gmail.com
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 581
Joined: Tue Oct 11, 2005 11:28 AM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Tue Jun 15, 2010 12:21 PM
JmGarcia wrote:
Kleyber wrote:Y como hiciste para coger el string?
Con un "sniffer".
Justo antes de pulsar el boton de enviar (en Google Maps) pongo el "snifer a escuchar" la trama ethernet que envia el navegador. Los snifer que uso son el Analyzer y el Ethereal

Despues solo es cuestion de buscar la cadena GET o POST que se ha enviado. Es algo asi:
GET /maps?f=d&source=s_d&saddr=madrid&daddr=paris&hl=es&geocode=&abauth=b5f75994:aQ681J0Cduy_G3Fuv48v8fvBOr4&mra=ls&vps=1&output=js&jsv=247a&sll=40.396764,-3.713379&sspn=17.117291,14.128418 HTTP/1.1

Entonces la cadena que interesa es /maps?f=d&source=s_d&saddr=madrid&daddr=paris y como el site es "maps.google.es" pues se añade y ya esta:
http://maps.google.es/maps?f=d&source=s_d&saddr=madrid&daddr=paris

Solo es cuestion de ir cambiando las cadenas de las ciudades.

Saludos.



Muchas gracias por la aclaración.

Saludos,
Kleyber Derick



FWH / xHb / xDevStudio / SQLLIB
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Tue Jun 15, 2010 08:15 PM
Os dejo el codigo fuente del "calculador de distancias por carretera" que he hecho y que consulta a GoogleMaps y de la pagina HTML de respuesta extracta los datos.

Todo el truco esta en esta linea oHttp:Open("GET","http://maps.google.es/maps?saddr="+alltrim(cOrigen)+"&daddr="+alltrim(cDestino),.F.) y en la pagina que responde cTextoHTML:=oHttp:ResponseText()

Code (fw): Select all Collapse
#include "FiveWin.ch"

static oDlg,cOrigen:="",cDestino:="",cTextoHTML:="",nDistancia:=0,cTiempo:=""
static oGet1,oGet2,oBtn1,oBtn2,nSeg:=0

function main()
set exact on
set date french
set century on
cOrigen:=left("Madrid, Spain"+space(255),255)
cDestino:=left("Paris, France"+space(255),255)
oHttp:=CreateObject("winhttp.winhttprequest.5.1")
DEFINE DIALOG oDlg TITLE "Calculador de distancias por carretera"
@ 1,  2 SAY "Origen" OF oDlg
@ 1,  5 GET oGet1 VAR cOrigen  OF oDlg SIZE 90, 10 PICTURE replicate("X",255)
@ 1.8,2 SAY "Destino" OF oDlg
@ 2,  5 GET oGet2 VAR cDestino OF oDlg SIZE 90, 10 PICTURE replicate("X",255)
@ 3,  7 BUTTON oBtn1 PROMPT "&Ok"       SIZE 30, 12 OF oDlg ACTION Calcular()
@ 3, 16 BUTTON oBtn2 PROMPT "&Cancelar" SIZE 30, 12 OF oDlg ACTION oDlg:End()
ACTIVATE DIALOG oDlg CENTERED
return nil

function Calcular()
local Aux,Aux1
nSeg:=seconds()
CursorWait()
oGet1:Disable()
oGet2:Disable()
oBtn1:Disable()
oBtn2:Disable()
Try
   oHttp:SetTimeouts(30000,30000,30000,30000)
   oHttp:Open("GET","http://maps.google.es/maps?saddr="+alltrim(cOrigen)+"&daddr="+alltrim(cDestino),.F.)
   oHttp:Send()
   cTextoHTML:=oHttp:ResponseText()
Catch
   cTextoHTML:="Error"
End Try
// Buscar una cadena de este tipo "<div><b>702 km</b> – aprox. <b>6h 48 min</b></div>"
Aux:=" km</b>"
if .not. Aux $ cTextoHTML
   CursorArrow()
   MsgInfo("Imposible calcular distancia","Informacion")
   oGet1:Enable()
   oGet2:Enable()
   oBtn1:Enable()
   oBtn2:Enable()
   return nil
endif
cTextoHTML:=substr(cTextoHTML,at(Aux,cTextoHTML)-25)
Aux:="<div>"
cTextoHTML:=substr(cTextoHTML,at(Aux,cTextoHTML))
Aux:="</div>"
cTextoHTML:=left(cTextoHTML,at(Aux,cTextoHTML)+len(Aux)-1)
Aux:="<div><b>"
Aux1:=substr(cTextoHTML,at(Aux,cTextoHTML)+len(Aux))
Aux:=" km"
Aux1:=left(Aux1,at(Aux,Aux1)+len(Aux)-1)
do while "." $ Aux1 // Quita los PUNTOS 
   Aux1:=stuff(Aux1,at(".",Aux1),1,"")
enddo
nDistancia:=val(Aux1)
Aux:="</b> – aprox. <b>"
Aux1:=substr(cTextoHTML,at(Aux,cTextoHTML)+len(Aux))
Aux:="</b></div>"
Aux1:=left(Aux1,at(Aux,Aux1)-1)
cTiempo:=Aux1
CursorArrow()
MsgInfo("De "+chr(34)+upper(alltrim(cOrigen))+chr(34)+;
        " a " +chr(34)+upper(alltrim(cDestino))+chr(34)+;
        " hay "+alltrim(str(nDistancia))+" km."+chr(13)+;
        "Tiempo por carretera "+cTiempo,;
        "Informacion ("+alltrim(str(seconds()-nSeg,5,1))+"seg.)")
oGet1:Enable()
oGet2:Enable()
oBtn1:Enable()
oBtn2:Enable()
return nil
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Posts: 581
Joined: Tue Oct 11, 2005 11:28 AM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Tue Jun 15, 2010 10:45 PM

Muchisimas gracias.

Saludos,

Kleyber Derick



FWH / xHb / xDevStudio / SQLLIB
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Tue Jun 15, 2010 11:13 PM

JMGarcía:

Excelente !, se agradece.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 581
Joined: Tue Oct 11, 2005 11:28 AM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Wed Jun 16, 2010 12:26 AM

JMGarcia,

Has intentado hacer esto, pero allá de tener la distancia, si se puede tener otra dialog con el mapa que tiene Google Maps?

saludos,

Kleyber Derick



FWH / xHb / xDevStudio / SQLLIB
Posts: 581
Joined: Tue Oct 11, 2005 11:28 AM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Wed Jun 16, 2010 12:36 AM

Me respondo. Usando el oIE:=Createobject("InternetExplorer.Application"), oIE:Navigate2(cUrl), etc.

Saludos,

Kleyber Derick



FWH / xHb / xDevStudio / SQLLIB
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Distancias por carretera entre dos puntos con GoogleMaps
Posted: Wed Jun 16, 2010 06:28 AM
Kleyber wrote:Me respondo. Usando el oIE:=Createobject("InternetExplorer.Application"), oIE:Navigate2(cUrl), etc.
Efectivamente...
Como a mi solo me interesa la distancia me vale con tener la página web en una variable string con cTextoHTML:=oHttp:ResponseText()
Si quieres puedes hacer después MemoWrit("Distancia.html",cTextoHTML) y ya tienes la página.
Se pueden usar mas parámetros en la URL como zoom, tipo de mapa, etc... sería cuestion de investigar.

Tambien para saber las coordenadas geodésicas de un lugar poner este tipo de URL "http://maps.google.es/maps?q=Calle Gran Via 1, Madrid" y en la página de respuesta buscar la cadena strin siguiente "viewport:{center:" y despues de esta está una cadena de este tipo "{lat:40.419148,lng:-3.6977530000000001}," que son las coordenadas.
Es decir, la cadena string es "viewport:{center:{lat:40.419148,lng:-3.6977530000000001},"
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.

FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013