Jump to content
Fivewin Brasil

Distancia entre dois Pontos


edutraini

Recommended Posts

  • 2 weeks later...

Boa Noite, se entendi vc quer calcular a distancia entre ponto A e B sem usar a API do Google. Segue a função Harbour abaixo:

Ponto A(-45.4392298,-23.658715) - Longitude e Latitude

Ponto B(-45.449916,-23.660759) - Longitude e Latitude

calcDist(-45.4392298,-23.658715,-45.449916,-23.660759) // result calculado pelo Google e o mesmo da funçao 1.11 km

**==============================================
Function calcDist(nLg1, nLt1, nLg2, nLt2)
**==============================================
Local nKm
nKm :=6371*Acos(Cos(PI()*(90-nLt2)/180)*Cos((90-nLt1)*PI()/180)+;
      Sin((90-nLt2)*PI()/180)*Sin((90-nLt1)*PI()/180)*Cos((nLg1-nLg2)*PI()/180))
Return nKm

 

Link to comment
Share on other sites

  • 2 weeks later...
 

Boa Noite, se entendi vc quer calcular a distancia entre ponto A e B sem usar a API do Google. Segue a função Harbour abaixo:

Ponto A(-45.4392298,-23.658715) - Longitude e Latitude

Ponto B(-45.449916,-23.660759) - Longitude e Latitude


calcDist(-45.4392298,-23.658715,-45.449916,-23.660759) // result calculado pelo Google e o mesmo da funçao 1.11 km

**==============================================
Function calcDist(nLg1, nLt1, nLg2, nLt2)
**==============================================
Local nKm
nKm :=6371*Acos(Cos(PI()*(90-nLt2)/180)*Cos((90-nLt1)*PI()/180)+;
      Sin((90-nLt2)*PI()/180)*Sin((90-nLt1)*PI()/180)*Cos((nLg1-nLg2)*PI()/180))
Return nKm

 

Grato pela resposta

 

isso já me ajuda a calcular se o veiculo está chegando ao destino, pois eu pego pelo rastreador a posição atual dele, e no cadastro do cliente tenhop o Lat e Long do endereco

 

Link to comment
Share on other sites

Assim como na func acima, api do Google que permite cálculo em linha reta:

//google.maps.geometry.spherical.computeDistanceBetween(p1, p2).toFixed(2);
FWRITE(nHAND,[  calcDistance: function(p1, p2){                                  ]+CRLF)
FWRITE(nHAND,[    var tmp = google.maps.geometry.spherical.computeDistanceBetween(p1, p2); ]+CRLF)
FWRITE(nHAND,[    var ret;                                                       ]+CRLF)
FWRITE(nHAND,[    obj.km = obj.km + tmp;                                         ]+CRLF)
FWRITE(nHAND,[    if (obj.km < 1000){                                            ]+CRLF)
FWRITE(nHAND,[      ret = 'PA: '+(Math.round(tmp))+" Total: "+]) //continua
FWRITE(nHAND,[(Math.round(obj.km))  + " m";                                      ]+CRLF)
FWRITE(nHAND,[    }else{                                                         ]+CRLF)
FWRITE(nHAND,[      ret = 'PA: '+(Math.round(tmp / 10) / 100)+" Total: "+]) //continua
FWRITE(nHAND,[(Math.round(obj.km / 10) / 100) + " km";                           ]+CRLF)
FWRITE(nHAND,[    }                                                              ]+CRLF)
FWRITE(nHAND,[    return ret;                                                    ]+CRLF)
FWRITE(nHAND,[  },                                                               ]+CRLF)

JMSilva

Caraguá/SP

Link to comment
Share on other sites

Calcular a distância entre dois pontos via Api Google obedecendo traçado da rota. 

function calcRoute() {                                            
  var request = {                                                 
    origin: new google.maps.LatLng(-23.621236,-45.385464),                     
    destination: new google.maps.LatLng(-23.710194,-45.442806),                
    travelMode: google.maps.TravelMode.DRIVING                    
  };                                                              
  directionsService.route(request, function(response, status) {   
    if (status == google.maps.DirectionsStatus.OK) {              
      directionsDisplay.setDirections(response);                  
    }                                                             
  });                                                             
}                                                                 
function computeTotalDistance(result) {                           
  var total = 0;                                                  
  var myroute = result.routes[0];                                 
  for (var i = 0; i < myroute.legs.length; i++) {                 
    total += myroute.legs[i].distance.value;                      
  }                                                               
  total = total / 1000.0;                                         
  document.getElementById('total').innerHTML = total + ' km';     
}                                                                 

JMSilva - Caraguá/SP

Link to comment
Share on other sites

  • 3 months later...
 

