[Gfoss] Qgis e recipe #19 di Spatialite cookbook

a.furieri a lqt.it a.furieri a lqt.it
Mer 5 Mar 2014 19:59:18 CET


Ciao Beppe,

come diceva Mao Tse Tung:
"quando trovi uno che ha fame non gli regalare mai un pesce;
  insegnagli piuttosto ad usare la canna da pesca"

vedi i miei commenti passo per passo:

On Wed, 5 Mar 2014 10:09:52 -0800 (PST), Beppe wrote:
> Salve a tutti!
> Nella ricetta #19  dello Spatialite Cookbook mi sono reso conto che 
> il file
>

giusto per pedante precisione: non e' affatto un "file", e' una tavola
dentro ad un DB-file ... tutt'altra zuppa ;-)


> che dovrebbe contenere il merging dei comuni a formare le provincie 
> non
> viene aperto da QGIS, o meglio viene visto come "tabella senza 
> geometria".
> Ciò non ostante, se controllo da SpatialiteGUI le geometrie sono
> visualizzabili correttamente sia mediante il menù Map Preview che con
> comando del menù contestuale "Blob Explore".
>
> Ho seguito la seguente procedura indicata dallo Spatialite Cookbook:
>
> 1-Creato un nuovo db (srid 23032, codifica cp152) nel quale ho 
> importato lo
> shapefile com2010_g (SRID 23032, codifica CP152, lasciando 
> deselezionate le
> opzioni della voce "Geometry Storage", selezionando alla voce 
> "Geometry
> Type" l'opzione "Mode:Automatic" ed alla voce "Primary Key Column" 
> l'opzione
> "Automatic".
>
> 2-Ho creato la view 'local_councils':
>   CREATE VIEW local_councils AS
>   SELECT c.cod_reg AS cod_reg,
>     c.cod_pro AS cod_pro,
>     c.cod_com AS cod_com,
>     c.nome_com AS nome_com,
>     p.nome_pro AS nome_pro,
>     p.sigla AS sigla,
>     r.nome_reg AS nome_reg,
>     c.geometry AS geometry
>   FROM com2010_g AS c
>   JOIN prov2010_g AS p USING (cod_pro)
>   JOIN reg2010_g AS r USING(cod_reg)
>
> 3-Ho creato la tabella 'counties' e relativa colonna geometrica:
>   CREATE TABLE counties AS
>   SELECT cod_pro, nome_pro, sigla, cod_reg, nome_reg,
>     ST_Union(geometry) AS geometry
>   FROM local_councils
>   GROUP BY cod_pro
>
>   SELECT RecoverGeometryColumn('counties', 'geometry',
>     23032, 'MULTIPOLYGON', 'XY').
>

e qua ti sei evidentemente distratto :-)

quest'ultima SELECT ritorna ZERO ... cioe' FALSE
insomma, non e' andata a buon fine, non ce l'ha fatta proprio a 
ricoverare
correttamente la geometria.
conclusione: non hai affatto una tavola Spatial, hai ancora una banale
tavola di tipo ordinario (anche se contiene delle geometrie)  perche'
non e' registrata su "geometry_columns"
e di conseguenza QGIS ti dice (correttamente) che non trova nessuna
tavola Spatial (aka layer) che si chiami "counties".

andiamo a verificare perche' la RecoverGeometryColumn fallisce:

SELECT Count(*) AS count, ST_GeometryType(geometry) AS type,
   ST_SRID(geometry) AS srid, CoordDimension(geometry) AS dims
FROM counties
GROUP BY type, srid;
-------
44 MULTIPOLYGON 23032 XY
66 POLYGON      23032 XY

ora e' tutto chiaro; la tavola "counties" contiene geometrie
di tipo misto: qualche volta poligoni semplici, altre volte
poligoni multipli (pensa p.es. a tutte le provincie sulla
costa che hanno isole, isolotti, scogli etc).

nelle versioni piu' recenti di splite i controlli di tipo
sono rigidamente inflessibili; non puoi registrare una "vera
e genuina" tavola Spatial se il tipo geometrico non e'
rigorosamente univoco.

soluzione A)
------------
UPDATE counties SET geometry = CastToMultiPolygon(geometry);

cioe' applichiamo a posteriori un casting sul tipo geometrico;
questa UPDATE assicura che tutto verra' convertito a MultiPolygon
in modo rigorosamente consistente.


soluzione B)
------------
correggiamo la SELECT di origine in modo tale da renderla
aderente ai requisiti delle ultime versioni (personalmente,
preferisco questa seconda soluzione):

DROP TABLE counties;

CREATE TABLE counties AS
SELECT cod_pro, nome_pro, sigla, cod_reg, nome_reg,
   CastToMultiPolygon(ST_Union(geometry)) AS geometry
FROM local_councils
GROUP BY cod_pro;

SELECT RecoverGeometryColumn('counties', 'geometry',
   23032, 'MULTIPOLYGON', 'XY');

voila: ora finalmente funziona tutto correttamente ;-)

ciao Sandro


Maggiori informazioni sulla lista Gfoss