OrbisGIS v4 stringtodouble

classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

OrbisGIS v4 stringtodouble

KatiaC
Bonjour

j'ai un fichier csv (BuildingTypes_vec.csv) avec une colonne gid pour le point de grille et une colonne BuildType pour un code (10, 20, 30, 40 ou 50).
Je dispose d'un fichier (VegDUD_Grid) avec une colonne the_geom, une colonne gid, une colonne id_col et une colonne id_row. Les colonnes gid des deux fichiers étant les mêmes (désignant les mêmes points).

Je veux créer un fichier avec les colonnes the_geom, gid et BuildType. Pour cela je lance la requête suivante:
create TABLE BuildingTypes as select a.the_geom, b.* from VegDUD_Grid a, BuildingTypes_vec b;

Il crée bien le fichier, mais au lieu d'avoir 418 lignes comme les fichiers initiaux j'en ai 174724! (soit 418*418). J'ai donc essayé avec la requête suivante:
create TABLE toto as select a.the_geom, b.* from VegDUD_Grid a, BuildingTypes_vec b where a.gid=b.gid;

Mais il me dit que b.gid n'existe pas. En effet, les colonnes du fichier csv sont de type string (je ne comprends pas pourquoi). J'ai essayé d'utiliser une fonction de type stringtodouble, mais j'ai l'impression que cette fonction n'existe pas dans OrbisGIS v4. Pouvez-vous m'aider?

Merci et bonne journée

Katia
Reply | Threaded
Open this post in threaded view
|

Re: OrbisGIS v4 stringtodouble

Gwendall Petit
Administrator
Bonjour Katia,

Oui effectivement, lorsque tu fais ta jointure il faut bien rajouter la condition WHERE a.gid = b.gid

Concernant la conversion de string, il y a effectivement eu une simplification concernant les opérateurs de conversion. Dorénavant les choses sont simplifiés, puiqu'il existe un unique opérateur pour convertir les champs. On parle alors de CAST ... et un post a ce sujet est déjà présent ICI.

Dis nous si ça règle ton problème.

Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: OrbisGIS v4 stringtodouble

KatiaC
Merci Gwendall pour ta réponse.
Mais, non apparemment, ça ne règle pas tout, ou bien je n'utilise pas bien cette fonction. Voici donc ma nouvelle requête pour transformer de suite les colonnes du fichier csv en entier (j'ai aussi essayé avec double, j'ai la même erreur):
CREATE TABLE BuildingTypes_int as SELECT *,gid :: integer as gid_int from BuildingTypes_vec;

ce qui conduit à:
ERROR [Thread-209] (ExecuteScriptProcess.java:200) - Erreur sémantique SQL
org.gdms.sql.engine.UnknownFieldException: The field gid_int does not exist.


Merci de ton aide.

Katia
Reply | Threaded
Open this post in threaded view
|

Re: OrbisGIS v4 stringtodouble

Gwendall Petit
Administrator
Hum ... c'est étrange. Il te dit que le champ gid_int n'existe pas... mais c'est normal puisque tu vas le créer dans la requête.

Juste au hasard, tu es sûr que tu n'as pas un autre bout de script SQL que tu aurais oublié de mettre en commentaire et qui est exécuté avant cette requête et qui renverrait cette erreur ?

Essaye de refaire le script ci-dessous en ayant pris soin de vider ta console préalablement. On aura au moins éliminé cette option.
CREATE TABLE BuildingTypes_int AS SELECT *, gid :: integer as gid_int from BuildingTypes_vec;
CREATE TABLE toto AS SELECT a.the_geom, b.* from VegDUD_Grid a, BuildingTypes_int b where a.gid=b.gid_int;
En supposant bien évidemment que a.gid est bien un integer également !

Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: OrbisGIS v4 stringtodouble

