Hai mai avuto la necessità di definire un bounding box quadrato al posto del classico bounding box rettangolare?
Con questo tutorial ti mostro come definire un bounding box quadrato usando PostGIS
Il dato che userò per questo tutorial è l’insieme dei Comuni della Città Metropolitana di Napoli che puoi scaricare qui, andrò quindi a realizzare 92 bbox quadrati, uno per ogni singolo Comune.
La geometria euclidea ci dice che un poligono può essere inscritto in una circonferenza se tutti i suoi vertici appartengono alla circonferenza e, ancora, una circonferenza è inscrivibile in un poligono quando tutti i lati del poligono sono tangenti alla circonferenza. Se non ti è ancora chiaro perché ti sto parlando di circonferenze inscritte e circoscritte, sicuramente ti sarà chiaro di seguito!
Il primo passo da compiere è estrarre le circonferenze che circoscrivono i confini comunali; è possibile fare questo con la funzione ST_MinimumBoundingCircle usando la sintassi che segue:
CREATE TABLE circle_comuni AS
SELECT
comune,
ST_MinimumBoundingCircle(geom) as geom
FROM comuni_prov_na
GROUP BY comune, geom;
A questo punto dovrebbe esserti chiaro perché ho iniziato parlando di geometria euclidea. Ho ottenuto 92 circonferenze ma lo scopo di questo tutorial è ottenere 92 quadrati. E’ proprio il quadrato una delle figure regolari in cui posso inscrivere e circoscrivere una circonferenza!
Usando la funzione ST_Extent andrò a definire i 92 quadrati in cui sono inscritte le 92 circonferenze. La sola funzione ST_Extent però non è sufficiente perché non genera una colonna geometrica ma una colonna di tipo box2d, puoi approfondire a questo link se vuoi.
Per ottenere i nostri quadrati dobbiamo accoppiare un CAST alla funzione ST_Extent. Un CAST è un particolare tipo di funzione che converte dai dati da una tipologia ad un’altra. Nel nostro caso dobbiamo usarlo per convertire il box2d di ST_Extent in geometry; la sintassi che ho usato è questa:
CREATE TABLE square_comuni AS
SELECT
comune,
CAST(ST_Extent(geom) as geometry) as geom
FROM circle_comuni
GROUP BY comune;
Tutto molto semplice no?
Alla prossima!
PS: per spiegarti al meglio il processo ho diviso i singoli passaggi in due query ma puoi usare un'unica query bypassando la creazione della tabella con le circonferenze in questo modo:
CREATE TABLE combo AS
SELECT
comune,
CAST(ST_Extent(ST_MinimumBoundingCircle(geom)) as geometry) as geom
FROM comuni_prov_na
GROUP BY comune;