Page 1 of 1

Coordenadas geográficas

Posted: Sun Jun 07, 2020 4:15 pm
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

Re: Coordenadas geográficas

Posted: Mon Jun 08, 2020 12:58 pm
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,

Re: Coordenadas geográficas

Posted: Fri Jun 12, 2020 3:00 pm
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