[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