Skip to content

Testes para o CLP

Peter edited this page Jun 25, 2018 · 3 revisions

testes e introdução

CLP - Código de Localização de Portão

Sintaxe: "CLP:" + UF + "-" Cidade3letras + Classificação + ViaCódigo + "-" + DistânciaVia

Variável Descrição
UF Sigla 2 letras oficial do estado
Cidade3letras Sigla 3 letras da cidade
Classificação Separador e jurisdição:
0=via federal
1=via estadual
2=via municipal
3=via particular
4=trilha marginal a rio ou ferrovia
5=via secundária não-oficial
6 ou -=via referida por CEP
ViaCódigo Número inteiro atribuído por autoridade da respectiva jurisdição, representado na base-34.
DistânciaVia Distância em metros percorrida ao longo da via até o portão. Prefixo k permite expressar quilômetros.

Exemplos:

Local e endereço usual CLP (canônico destacado)
Portão empresa de logística em Guarulhos
Rodovia Fernão Dias, Km 201 • CEP 07053-171
SP-GUA0B7-k201/11
SP-GUA-7053171-k201/1Y
BR381-k201/2E
Cancelas do Pedágio em Atibaia
Rodovia Fernão Dias, Km 65,7
SP-ATB0B7-65700/23
Portão principal da Hípica em São Paulo
Rua Quintana, 206 • CEP 04569-010
SP-SPA-456901-206/10
Portão principal de parque em Campinas
Av. Dr. Heitor Penteado, 1671 • CEP 13087-000
SP-CAM-3087-1671/19
<?php
$rodoCods = ['BR-381'=>'B7', 'BR-116'=>'']; // base34 (I e O viram Y e Z)

$AMOSTRAS = [
 'SP-GUA-7053171-k201'=>'Rodovia Fernão Dias, Km 201 • CEP 07053-171', // portão empresa de logística em Guarulhos
 'BR381-k201'=>'Rodovia Fernão Dias, Km 201',
 'SP-GUA0B7-k201'=>'Rodovia Fernão Dias, Km 201 • Guarulhos - SP', // forma canônica
 'SP-GUA0B7-k201'=>'Rodovia Fernão Dias, Km 201 • Guarulhos - SP', // forma canônica
 'SP-ATB0B7-65700'=>'Rodovia Fernão Dias, Km 65,7 • Atibaia - SP', // cancelas do Pedágio
 'SP-SPA-456901-207'=>'Rua Quintana, 206 • CEP 04569-010', // portaria da Hípíca em São Paulo
 'SP-CAM-3087-1671'=>'Av. Dr. Heitor Penteado, 1671 • CEP 13087-000', // portão principal do parque em Campinas
];
foreach($AMOSTRAS as $CLP=>$END) {
  $x= strtoupper(base_convert( hash('crc32b', $CLP), 16, 34 )); 
  $v=substr( str_replace(["I","O"],["Y","Z"],$x) , 0, 2); 
  print "\nCLP:$CLP/$v\t($END)";
}
print "\n-------\n";

$url = 'https://github.com/datasets-br/city-codes/raw/master/data/br-city-codes.csv';

