[Gfoss] spatialite: errore RecoverGeometryColumn

Eccoci di nuovo qui, ho creato una nuova tabella attraverso una select
con ST_Union() e group by, ora vorrei aggiungere la colonna geometrica
alle geometry_columns...

spatialite> select
RecoverGeometryColumn('acque_trento_finali','Geometry',32632,'MULTILINESTRING','XY');
RecoverGeometryColumn(): validation failed
RecoverGeometryColumn('acque_trento_finali','Geometry',32632,'MULTILINESTRING','XY')
------------------------------------------------------------------------------------
0

qualche suggerimento?

--
ciao
Luca

http://gis.cri.fmach.it/delucchi/
www.lucadelu.org

On Thu, 14 Apr 2011 14:17:00 +0200, Luca Delucchi wrote

Eccoci di nuovo qui, ho creato una nuova tabella attraverso una
select con ST_Union() e group by, ora vorrei aggiungere la colonna geometrica
alle geometry_columns...

spatialite> select
RecoverGeometryColumn('acque_trento_finali','Geometry',32632,
'MULTILINESTRING','XY'); RecoverGeometryColumn(): validation failed
RecoverGeometryColumn('acque_trento_finali','Geometry',32632,
'MULTILINESTRING','XY')

------------------------------------------------------------------------------------

0

qualche suggerimento?

si, un sacco ...
verificare cosa hai veramente nella geometria
generata da ST_Union();

SELECT DISTINCT
  ST_GeometryType(Geometry),
  ST_Srid(Geometry),
  CoordDimension(Geometry)
FROM acque_trento_finali;

vedrai che probabilmente la Union ti ha
generato qualche geometria strana.
se semplicemente vedi che ci sono dei
LINESTRING (senza MULTI) basta che applichi
la "promozione" del tipo geometrico:

UPDATE acque_trento_finali
  SET Geometry = CastToMulti(Geometry);

vedrai che poi dovebbe andare meglio :slight_smile:

ciao Sandro

Il 14 aprile 2011 14:36, <a.furieri@lqt.it> ha scritto:

vedrai che poi dovebbe andare meglio :slight_smile:

chissà come mai ma è andato :stuck_out_tongue:
Giusto per conoscenza è una cosa che capita anche su postgis? (se
fosse così sono stato sempre fortunato :slight_smile: )

ciao Sandro

--
ciao
Luca

http://gis.cri.fmach.it/delucchi/
www.lucadelu.org

On Thu, 14 Apr 2011 15:08:07 +0200, Luca Delucchi wrote

Il 14 aprile 2011 14:36, <a.furieri@lqt.it> ha scritto:

>
> vedrai che poi dovebbe andare meglio :slight_smile:
>

chissà come mai ma è andato :stuck_out_tongue:
Giusto per conoscenza è una cosa che capita anche su postgis? (se
fosse così sono stato sempre fortunato :slight_smile: )

si, può capitare anche su postgis (almeno, credo).
le varie ST_Union, ST_Buffer etc etc sono supportate
da GEOS: e sia postgis che splite si limitano a
delegare queste operazioni a GEOS.

Altro esempio "classico": tutti scommetterebbero
che ST_ConvexHull ritorni necessariamente un
POLYGON ... falsissimo ...
può anche tornare un POINT (se il point-set
comprende un unico punto) ma anche un
LINESTRING (se il point-set comprende
solamente due punti) etc etc
Così come ST_Difference può tornare un
LINESTRING (se i due poligoni si toccano
lungo un lato) ma anche un POINT (se i due
poligoni si toccano solo su un vertice).

ma sia splite che postgis supportano appunto
una serie di funzioni "casting" che aiutano
a forzare la classe della geometria prodotta
dell'operatore Spatial

ciao Sandro

Il 14 aprile 2011 14:36, <a.furieri@lqt.it> ha scritto:

On Thu, 14 Apr 2011 14:17:00 +0200, Luca Delucchi wrote

Eccoci di nuovo qui, ho creato una nuova tabella attraverso una
select con ST_Union() e group by, ora vorrei aggiungere la colonna geometrica
alle geometry_columns...

spatialite> select
RecoverGeometryColumn('acque_trento_finali','Geometry',32632,
'MULTILINESTRING','XY'); RecoverGeometryColumn(): validation failed
RecoverGeometryColumn('acque_trento_finali','Geometry',32632,
'MULTILINESTRING','XY')

------------------------------------------------------------------------------------

0

qualche suggerimento?

si, un sacco ...
verificare cosa hai veramente nella geometria
generata da ST_Union();

SELECT DISTINCT
ST_GeometryType(Geometry),
ST_Srid(Geometry),
CoordDimension(Geometry)
FROM acque_trento_finali;

vedrai che probabilmente la Union ti ha
generato qualche geometria strana.
se semplicemente vedi che ci sono dei
LINESTRING (senza MULTI) basta che applichi
la "promozione" del tipo geometrico:

UPDATE acque_trento_finali
SET Geometry = CastToMulti(Geometry);

vedrai che poi dovebbe andare meglio :slight_smile:

l'altra volta aveva funzionato, ma questa volta con un'altra tabella no! :frowning:
qualche altro suggerimento?

SELECT DISTINCT st_geometrytype(geom), st_srid(geom),
coorddimension(geom) from uso_suolo_trentino2008_new;
st_geometrytype(geom)|st_srid(geom)|coorddimension(geom)
||
MULTIPOLYGON|32632|XY

select count(geom) from uso_suolo_trentino2008_new where not isvalid(geom);
count(geom)
0

select count(geom) from uso_suolo_trentino2008_new where geom is null;
count(geom)
0

