2 402
edições
(→Pontos) |
Sem resumo de edição |
||
Linha 84: | Linha 84: | ||
drop view if exists vw02_ibge_cnefe2022; | drop view if exists vw02_ibge_cnefe2022; | ||
create view vw02_ibge_cnefe2022 as | create view vw02_ibge_cnefe2022 as | ||
select *, regexp_replace( coalesce(nom_tipo_seglogr,'') || ' '|| | select *, ST_GeoHash(geom,9) as ghs | ||
ST_SetSRID(ST_MakePoint(longitude::float, latitude::float),4326) as geom | from ( | ||
from ibge_cnefe2022; | select *, regexp_replace( coalesce(nom_tipo_seglogr,'') ||' '|| coalesce(nom_titulo_seglogr,'') ||' '|| coalesce(nom_seglogr,''), '\s+',' ','g') as via_name, | ||
ST_SetSRID(ST_MakePoint(longitude::float, latitude::float),4326) as geom | |||
from ibge_cnefe2022 | |||
) t | |||
; | |||
--select count(*) from ibge_cnefe2022; -- 762239 | |||
-- select count(*) from (select distinct ST_GeoHash(geom,9) as ghs, cod_setor, num_quadra, num_face, via_name, num_endereco from vw02_ibge_cnefe2022 -- same where geom is not null and via_name>'' and num_endereco>'' ) t; -- 379957 | |||
-- select 379957.0/762239; -- 49,847% = 50% | |||
</pre> | |||
* Unicidade de endereço: DISTINCT cod_setor, cep, via_name, num_endereco | |||
* Unicidade de posição: DISTINCT ghs | |||
* Filtrando unicidades: primeiro de endereço, porém incluindo array de geohashes distintos. Se forem vizinhos não possuem mesmo prefixo conferir maior distancia entre eles. | |||
<pre> | |||
CREATE FUNCTION hcodes_sameparent(g text[]) RETURNS boolean AS $f$ | |||
SELECT bool_and( CASE | |||
WHEN l1=l2 THEN substr(g1,1,l1-1)=substr(g2,1,l2-1) | |||
WHEN l1>l2 THEN g1 ~ ('^'||g2) -- WHEN l1=l2+1 | |||
ELSE g2 ~ ('^'||g1) -- WHEN l2=l1+1 ELSE false | |||
END ) | |||
FROM ( | |||
select g1, g2, length(g1) l1, length(g2) l2 | |||
from unnest(g) WITH ORDINALITY AS a(g1,i1) | |||
inner join unnest(g) WITH ORDINALITY AS b(g2,i2) | |||
on i1<i2 | |||
) t1 | |||
$f$ LANGUAGE SQL; | |||
CREATE FUNCTION geoms_maxdist(g geometry[], use_spheroid boolean default false) RETURNS float AS $f$ | |||
SELECT MAX( ST_Distance(g1,g2,use_spheroid) ) | |||
FROM unnest(g) WITH ORDINALITY AS a(g1,i1) | |||
INNER JOIN unnest(g) WITH ORDINALITY AS b(g2,i2) | |||
ON i1<i2 | |||
$f$ LANGUAGE SQL; | |||
select | create table ibge_cnefe2022_uniq1 AS -- unicidade básica, ainda com repetição de pontos | ||
SELECT DISTINCT ghs, via_name, num_endereco | |||
FROM vw02_ibge_cnefe2022 | |||
; -- 379228 de 762239 = select round(100.0*379228.0/762239); = 50% | |||
select count(*) from ( | select avg(n) from (select ghs, count(*) n from ibge_cnefe2022_uniq1 group by 1) t | ||
from vw02_ibge_cnefe2022 | where n=1 -- n>1 | ||
) | ; | ||
-- 325993 não-duplicados mais 2.16*24642 duplicados = 325993+2.16*24642 = 379220 ~ 379228. | |||
create table ibge_cnefe2022_uniq_lixo AS -- erro | |||
with upt as ( | |||
SELECT ghs FROM vw02_ibge_cnefe2022 group by 1 having count(*)=1 | |||
), uend as( | |||
SELECT cod_setor, cep, via_name, num_endereco | |||
FROM vw02_ibge_cnefe2022 | |||
group by 1,2,3,4 having count(*)=1 | |||
) select i.ghs, i.cod_setor, i.cep, i.via_name, i.num_endereco | |||
from upt inner join (vw02_ibge_cnefe2022 i inner join uend | |||
ON i.cod_setor=uend.cod_setor AND i.cep=uend.cep AND i.via_name=uend.via_name AND i.num_endereco=uend.num_endereco) | |||
ON upt.ghs=i.ghs | |||
; | |||
</pre> | </pre> | ||
Só na redução de pontos para 50% já é bem drástica, provavelmente inclui casos que diferenciam apenas no complemento. | Só na redução de pontos para 50% já é bem drástica, provavelmente inclui casos que diferenciam apenas no complemento. | ||
Falta eliminar mesmo ponto e mesmo endereço/CEP. | Falta eliminar mesmo ponto e mesmo endereço/CEP. | ||
select count(*), count(distinct via_name||num_endereco) from (select distinct cod_setor, via_name, num_endereco, cep | |||
from vw02_ibge_cnefe2022 | |||
) t; -- 288685 | 277160 |
edições