OrbisGIS 4.0 - Fonction AVG - Convertir des données en Float

classic Classic list List threaded Threaded
8 messages Options
MD
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

OrbisGIS 4.0 - Fonction AVG - Convertir des données en Float

MD
Bonjour à tous,

J'utilise la fonction AVG pour calculer une moyenne sur un jeu de données (réseaux d'assainissement) mais j'obtiens le message d'erreur suivant:
"The given parameter types does not match any signature"

J'ai fait des tests sur d'autres colonnes de ma table d'attribut et cela fonctionne parfaitement sauf sur celle qui m'intéresse. Manuellement, j'ai alors crée une nouvelle colonne et j'ai choisi le type "FLOAT", j'ai rentré quelques valeurs de la colonne qui m'intéresse. Et là, le calcul fonctionne. Mais il est fastidieux de faire cela manuellement (plusieurs milliers de lignes dans la table).

Existe-t-il une fonction pour convertir les données de la colonne en Float ? Je crois que les données de ma colonne sont de type BINARY.

Pour l'instant, j'ai contourné le problème autrement, mais peut-être que le problème reviendra lors de l'utilisation de d'autres fonctions où le type de mes valeurs ne passera pas.

Désolée, je n'explique peut-être pas correctement le problème...

MD
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: OrbisGIS 4.0 - Fonction AVG - Convertir des données en Float

Gwendall Petit
Administrator
Bonjour Melissa,

Pour la conversion de champs dans la V4.0 il me semble qu'il faille que tu utilises la fonction de CAST qui s'utilise avec le terme ::

Exemple avec un champ "my_field_int" qui est de type "int" et que tu souhaites convertir en "double"
SELECT *, my_field_int :: double as my_field_double FROM my_table;
J'espère que ça va t'aider.

Cordialement,

Gwendall
MD
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: OrbisGIS 4.0 - Fonction AVG - Convertir des données en Float

MD
Bonjour Gwendall,

Merci d'avoir répondu rapidement :-)

Rectification par rapport à ce que j'ai signalé précédemment. Il semblerait que mes données soient de type String.

J'ai donc utilisé la ligne de code suivante:
CREATE TABLE intersect_reseau_int AS SELECT *, R_AM_IGN :: integer as R_AM_IGN_int from intersect_reseau;

J'obtiens le message d'erreur suivant:

