<div>Olá pessoal...</div><div><br></div><div>Quando devo utilizar o código de area dentro de um mesmo estado? Não sei se a informação procede, mas quando a distancia ultrapassa 50 km, o uso do código da area é obrigatório.</div>

<div><br></div><div>Logo resolvi apelar. Calcular as distancias utilizando latitude e longitude utilizando os dados da Tabela cnlfixo da anatel.</div><div>E uma tabela de preferencias (filiais) que tem as informações da filial.</div>
<div><br></div><div>Porem não tenho certeza se esses cálculos estão corretos.</div><div><br></div><div>Passo como paramento o número discado. (&#39;11&#39;, &#39;9999&#39; &#39;9999&#39;)</div><div><br></div><div><br></div>
<div>DELIMITER $$</div>
<div><br></div><div>DROP FUNCTION IF EXISTS `asterisk`.`fn_calculaDistancia` $$</div><div>CREATE DEFINER=`root`@`%` FUNCTION `fn_calculaDistancia`(varDDD varchar(2), varFaixa1 varchar(6), varFaixa2 varchar(4)) RETURNS varchar(10) CHARSET latin1</div>

<div>BEGIN</div><div><br></div><div>declare radiano float default 0;</div><div>declare unidade float default 0;</div><div>declare area varchar(2) default 0;</div><div>declare latitude_1 float default 0;</div><div>declare longitude_1 float default 0;</div>

<div>declare latitude_2 float default 0;</div><div>declare longitude_2 float default 0;</div><div>declare distancia float default 50;</div><div><br></div><div>  set radiano = 180/PI();</div><div>  set unidade = 60 * 1.1515 * 1.609344;</div>

<div><br></div><div>  select substr(prefixo,1,2), substr(latitude,1,4)/100, substr(longitude,1,4)/100</div><div>  into area, latitude_1, longitude_1</div><div>  from asterisk.preferencias</div><div>  where principal = 1;</div>

<div><br></div><div>  if (area = varDDD) then</div><div>   select substr(latitude,1,4)/100, substr(longitude,1,4)/100</div><div>   into latitude_2, longitude_2</div><div>   from asterisk.cnlfixo</div><div>   where prefixo = concat(varDDD,varFaixa1)</div>

<div>   and   varFaixa2 between faixainicial and faixafinal;</div><div><br></div><div>   set distancia = ((ACOS(SIN(latitude_1/radiano) * SIN(latitude_2/radiano) +</div><div>        COS(latitude_1/radiano) * COS(latitude_2/radiano) *</div>

<div>        COS(longitude_2/radiano - longitude_1/radiano))) * unidade);</div><div><br></div><div>   end if;</div><div><br></div><div>   if (distancia &gt;= 50) then</div><div>      return 0; -- usa ddd</div><div>   else</div>

<div>      return 1; -- remove ddd</div><div>   end if;</div><div><br></div><div><br></div><div>END $$</div><div><br></div><div>DELIMITER ;</div><div><br></div><div>Porem meus resultados não estao muito confiáveis. </div>
<div>Alguem consegue ver algum problema nessa procedure?</div><div><br></div>