tony_lu 1 Denunciar post Postado Janeiro 26, 2017 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? Compartilhar este post Link para o post Compartilhar em outros sites
gabrieldarezzo 255 Denunciar post Postado Janeiro 26, 2017 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 :( Compartilhar este post Link para o post Compartilhar em outros sites
gabrieldarezzo 255 Denunciar post Postado Janeiro 26, 2017 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> Compartilhar este post Link para o post Compartilhar em outros sites
gabrieldarezzo 255 Denunciar post Postado Janeiro 26, 2017 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 :( Compartilhar este post Link para o post Compartilhar em outros sites
Mateus Silva 64 Denunciar post Postado Janeiro 28, 2017 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.'; } } Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Janeiro 28, 2017 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 https://www.freemaptools.com/radius-around-point.htm Compartilhar este post Link para o post Compartilhar em outros sites
gabrieldarezzo 255 Denunciar post Postado Abril 12, 2017 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. Compartilhar este post Link para o post Compartilhar em outros sites