pode ser feito assim ( com base no  site: http://cbsa.com.br/post/calcular-distancia-entre-dois-enderecos---google-maps-api.aspx )

JSON exemplo:


Function Dist2Pontos(cOrig, cDest)
    Local oServer, cUrl, aArray, erro

    DEFAULT cOrig := "Rua Dom Joaquim de Melo, 1278 - Rodolfo Teófilo, Fortaleza - CE"
    DEFAULT cDest := "Rua Clarindo de Queiroz, 1587 - Centro, Fortaleza - CE"

    cUrl := "http://maps.googleapis.com/maps/api/distancematrix/json?origins="+cOrig+"&destinations="+cDest+"&mode=driving&language=pt-BR&sensor=false"

    Try
        oServer := CreateObject( 'MSXML2.ServerXMLHTTP.6.0' )
    Catch erro
        ? erro:Description
        return nil
    End

    oServer:open('GET', cUrl, .f.)
    oServer:send()

    If oServer:Status != 200
       MsgStop(Alltrim(STR(oServer:Status))+" - "+oServer:StatusText , "Erro")
       Return nil
    Endif

    While oServer:readyState != 4
       oServer:WaitForResponse(1000)
    End

    hb_jsondecode(oServer:responseText, @aArray)

    If aArray == nil
        MsgStop("Erro ao retornar os dados.")
        Return nil
    Endif

    If aArray['status'] != 'OK'
       MsgStop(aArray['message'], "Erro")
       Return nil
    Else

       xbrowse(aArray)

       ? oServer:responseText

       ? aArray["rows"][1]["elements"][1]["distance"]["text"]
       ? aArray["rows"][1]["elements"][1]["duration"]["text"]

Endif

Return nil

Retorno do JSON


{
   "destination_addresses" : [ "Rua Clarindo de Queiroz, 1587 - Centro, Fortaleza - CE, Brasil" ],
   "origin_addresses" : [
      "Rua Dom Joaquim de Melo, 1278 - Rodolfo Teófilo, Fortaleza - CE, 60430-660, Brasil"
   ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "2,8 km",
                  "value" : 2798
               },
               "duration" : {
                  "text" : "9 minutos",
                  "value" : 521
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}

Tipos de Status que pode retorna: 
OK retorno válido.
INVALID_REQUEST requisição inválida.
MAX_ELEMENTS_EXCEEDED origem ou destino ultrapassaram o numero máximo de caracteres..
OVER_QUERY_LIMIT aplicação excedeu o número máximo de requisições em um determinado período.
REQUEST_DENIED sua aplicação bloqueou o uso do Distance Matrix.
UNKNOWN_ERROR erro no servidor. Tente novamente que pode funcionar.

pode ser feito retornando em XML (ver no link do site que passei no inicio do post)

eu particularmente prefiro o mapa: 

 

Desculpem-me, mas nesse assunto sou totalmente leigo. Tentei compilar em fw+xharbour 13.07 e deu falta da function hb_jsondecode.

Gostaria de saber quais libs e includes devo colocar no projeto.

 

Link to comment
Share on other sites

  • 1 year later...

Bom dia, Pessoal

Ah um tempo atras postei esse tema e conseguir funcionar perfeitamente

De uns tres meses para ca o aplicativo do google foi desativado parece que agora tem que pagar 

Alguem poderia me dar uma dica se existe alguma outra forma de calcular a distancia entre dois pontos

Essa rotina meu cliente colocava o endereco de entrega e o sistema conseguir calcular a distancia para poder fazer o calculo do frete


   cOrig := alltrim(End_Empr)+" - "+alltrim(Bai_Empr)+","+alltrim(Cid_Empr)+" - "+Est_Empr
   cDest := alltrim(End_Clie)+" - "+alltrim(Bai_Clie)+","+alltrim(Cid_Clie)+" - "+Est_Clie
   
    
    
    
    
    
    cUrl := "http://maps.googleapis.com/maps/api/distancematrix/json?origins="+cOrig+"&destinations="+cDest+"&mode=driving&language=pt-BR&sensor=false"
 

Link to comment
Share on other sites

 

Bom dia, Pessoal

Ah um tempo atras postei esse tema e conseguir funcionar perfeitamente

De uns tres meses para ca o aplicativo do google foi desativado parece que agora tem que pagar 

Alguem poderia me dar uma dica se existe alguma outra forma de calcular a distancia entre dois pontos

Essa rotina meu cliente colocava o endereco de entrega e o sistema conseguir calcular a distancia para poder fazer o calculo do frete


   cOrig := alltrim(End_Empr)+" - "+alltrim(Bai_Empr)+","+alltrim(Cid_Empr)+" - "+Est_Empr
   cDest := alltrim(End_Clie)+" - "+alltrim(Bai_Clie)+","+alltrim(Cid_Clie)+" - "+Est_Clie
   
    
    
    
    
    
    cUrl := "http://maps.googleapis.com/maps/api/distancematrix/json?origins="+cOrig+"&destinations="+cDest+"&mode=driving&language=pt-BR&sensor=false"
 

Bom dia, nem pagando da certo, eles mudaram alguma coisa na API, referente a pegar lat. e long, informando o endereço, se vc já tiver esta informação e mandar direto o numero da certo. 

Link to comment
Share on other sites

Amiguinhos,

Agora existe a necessidade de cadastro como desenvolvedor para APIs do Google, onde você recebe um token que deve ser incluso nas chamadas as APIs.

O cadastro é gratuíto, mas tem se um limite mensal de buscas. 

Para se cadastrar como Google Developer é necessário tem uma conta de email no GMail, se não tem crie uma agora.

Após criar sua conta de email crie sua conta Google Developer.

Quando eu criei a minha a taxa estava em U$ 5,00 agora tá salgada U$ 25,00.

Ops, pulem as três linhas anteriores(vou deixá-las somente para documentação)

O local de cadastro na plataforma de mapas é aqui

 

 

Link to comment
Share on other sites

  • 4 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...