ERROR [Thread-44] (ExecuteScriptProcess.java:198) - Erreur d'accès à la donnée :
org.gdms.driver.DriverException: org.gdms.data.types.IncompatibleTypesException: Cannot convert value to int: [C@1262eb7
        at org.gdms.sql.engine.SQLStatement.execute(SQLStatement.scala:186)
        at org.orbisgis.view.sqlconsole.actions.ExecuteScriptProcess.run(ExecuteScriptProcess.java:173)
        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(Unknown Source)
Caused by: org.gdms.data.types.IncompatibleTypesException: Cannot convert value to int: [C@1262eb7
        at org.gdms.data.values.DefaultStringValue.toType(DefaultStringValue.java:281)
        at org.gdms.sql.evaluator.CastEvaluator$$anonfun$eval$1.apply(CastEvaluator.scala:45)
        at org.gdms.sql.evaluator.CastEvaluator$$anonfun$eval$1.apply(CastEvaluator.scala:45)
        at org.gdms.sql.evaluator.Expression.evaluate(Expressions.scala:59)
        at org.gdms.sql.engine.commands.ProjectionCommand$$anonfun$scalarExecute$1$$anonfun$apply$6.apply(ProjectionCommand.scala:129)
        at org.gdms.sql.engine.commands.ProjectionCommand$$anonfun$scalarExecute$1$$anonfun$apply$6.apply(ProjectionCommand.scala:129)
        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.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:34)
        at scala.collection.mutable.ArrayOps.foreach(ArrayOps.scala:38)
        at scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
        at scala.collection.mutable.ArrayOps.map(ArrayOps.scala:38)
        at org.gdms.sql.engine.commands.ProjectionCommand$$anonfun$scalarExecute$1.apply(ProjectionCommand.scala:129)
        at org.gdms.sql.engine.commands.ProjectionCommand$$anonfun$scalarExecute$1.apply(ProjectionCommand.scala:127)
        at scala.collection.parallel.IterableSplitter$Mapped.next(RemainsIterator.scala:455)
        at scala.collection.Iterator$class.foreach(Iterator.scala:772)
        at scala.collection.parallel.IterableSplitter$Mapped.foreach(RemainsIterator.scala:452)
        at org.gdms.sql.engine.commands.QueryOutputCommand$$anonfun$doWork$2.apply(QueryOutputCommand.scala:69)
        at org.gdms.sql.engine.commands.QueryOutputCommand$$anonfun$doWork$2.apply(QueryOutputCommand.scala:69)
        at scala.collection.Iterator$class.foreach(Iterator.scala:772)
        at scala.collection.immutable.StreamIterator.foreach(Stream.scala:933)
        at org.gdms.sql.engine.commands.QueryOutputCommand.doWork(QueryOutputCommand.scala:69)
        at org.gdms.sql.engine.commands.Command.execute(Command.scala:66)
        at org.gdms.sql.engine.commands.CreateTableCommand$$anonfun$execute$1.apply(CreateTableCommand.scala:78)
        at org.gdms.sql.engine.commands.CreateTableCommand$$anonfun$execute$1.apply(CreateTableCommand.scala:78)
        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.engine.commands.CreateTableCommand.execute(CreateTableCommand.scala:78)
        at org.gdms.sql.engine.SQLStatement.execute(SQLStatement.scala:184)
        ... 4 more
Caused by: java.lang.NumberFormatException: For input string: "30.68"
        at java.lang.NumberFormatException.forInputString(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at org.gdms.data.values.ValueFactory.createValueByType(ValueFactory.java:292)
        at org.gdms.data.values.DefaultStringValue.toType(DefaultStringValue.java:271)
        ... 36 more

Quel peut être le problème ?


MD

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: OrbisGIS 4.0 - Fonction AVG - Convertir des données en Float

Gwendall Petit
Administrator
Le problème est que tu cherches à convertir du texte (string) en une valeur numérique, et plus spécifiquement en entier (integer).
Et il semble que tu ais des valeurs non entières (Caused by: java.lang.NumberFormatException: For input string: "30.68").

Essayes plutôt de convertir en double pour voir si ça passe.

Je précise en plus que bien évidemment si jamais tu as des caractères dans ce champs, ça ne fonctionnera pas.

Gwendall
MD
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: OrbisGIS 4.0 - Fonction AVG - Convertir des données en Float

MD
In reply to this post by MD
Re,

J'ai aussi testé:
CREATE TABLE intersect_reseau_double AS SELECT *, R_AM_IGN :: double as R_AM_IGN_double from intersect_reseau;

Mais toujours "erreur d'accès à la donnée".

MD
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: OrbisGIS 4.0 - Fonction AVG - Convertir des données en Float

Gwendall Petit
Administrator
Du coup j'ai un doute sur le séparateur de décimale. Ici tu sembles avoir un point. Il est probable qu'il faille avoir une virgule (mais à tester car je ne suis plus sûr).

Gwendall
MD
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: OrbisGIS 4.0 - Fonction AVG - Convertir des données en Float

MD
This post was updated on .
Bonjour Gwendall,

Merci pour tes retours !!

- Effectivement, j'ai essayé sur un petit jeu de données où j'ai changé manuellement les points en virgule. La fonction CAST fonctionne ! Par contre, cela ne tient pas compte des séparateurs, les 40,38 ont été transformés en 4038 ...

J'ai lu le post suivant:
http://orbisgis.3871844.n2.nabble.com/fichiers-csv-string-to-double-td7575003.html#a7575004
Et c'est étrange car la personne avait rencontré le problème inverse, elle avait remplacé les "," par des "." !

- Autre point, j'ai changé manuellement les "." en "," sur un plus petit jeu de données directement via la table d'attribut. Mais si je veux changer l'ensemble (milliers de lignes), cela nécessite je fasse une sauvegarde de ma couche en csv, de changer les "." en "," via OpenOffice. Ensuite, je peux l'ouvrir avec OrbisGIS via la fonction CSVRead (qui ne semble pas fonctionner sur la version 4 mais sur la version 5.1) puis de transformer le fichier en couche géographique (.shp). J'avais déjà transformé facilement des fichiers csv en shp lorsque la géométrie était de type points (ST_MAKEPOINT) mais là il s'agit de polygones, j'ai donc utilisé ST_MAKEPOLYGON mais cela ne fonctionne pas. Je n'ai pas du utiliser la fonction correctement:

CREATE TABLE geom_test as select ST_MAKEPOLYGON(the_geom) the_geom, valeur, explod_id, R_AM_IGN from test_bis;



MD
MD
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: OrbisGIS 4.0 - Fonction AVG - Convertir des données en Float

MD
Bonjour,

Finalement, j'ai réussi à convertir mes données (j'ai fait autrement, sans passer par OrbisGIS). Mes données sont bien en valeurs numériques maintenant.

Du coup, plus de problème lors de l'utilisation de la fonction AVG et d'éventuelles autres fonctions.

En tout cas, merci pour l'aide ! Et à très bientôt sans doute pour de nouvelles questions !

Bonne journée.

MD
Loading...