Olá pessoal, esta semana estava procurando alguma forma fácil de calcular o frete pago para o motoboy fazer o delivery do restaurante que prestamos serviço, o Miranda Restaurante, Hamburgueria e Massas aqui de Curitiba.
Para fazer isso precisei criar uma conta no Google Cloud e ativei a API Distance Matrix Service para conseguir uma chave de acesso para browser.
Usei também o Bootstrap para o visual não ficar no HTML puro.

Para o script abaixo funcionar, basta criar uma pagina HTML e fazer um copy and paste. Vai ser necessário por a chave do google no lugar do YOUR_API_KEY.
Para calcular o valor do frete com a API Matrix, é necessário informar um endereço de origem e um de destino. No nosso caso, como o endereço de origem sempre será o mesmo, foi deixado fixo no formulário com input hidden. Mas se for preciso alterar a origem ou deixar livre para edição, basta mudar o input de hidden para text.
Para facilitar a vida de quem irá pesquisar o frete, coloquei no form o onsubmit=”getDistanceValue();” para que quando terminar de preencher o campo e apertar o ENTER já inicia a pesquisa.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<script src="http://code.jquery.com/jquery-1.8.1.js" type="text/javascript"></script>
<script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<style>
.button {
background-color: #4CAF50;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 4px 2px;
cursor: pointer;
}
@media (max-width: @screen-xs) {
body{font-size: 14px;}
}
@media (max-width: @screen-sm) {
body{font-size: 16px;}
}
h5{
font-size: 1.2em;
}
</style>
</head>
<body>
<script type="text/javascript">
function getDistanceValue() {
//API gerada no Google
var origin = $("#origin").val();
var destination = $("#destination").val() + ", Curitiba - PR, Brasil";
var service = new google.maps.DistanceMatrixService;
service.getDistanceMatrix({
origins: [origin],
destinations: [destination],
travelMode: 'DRIVING',
unitSystem: google.maps.UnitSystem.METRIC,
avoidHighways: false,
avoidTolls: false
}, function(response, status) {
if (status == "OK") {
//KM price
var pricePerKM = 1.6;
//meter to kilometer conversion
var distance = response.rows[0].elements[0].distance.value;
var distanceKM = (distance/1000);
var price = (Math.ceil(distanceKM) * pricePerKM).toFixed(2);
$('#litResultado').html(
"<li class='list-group-item'><strong>Origem</strong>: " + response.originAddresses[0] + "</li>"
+ "<li class='list-group-item'><strong>Destino</strong>: " + response.destinationAddresses[0] + "</li>"
+ "<li class='list-group-item'><strong>Distância</strong>: " + response.rows[0].elements[0].distance.text + "</li>"
+ "<li class='list-group-item'><strong>Duração</strong>: " + response.rows[0].elements[0].duration.text + "</li>"
+ "<li class='list-group-item list-group-item-success'><strong>Preço</strong>: " + price + "</li>");
} else {
$('#litResultado').html('Ocorreu um erro');
}
}
);
}
</script>
<div class="container-fluid">
<div class="card">
<div class="card-header"><h5>Calcular Frete</h5></div>
<div class="card-body">
<p class="card-text">
<form onsubmit="getDistanceValue(); return false;">
<input type="hidden" id="origin" value="R. Prof. Ulisses Vieira, 824 - Vila Izabel, Curitiba - PR, 80320-090, Brasil" />
<div class="form-group">
<label for="destination">Destino</label>
<input type="text" class="form-control" id="destination" placeholder="endereço">
</div>
<input type="button" value="Calcular distância" class="btn btn-primary" onclick="getDistanceValue()" />
</form>
</p>
<ul class="list-group" id="litResultado">
</ul>
</div>
</div>
</div>
</body>
</html>
Caso tenha alguma dúvida deixe um comentário que terei prazer em ajudar.
Comentários são bem-vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.