Skip to content

OSMBrasil/CRP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

80 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DOI   goodtables.io

CRP - Código de Roteamento Postal

(ver demonstração aqui e visualização de dados aqui)

Os códigos de CEP de 5 dígitos (CEP5) são de domínio público, como se espera que seja um bem cultural, um complemento aos nomes de cidade e nomes de bairro, presente em mapas e guias públicos, e com seu uso obrigatório em formulários e cadastros exigidos pelo governo desde a década de 1970.

O mesmo já ocorreu, mas não ocorre hoje (2016), com os CEPs de 8 dígidos (CEP8), que complementam nomes de rua e identificam trechos e localizações de interesse público. A Empresa brasileira de Correios e Telégrafos (ETC), reclamou direitos autorais sobre o banco de dados oficial do CEP8.

Para contornar o problema, é até simples,

basta não utilizar o nome "CEP" e não reproduzir exatamente a string do CEP8 num banco de dados público.

É solução em aplicações que fazem uso apenas indireto do CEP, como por exemplo validar endereços já localizados ou validar mapeamentos de face de quadra.

OBJETIVOS

A finalidade do presente projeto é estabelecer as convenções para se transcrever a string de CEP no formato CRP, e demonstrar que a convenção é consistente, simples e reversível.

PS: ver também novas metas de 2018.

CONVENÇÃO DO CRP

As convenções a seguir estão sendo submetidas à apreciação da comunidade de potenciais usuários.

Nome

O nome "CRP" é uma alternativa à marca "CEP". Este projeto está efetuando o registro, com licenças abertas, da marca "CRP". A seguir uma breve explanação e justificativas para a escolha da sigla "CRP".

As principais aplicações do CEP nos dias de hoje (2016) estão vinculadas às finalidades logísticas. Neste sentido o termo "roteamento" (empregado por exemplo na Alemanha e na Suíça) pode ser adotado no lugar de "endereçamento". Este é o nexo para a sugestão do nome alternativo CRP, abreviação de Código de Roteamento Postal.

NOTA: a ideia de "roteamento" no lugar de "endereçamento" ajuda inclusive a evitar confusão com termos como "endereço do lote" e "ponto de endereçamento" — o lote ou seu centróide pode ter mais de um CEP, ou seja, o lote pode ter mais de um portão para receber entregas.

Código

A proposta de sintaxe é bastante simples, a maior parte das explicações a seguir é para demonstrar que essa sintaxe é reversível e as suas especificações são completas.

Não é necessário um código único para todo o Brasil, a unicidade pode ser garantida por unidade da federação (UF), de modo que cada string de CRP contém a UF e um código contextualizado pela sua UF. Por exemplo "SP2345678".

Tendo isso em vista, a conversão entre CEP e CRP seria simples e facilmente reversível. Exemplos:

  • Os CEPs de Minas Gerais ("30000-000" a "39999-999") seriam entradas com prefixo "MG" e sufixos variando de 0 a 9999999 (sete dígitos), ou seja, strings representadas como "MG0000-000" a "MG9999-999".
    Para converter de CRP de volta para CEP basta trocar "MG" por "3".

  • Os CEPs do Maranhão ("65000-000" a "65999-999") seriam entradas com prefixo "MA" e sufixos variando de 0 a 999999 (seis dígitos), ou seja, strings representadas como "MA000-000" a "MA999-999".
    Para converter de CRP de volta para CEP basta trocar "MA" por "65".

  • Os CEPs do Amazonas ("69000-000" a "69299-999" e "69400-000" a "69899-999") seriam entradas com prefixo "AM" e sufixos variando de 0 a 999999 (seis dígitos), ou seja, strings representadas como "AM000-000" a "AM299-999" e "AM400-000" a "AM899-999".
    Para converter de CRP de volta para CEP basta trocar "AM" por "69".

A única exceção à regra do "nome da UF no prefixo" seria São Paulo, que tem uma conjunto de CEPs só para a zona/região metropolitana ("01000-000" a "09999-999"), batizado de "ZM" (com "Z" de "zona" para destacar dos demais).

A tabela completa, baseada na lista geral dos CEPs, está em CEP-to-CRP.csv, e define com rigor todos os detalhes da conversão entre strings de CEP e CRP. O script PHP rgxGen.php gera as regular expressions adequadas ao algoritmo de conversão — dois exemplos foram implementados, um em Javascript, convert.js, usado no demo, e outro em PHP no script convert.php.

Participação e uso prático

Participe dando sugestões, discutindo ideias ou notificando falhas em aqui nas issues do CRP.

Para sugerir ou enviar dados, indique o link do repositório-origem ou entre em contato nas issues para solicitar e-mail.

Uma vez populada a base de CRPs, serviços de resolução serão implementados no OSM.codes, a servirão para consolidar a BEBA - Base de Endereços Brasileira Aberta.


NOTAS

sobre extensibilidade e compactação

O formato CRP acima descrito também pode:

  • Ter seu código "reduzido" apenas à parte inteira (CRP_int), quando o contexto regional (ex. estado) for conhecido.

  • Ter seu código ampliado para designar subdivisões com demanda ainda não atendida. Estender o CRP conforme uma convenção OpenStreetMap (OSM) de "CEP de local sem CEP": realizar um registro preliminar de sufixo-CRP (ex. adicionando-se uma letra aos demais dígitos) para locais tais como cidades com um só CEP, novos loteamentos, favelas e áreas de ocupação irregular.

sobre o ecossistema de CRPs

Outros países do Mercosul, como a Argentina, já adotam um sistema de codificação postal que inclui a "subdivisão principal do país" como prefixo. A codificação em uma ou duas letras dos nomes das subdivisões do país, por sua vez, é padronizada pela ISO 3166-2 — ver por exemplo ISO 3166-2:AR e ISO 3166-2:BR.

sobre a implantação em SQL

Como numa base de dados SQL é mais econômico representar uma sequência de dígitos na forma de inteiro, uma tabela SQL de códigos CRP pode ser expressa como se segue:

CREATE TABLE crp (
	uf char(2) NOT NULL,	-- UF, letras CRP. REFERENCES state(uf).
	cod int NOT NULL,       -- dígitos CRP
	info  JSONb,            -- demais informações desejadas. PostgreSQL 9.5+
	PRIMARY KEY (uf,cod),
	CHECK(crp_is_valid(uf,suffix))
);

CREATE VIEW vw_crp AS 
  SELECT *, crp_format(uf,cod) AS crp, crp_asCEP(uf,cod) AS cep 
  FROM crp;

-- para uso apenas na importação de dados:
CREATE DOMAIN br_postal_crp AS text -- assegura syntaxe mínima
CHECK(
   VALUE ~* '^(BR\-?)?[A-EGMPRSTZ][ABCEFGIJLMNOPRST]\d{5,5}(\-?\d{3,3})?$'
);

No caso do PostgreSQL, que oferece nativamente o tratamento de regular expressions, o código das funções crp_is_valid(), crp_asCEP() e crp_format() pode ser implementado em SQL, PL/pgSQL ou adaptando diretamente os códigos deste projeto (convert.js para PLv8 ou convert.php para PL/PHP).


Licença

Conteúdo, dados e algoritmos: domínio público.

License: CC0