Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde amigos,
estou criando um sistema delivery, e o restaurante vai entregar apenas em 1 cidade e em alguns bairros apenas dessa cidade, e tenho duvidas de como criar a programação, pensei em gravar no banco o nome dos bairros e o usuário ao digitar o cep consigo pegar o nome do bairro e cidade e comparar no banco se o mesmo esta cadastrado na lista de entrega, sera que tem alguma forma melhor de fazer isso?
Se liga
Peguei os códigos o exemplo passado e olha q massa o resultado:
Esse seria o SQL:
create database imasters;
use imasters;
CREATE TABLE pessoa (
id int(8) auto_increment primary key
,nome varchar(50)
,lat float(9,6) NOT NULL
,lng float(9,6) NOT NULL
);
INSERT INTO pessoa (nome, lat, lng) VALUE
('Vit', -23.9789580, -46.3121512)
,('Rafa', -23.9772151, -46.3082780)
,('João', -23.9581367, -46.3925527)
,('Rodrigo', -23.9366827, -46.3882702)
,('Celso', -23.9739162, -46.3122721)
,('allex', -23.9614568, -46.3247244);
/*
-- Rafa
-23.9772151
-46.3082780
*/
SELECT
(((acos(sin((-23.9772151*pi()/180)) * sin((`lat`*pi()/180))+cos((-23.9772151*pi()/180)) * cos((`lat`*pi()/180)) * cos(((-46.3082780- `lng`)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance
,nome
FROM pessoa
WHERE 15 <= 15
order by distance
;
/*
-- Result:
+------------------------+---------+
| distance | nome |
+------------------------+---------+
| 0.00013425232662457948 | Rafa |
| 0.43878413150349677 | Vit |
| 0.5470051287699728 | Celso |
| 2.4210902068465825 | allex |
| 8.821210177019271 | João |
| 9.29394275935523 | Rodrigo |
+------------------------+---------+
6 rows in set (0.00 sec)
*/
E aqui a prova que realmente a distancia está correta, utilizando a formula:
Demo Online:
https://fiddle.jshell.net/7b9q523t/1/
Full-Text Code:
<!DOCTYPE HTML>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id='map' style='width:500px;height:500px;'></div> <!-- Map from JavaScript, GoogleApi -->
<script type='text/javascript' src='https://maps.googleapis.com/maps/api/js?key=AIzaSyCY8sYzhYp8LCHGmzOuGBEInsWw62j_6LU&callback=initMap' async defer></script>
<script type="text/javascript">
function initMap() {
var lugares = [];
lugares.push({
nome : 'Vit'
,lat : -23.9789580
,lng : -46.3121512
});
lugares.push({
nome : 'Rafa'
,lat : -23.9772151
,lng : -46.3082780
});
lugares.push({
nome : 'João'
,lat : -23.9581367
,lng : -46.3925527
});
lugares.push({
nome :'Rodrigo'
,lat :-23.9366827
,lng :-46.3882702
});
lugares.push({
nome : 'Celso'
,lat : -23.9739162
,lng : -46.3122721
});
lugares.push({
nome : 'allex'
,lat : -23.9614568
,lng : -46.3247244
});
//Starta pelo Vit
var latlng = new google.maps.LatLng(lugares[0].lat, lugares[0].lng);
var map = new google.maps.Map(document.getElementById('map'), {
center: latlng
,zoom: 12
,mapTypeId: google.maps.MapTypeId.ROADMAP
});
// console.log(lugares); // Lugares vem do WP
for(i in lugares){
new google.maps.Marker({
position: new google.maps.LatLng(lugares[i].lat, lugares[i].lng)
,map: map
,title: lugares[i].nome
,draggable: false
// ,icon: defs.inwork_img_icon + lugares[i].icon_id
});
}
}
</script>
</body>
</html>Ps: segue a dica do @hinom
Utiliza o Having para filtragem.
Uma pena o cara ter sido banido.
Parecia ser monstro no entendimento de SQL, performace e type-date :(
Ou então, de um jeito mais fácil, rsrs...
$bairros_que_entrega = [
'bairro1',
'bairro2',
'bairro3',
'bairro4'
];
// aqui você faz uma consulta ao ws dos correios a partir do cep
// ele retornará o UF, Logradouro, Bairro, etc..
// caso seja do PR...
if( $UF_vindo_do_ws == 'PR' ){
if( in_array( $bairro_vindo_do_ws , $bairros_que_entrega ){
echo 'Fazemos entrega para seu bairro!';
}else{
echo 'Desculpe, o delivery não está disponível na sua região.';
}
}Api do Google Maps ja te da isso pronto, só defina o raio ou km de distancia
Alem dos exemplos acima, oque achei que funciona com ceps online foi este
http://cbsa.com.br/post/calcular-distancia-entre-dois-enderecos---google-maps-api.aspx
Raio
>
Em 28/01/2017 at 01:01, Williams Duarte disse:
Api do Google Maps ja te da isso pronto,
A questão é...
https://developers.google.com/maps/pricing-and-plans/?hl=pt-br
"
Serviços web ->
Gratuito até 2.500 solicitações por dia.
"
Já exibição é 25k/view, da uma margenzinha melhor pra manter o serviço sem custo (ou diminuir)
Pra atingir isso ai em qualquer aplicação meketreff é rapidinho, já que é possível fazer esse calculo vale muito a pena saber o mesmo
De qualquer forma muito maneiro a formula que o Beraldo ensinou hahaha, sempre que posso eu repasso ela.
Um dos contras é o termo de uso:
>
Citar
No caching or storage. You will not pre-fetch, cache, index, or store any Content to be used outside the Service, except that you may store limited amounts of Content solely for the purpose of improving the performance of your Maps API Implementation due to network latency (and not for the purpose of preventing Google from accurately tracking usage), and only if such storage:
-
is temporary (and in no event more than 30 calendar days);
-
is secure;
-
does not manipulate or aggregate any part of the Content or Service; and
-
does not modify attribution in any way.
https://developers.google.com/maps/terms
Então é bom conseguir uma alternativa pra 'pegar' as coordenadas de GEO/LAT hehe.
Sim.
Utilizando trigonometria esférica
Dado a geocalização (lat/lng) você consegue fazer a formula para trazer se a distancia está dentro do raio.
Formula:
https://pt.wikipedia.org/wiki/F%C3%B3rmula_de_Haversine
Tópico parecido:
http://forum.imasters.com.br/topic/444715-resolvidousuarios-mais-proximos-google-maps/
Vou bolar um exemplo (até pq acho muito louco isso haha)
ps: aprendi essa em um post com o Beraldo, porem não achei o msm para referenciar :(