OpenStreetMap logo OpenStreetMap

Se preferirem trabalhar só com os pontos de entrega do correio, em vez de terem o mesmo ponto repetido para cada endereço, como acontece nos prédios, criei uma tabela entregas.

A tabela entregas mantém toda a informação, pois estou a agregar a informação das diferentes moradas num único ponto.

Criei uma pasta Pontos de Entrega Continente onde têm uma exportação por concelho.

Para quem usar o QGIS, criei nessa pasta um geopackage continente.gpkg que tem as duas tabelas: moradase entregas.

Também fiz um dump do Postgresql, que está nessa pasta em enderecos-202103291045.backup.

Atenção: as shapefiles têm limitações no comprimento dos atributos. Algumas agregações estão truncadas (pelo limite de 255 carateres do formato shapefile.

Criação de uma tabela só com os pontos de entrega

CREATE TABLE entregas (
	fid INT generated BY default AS identity primary key,
	geom geometry(POINT, 3763) NULL,
	numeros text NULL,
	pisos text NULL,
	fracoes text NULL,
	toponimos text NULL,
	tipos text NULL,
	edificios varchar NULL,
	codpostais varchar NULL
);

CREATE INDEX entregas_geom_idx ON entregas USING gist (geom);

CREATE OR REPLACE FUNCTION array_sort (ANYARRAY)
RETURNS ANYARRAY LANGUAGE SQL
AS $$
SELECT ARRAY(SELECT unnest($1) ORDER BY 1)
$$;

insert into entregas (geom, numeros, pisos, fracoes, toponimos, tipos, edificios, codpostais)
with unicas as (
	select geom, ARRAY_AGG(DISTINCT numero) as numeros, ARRAY_AGG(DISTINCT piso) as pisos, ARRAY_AGG(DISTINCT fracao) as fracoes,
	ARRAY_AGG(DISTINCT toponimo) as toponimos, ARRAY_AGG(DISTINCT tipo) as tipos, ARRAY_AGG(DISTINCT edificio) as edificios, ARRAY_AGG(DISTINCT postcode) as postcodes
	from moradas group by geom)
select geom, array_to_string(array_sort(numeros), ', ') as numeros, 
array_to_string(array_sort(pisos), ', ') as pisos, 
array_to_string(array_sort(fracoes), ', ') as fracoes, 
array_to_string(array_sort(toponimos), ', ') as toponimos, 
array_to_string(array_sort(tipos), ', ') as tipos, 
array_to_string(array_sort(edificios), ', ') as edificios, 
array_to_string(array_sort(postcodes), ', ') as codpostais
from unicas;

Com isto, passamos de 5 669 971 moradas, para 3 372 945 pontos de entrega.

Email icon Bluesky Icon Facebook Icon LinkedIn Icon Mastodon Icon Telegram Icon X Icon

Discussion

Log in to leave a comment