// CARGA:
$NOM = []; // Nome Oficial de Município
if (($handle = fopen($url, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) if (count($data)>2 && $data[1]=='SP') $NOM[]=$data[0];
    fclose($handle);
} else
   exit("\nERRO ao abrir planilha das cidades em \n\t$url\n");
$NF[]=[]; // Abrev-Nome

// // PROCESSO 1
$N = array_map(
	function ($x) { $x=strtoupper(desacent($x)); return ['',1,$x,$x]; }
                        // 0=usado, 1=palavras, 2=nome sem preposicao, 3=nome original
       ,$NOM
);
$ok=false; //global
for($i=0; $i<count($N); $i++) {
  $ok = false;
  $aux = 0;
  $N[$i][2] = preg_replace("/( (?:D[AO]S?|DE) | D')/", ' ', $N[$i][2], -1, $aux);
  $pals = explode(' ',$N[$i][2]);
  $pals2 = explode(' ', str_replace(" D'",' D ',$N[$i][3]) );
  $N[$i][1] = count($pals);
  $vog0 = semVogais($pals[0]);
  $ini0cut = substr($pals[0],0,3);
  if ($N[$i][1]==1 && strlen($N[$i][2])==3)  setNF( $N[$i], $N[$i][2], 1); // regra 1 exata
  if (!$ok && $N[$i][1]==3)      setNF( $N[$i], iniciais($pals)  , 2);  // regra 2 sem preposicao
  if (!$ok && $N[$i][1]==1 && strlen($vog0)==3)  setNF( $N[$i], $vog0 , 3);  // regra 3, usa preposicao
  if (!$ok && count($pals2)==3)  setNF( $N[$i], iniciais($pals2) , 4);  //
  if (!$ok && $N[$i][1]==1)  setNF( $N[$i], $ini0cut , 5);
  if (!$ok && $N[$i][1]==2)  setNF( $N[$i], substr($vog0,0,1).substr(semVogais($pals[1]),0,2)  , 7);
  //if (!$ok && $N[$i][1]>3)      setNF( $N[$i], iniciais($pals)  , 8);
}

$i=1;
$out = '';
$TOT = $T2 = count($N);
foreach ($N as $r) {
  $x= "\n $i. $r[0] = $r[3]";
  if ($r[0]) print $x;
  else { $out .= $x; $T2--; }
  $i++;
}
$T1 = $TOT - $T2;
print "\n ... de $TOT temos $T2 resolvidas. \n$out\n";
print "\n De $TOT temos $T1 sem resolver e $T2 resolvidas.\n";
//  De 645 temos 598 sem resolver e 47 resolvidas.

$xx=array_keys($NF);
sort($xx);
foreach ($xx as $abrev)
  print " $abrev "; // ({$NF[$abrev]});

// // // LIB

function desacent($str) {
        return iconv('UTF-8', 'ASCII//TRANSLIT', $str);
}

function setNF(&$r,$abrev,$regra=0) {
  global $ok;
  global $NF;
  $ok=false;
  if (isset($NF[$abrev])) { print "\n -- COLISAO na regra-$regra com $abrev ($r[3])"; return $ok; }
  $NF[$abrev] = $r[3];
  $r = [ $abrev, $r[1], $r[2], $r[3] ];
  $ok=true;
  return $ok;
}

function semVogais($x) {
  $a = substr($x,0,1);
  return $a.preg_replace('/[AEIOU]+/', '', substr($x,1));
}

function iniciais($pals) {
  $ini = '';
  foreach($pals as $p) $ini.=substr($p,0,1);
  return $ini;
}
?>

No PostgreSQL

CREATE VIEW vw_city3letter AS
  SELECT name, state, wdid , idibge , replace(upper(lexlabel),'.',' ') as stdname, creation, extinction 
  FROM dataset.vw_br_city_codes
  ; -- WHERE state='SP'

Usando o a representacao lexlabel a unica diferença é que nomes como "Conquista D'Oeste" (MT) se tornem CONQUISTA D OESTE...

Resultados preliminares

De um total de 645 nomes, 47 tiveram suas siglas obtidas por estas regras básicas,

  • Regra do nome de 3 letras: apenas 4 nomes, ITU, JAU, POA e URU.

  • Regras das iniciais das 3 palavras sem preposição: 43 nomes. Amostra: ASB= AGUAS DE SANTA BARBARA, ASB= AGUAS DE SANTA BARBARA, ASP= AGUAS DE SAO PEDRO, BES= BOA ESPERANCA DO SUL, ..., VGP= VARGEM GRANDE PAULISTA, VGS= VARGEM GRANDE DO SUL, VAA= VISTA ALEGRE DO ALTO.

Tratamento das colisões

  • SJB ficou com SAO JOSE DO BARREIRO (de 1859 com ~4100 mil habitantes), SAO JOAQUIM DA BARRA de 1898 é só alguns anos mais nova, mas tem ~51000 mil habitantes, 12 vezes mais. A regra de qualquer forma é a data de fundação (cuidado com casos de mudança maior de nome, aí o correto seria usar a data de renomeação se for mais do que simples acentos).

  • SAA ficou com SANTO ANTONIO DA ALEGRIA. fundada em 1866 (SANTO ANTONIO DO ARACANGUA é de 1923 e de qualquer forma a ordem alfabética ditaria mesmo resultado)

  • SAP ficou com SANTO ANTONIO DE POSSE, fundada em 1850 (22200 mil hab), ao invés de SANTO ANTONIO DO PINHAL (1860 e 6500 mil hab).