Coordenadas geográficas

Post Reply
jgabri
Posts: 17
Joined: Mon Jan 14, 2019 11:43 am

Coordenadas geográficas

Post by jgabri »

Hola grupo

Estoy buscando una función, que al pasarle una dirección me devuelva, la longitud y latitud geográfica, he estado haciendo pruebas con una función del master Navarro, funciona algunas veces y otra no, la dirección está bien, algo falla, me pueden ayudar ?

Function GeoCoordenadas( cPostal_Code, cStreet, cNumber, cLocality, cState)

Local cWeb := "http://maps.google.es/maps/place/"
local cMap
local cRet := ""
local oOle
local nPos1
local nPos2
local aCoor := { 0, 0, 0 }
local cNation:="Spain"


cPostal_Code := StrTran( AllTrim( cPostal_Code ), ' ', '+' )
cStreet := StrTran( AllTrim( cStreet ), ' ', '+' )
cNumber := StrTran( AllTrim( cNumber ), ' ', '+' )
cLocality := StrTran( AllTrim( cLocality ), ' ', '+' )
cState := StrTran( AllTrim( cState ), ' ', '+' )
cNation := StrTran( AllTrim( cNation ), ' ', '+' )
cMap := AllTrim( cPostal_Code ) + "+" + AllTrim( cStreet ) + "+" + ;
AllTrim( cNumber ) + "+" + AllTrim( cLocality ) + "+" + ;
AllTrim( cState ) + "+" + AllTrim( cNation )
oOle := CreateObject("Winhttp.WinHttpRequest.5.1")
oOle:Open( "GET", cWeb + AllTrim( cMap ), .F. )
oOle:Send()
cURL := oOle:ResponseText
nPos1 := At( "/@", cUrl )

Msginfo(cWeb + AllTrim( cMap ))



if !Empty( nPos1 )
nPos2 := At( "/data", cUrl )
cRet := Substr( cUrl, nPos1, nPos2 - nPos1 )
if !Empty( nPos2 )
cRet := StrTran( cRet, "/@", "" )
aCoor := hb_ATokens( cRet, "," )
endif
endif

aCoor := { aCoor[ 1 ], aCoor[ 2 ] }

// Msginfo( aCoor[ 1 ])
// Msginfo( aCoor[ 2 ])


Return aCoor

Un saludo,
Gabriel
User avatar
jrestojeda
Posts: 543
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Re: Coordenadas geográficas

Post by jrestojeda »

Hola, cómo estás?
Yo tengo el siguiente código que lo uso hace bastantes años, pero del mismo modo, no siempre me ubica las coordenadas.
Lo dejo así puedes probarlo.

Code: Select all

// GEOLOCALIZACION DE DIRECCION //
Function ConsultoDireccion(Calle,Localidad,Provincia,Pais)

cCalle    :=STRTRAN(Calle    ," ","%20")
cLocalidad:=STRTRAN(Localidad," ","%20")
cProvincia:=STRTRAN(Provincia," ","%20")
cPais     :=STRTRAN(Pais     ," ","%20")

cCalle    :=ALLTRIM(cCalle)
cLocalidad:=ALLTRIM(cLocalidad)
cProvincia:=ALLTRIM(cProvincia)
cPais     :=ALLTRIM(cPais)

// URL Sin Key del API de google maps
cUrl:="https://maps.googleapis.com/maps/api/geocode/xml?address="+cCalle+" "+cLocalidad+" "+cProvincia+" "+cPais+"&sensor=false"

// URL Con Key del API de google maps
//cUrl:="https://maps.googleapis.com/maps/api/geocode/xml?address="+cCalle+" "+cLocalidad+" "+cProvincia+" "+cPais+"&sensor=false&key=AQUI_VA_LA_CLAVE" 

aCoordenadas:={}

oFe:=CreateObject("MSXML2.ServerXmlHttp")
IF Hb_IsObject(oFe)
   oFe:Open("GET",cUrl,.F.)
   oFe:Send()
   cTexto1 := oFe:ResponseText

   Private oXmlDoc := TXmlDocument():New()
   Private oXmlNode

   oXMlDoc:READ(cTexto1)

   oXmlNode  := oXmlDoc:FindFirst("status")
   cValor    := oXmlNode:cData

   IF cValor="ZERO_RESULTS"
      MsgInfo("Atención: Dirección no encontrada, cambie los parámetros y vuelva a intentarlo.","Por favor verifique")
      Return aCoordenadas
   ENDIF

   IF cValor<>"OK"
      MsgInfo("Atención: Dirección no encontrada, cambie los parámetros y vuelva a intentarlo.","Por favor verifique")
      Return aCoordenadas
   ENDIF

   oXmlNode  := oXmlDoc:FindFirst("lat")
   cLatitud  := oXmlNode:cData

   oXmlNode  := oXmlDoc:FindFirst("lng")
   cLongitud := oXmlNode:cData

   AADD(aCoordenadas, cLatitud  )
   AADD(aCoordenadas, cLongitud )

ENDIF

Return aCoordenadas
//
Puede que google limite la cantidad de consultas permitidas. Para trabajar sin límite de consultas posiblemente tengas que generar una Key del Api de google maps.

Saludos,
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
jgabri
Posts: 17
Joined: Mon Jan 14, 2019 11:43 am

Re: Coordenadas geográficas

Post by jgabri »

Gracias por la respuesta, pasa igual que con el código del master Navarro, algunas veces funciona y otras no, a ver si alguien nos puede ayudar ?

Un saludo,
Gabriel
Post Reply