select RecoverGeometryColumn('uso_suolo_trentino2008_new','geom',32632,'MULTIPOLYGON','XY');
RecoverGeometryColumn(): validation failed
RecoverGeometryColumn('uso_suolo_trentino2008_new','geom',32632,'MULTIPOLYGON','XY')
0

ciao Sandro

--
ciao
Luca

http://gis.cri.fmach.it/delucchi/
www.lucadelu.org

On Fri, 29 Apr 2011 11:10:43 +0200, Luca Delucchi wrote

l'altra volta aveva funzionato, ma questa volta con un'altra tabella
no! :frowning: qualche altro suggerimento?

SELECT DISTINCT st_geometrytype(geom), st_srid(geom),
coorddimension(geom)
FROM uso_suolo_trentino2008_new;

MULTIPOLYGON|32632|XY

ok, sono tutti MULTIPOLYGON 2D XY e lo srid è 32632

select count(geom)
from uso_suolo_trentino2008_new
where geom is null;

0

e non ci sono NULL

select RecoverGeometryColumn('uso_suolo_trentino2008_new','geom',
32632,'MULTIPOLYGON','XY');

RecoverGeometryColumn(): validation failed

eh no: *deve* funzionare. io non ci vedo nessun errore SQL
non so cosa dirti: bug mi pare quasi impossibile, perchè
RecoverGeometryColumn per validare esegue esattamente
la query che tu hai già lanciato a mano .. boh !?!?!?!

ciao Sandro

Il 29 aprile 2011 11:35, <a.furieri@lqt.it> ha scritto:

eh no: *deve* funzionare. io non ci vedo nessun errore SQL
non so cosa dirti: bug mi pare quasi impossibile, perchè
RecoverGeometryColumn per validare esegue esattamente
la query che tu hai già lanciato a mano .. boh !?!?!?!

l'unica cosa di strano è quando eseguo

SELECT DISTINCT st_geometrytype(geom), st_srid(geom),
coorddimension(geom) from uso_suolo_trentino2008_new;
st_geometrytype(geom)|st_srid(geom)|coorddimension(geom)
||
MULTIPOLYGON|32632|XY

c'è la prima riga || invece su una tabella corretta non c'è

SELECT DISTINCT st_geometrytype(Geometry), st_srid(Geometry),
coorddimension(Geometry) from uso_suolo_trentino2008;
st_geometrytype(Geometry)|st_srid(Geometry)|coorddimension(Geometry)
POLYGON|32632|XY

penso il problema sia li, ma non so come correggerlo

ciao Sandro

--
ciao
Luca

http://gis.cri.fmach.it/delucchi/
www.lucadelu.org

On Fri, 29 Apr 2011 14:06:34 +0200, Luca Delucchi wrote

l'unica cosa di strano è quando eseguo ...
c'è la prima riga || invece su una tabella corretta non c'è

penso il problema sia li, ma non so come correggerlo

ok, ora è chiaro: scusami, ma prima non ci avevo
proprio fatto caso :slight_smile:
sono NULL

vedo che tu usi spatialite CLI, che by default
ignora i nulls: se li vuoi visualizzare devi
attivarli esplicitamente:
.nullvalue NULL

concludendo: non hai nessun NULL tra le tue geometrie,
lo avevamo già verificato prima.
però hai qualche valore assolutamente sballato, così
tanto sballato che non viene neppure riconosciuto come
una Geometry binaria valida: prova ad indentificarli così

SELECT * FROM my_table
WHERE ST_GeometryType(geom) IS NULL;

ciao Sandro

Il 29 aprile 2011 14:57, <a.furieri@lqt.it> ha scritto:

SELECT * FROM my_table
WHERE ST_GeometryType(geom) IS NULL;

ok, trovati... per metterli a posto devo usare sempre la gui?

ciao Sandro

--
ciao
Luca

http://gis.cri.fmach.it/delucchi/
www.lucadelu.org

On Fri, 29 Apr 2011 15:08:54 +0200, Luca Delucchi wrote

Il 29 aprile 2011 14:57, <a.furieri@lqt.it> ha scritto:

> SELECT * FROM my_table
> WHERE ST_GeometryType(geom) IS NULL;

ok, trovati... per metterli a posto devo usare sempre la gui?

dipende da "cosa" ci hai trovato dentro ....
a naso, l'unica cosa che parrebbe sensata è
una bella DELETE, ma bisognerebbe verificare :slight_smile:

ciao Sandro

Il 29 aprile 2011 15:48, <a.furieri@lqt.it> ha scritto:

dipende da "cosa" ci hai trovato dentro ....
a naso, l'unica cosa che parrebbe sensata è
una bella DELETE, ma bisognerebbe verificare :slight_smile:

già provata ma si è portato via un po' troppe features :wink:

ciao Sandro

--
ciao
Luca

http://gis.cri.fmach.it/delucchi/
www.lucadelu.org

On Fri, 29 Apr 2011 16:19:33 +0200, Luca Delucchi wrote

> a naso, l'unica cosa che parrebbe sensata è
> una bella DELETE, ma bisognerebbe verificare :slight_smile:
>

già provata ma si è portato via un po' troppe features :wink:

riassumendo: quindi il tuo DB ha un sacco di righe
con contengono "roba strana", che spatialite si
rifiuta tassatavimente di riconoscere come
geometrie valide

di grazia, ma cosa è successo ?
che procedura e che strumenti hai utilizzato ?

BTW a me a questo punto pare abbastanza chiaro
che cotesto DB è fritto ... fai sicuramente
prima a buttarlo e ricaricarlo piuttosto
che tentare di aggiustarlo

ciao Sandro