KatiaC
J'ai nettoyé la console et j'ai copié les requêtes que tu m'as indiquées. Voici  ce que j'obtiens... (je m'étais trompée dans les erreurs copiées précédemment!)

Lancer l'instruction 1/2 :
CREATE TABLE BuildingTypes_int AS SELECT *, gid :: integer as gid_int from BuildingTypes_vec;
ERROR [Thread-237] (ExecuteScriptProcess.java:200) - Erreur sémantique SQL
org.gdms.sql.engine.UnknownFieldException: The field gid does not exist.
        at org.gdms.sql.evaluator.FieldEvaluator.doValidate(FieldEvaluator.scala:51)
        at org.gdms.sql.evaluator.Evaluator.validate(Evaluator.scala:60)
        at org.gdms.sql.evaluator.Expression.validate(Expressions.scala:149)
        at org.gdms.sql.evaluator.Evaluator$$anonfun$validate$1.apply(Evaluator.scala:59)
        at org.gdms.sql.evaluator.Evaluator$$anonfun$validate$1.apply(Evaluator.scala:59)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
        at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
        at scala.collection.immutable.List.foreach(List.scala:76)
        at scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
        at scala.collection.immutable.List.map(List.scala:76)
        at org.gdms.sql.evaluator.Evaluator.validate(Evaluator.scala:59)
        at org.gdms.sql.evaluator.Expression.validate(Expressions.scala:149)
        at org.gdms.sql.engine.commands.ExpressionCommand$$anonfun$doPrepare$4.apply(ExpressionCommand.scala:94)
        at org.gdms.sql.engine.commands.ExpressionCommand$$anonfun$doPrepare$4.apply(ExpressionCommand.scala:94)
        at scala.collection.mutable.ArraySeq.foreach(ArraySeq.scala:72)
        at org.gdms.sql.engine.commands.ExpressionCommand$class.doPrepare(ExpressionCommand.scala:94)
        at org.gdms.sql.engine.commands.ProjectionCommand.doPrepare(ProjectionCommand.scala:101)
        at org.gdms.sql.engine.commands.Command.prepare(Command.scala:106)
        at org.gdms.sql.engine.commands.Command$$anonfun$prepare$1.apply(Command.scala:105)
        at org.gdms.sql.engine.commands.Command$$anonfun$prepare$1.apply(Command.scala:105)
        at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
        at scala.collection.immutable.List.foreach(List.scala:76)
        at org.gdms.sql.engine.commands.Command.prepare(Command.scala:105)
        at org.gdms.sql.engine.commands.Command$$anonfun$prepare$1.apply(Command.scala:105)
        at org.gdms.sql.engine.commands.Command$$anonfun$prepare$1.apply(Command.scala:105)
        at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
        at scala.collection.immutable.List.foreach(List.scala:76)
        at org.gdms.sql.engine.commands.Command.prepare(Command.scala:105)
        at org.gdms.sql.engine.SQLStatement.prepare(SQLStatement.scala:166)
        at org.orbisgis.view.sqlconsole.actions.ExecuteScriptProcess.run(ExecuteScriptProcess.java:118)
        at org.orbisgis.view.background.Job.run(Job.java:74)
        at org.orbisgis.view.background.RunnableBackgroundJob.run(RunnableBackgroundJob.java:71)
        at java.lang.Thread.run(Thread.java:724)
Reply | Threaded
Open this post in threaded view
|

Re: OrbisGIS v4 stringtodouble

Gwendall Petit
Administrator
Ok donc là le message est clair. Le champ gid n'existe pas.
Cela veut dire que ta table BuildingTypes_vec ne comporte pas de champ nommé gid ?!

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: OrbisGIS v4 stringtodouble

KatiaC
Voici mon fichier. Est-ce que c'est parce qu'il n'y a pas de guillemets à gid?

BuildingTypes_vec.csv

Merci de ton aide.

Katia
Reply | Threaded
Open this post in threaded view
|

Re: OrbisGIS v4 stringtodouble

Gwendall Petit
Administrator
Oulà ... il me semble que tu as un espace avant "gid".
Dans ton .csv, supprime l'espace et retente la procédure.

Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: OrbisGIS v4 stringtodouble

KatiaC
Je n'ai pas pensé à l'espace!
Merci beaucoup Gwendall, désormais, ça marche bien mieux!

Bonne journée

Katia
Reply | Threaded
Open this post in threaded view
|

Re: OrbisGIS v4 stringtodouble

Gwendall Petit
Administrator
Pas de soucis. ça me rassure dans un sens

Gwendall