Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

tony_lu

Limitar entrega por cep

Recommended Posts

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

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

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

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

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

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
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 :tounge_wink:

 

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:

  1. is temporary (and in no event more than 30 calendar days);
  2. is secure;
  3. does not manipulate or aggregate any part of the Content or Service; and
  4. 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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.