Field not found: the_geom

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

Field not found: the_geom

timea
Bonjour,

J'ai encore des question. Je voulais exécuter la requête suivante, quand j'ai obtenu le message erreur comme suit:
select register('gridIntersectWithroute');
create table "gridIntersectWithroute" as select intersection(a.the_geom,b.the_geom) as the_geom, a.gid, b."LARGEUR" from grid a, route b where isValid(b.the_geom)
and intersects(a.the_geom,b.the_geom);
select register('exploded');
create table exploded as select explode() from "gridIntersectWithroute";
select register('filterPoints');
create table "filterPoints" as select * from exploded where
dimension(the_geom) = 1;

select register('unionGridroute');
create table "unionGridroute" as select geomunion(the_geom) as the_geom, length("the_geom") as longueur, "LARGEUR" as largeur, gid from  "filterPoints" group by gid;

et le message erreur:
Semantic error in instruction:create table "unionGridroute" as select geomunion(the_geom) as the_geom, length("the_geom") as longueur, "LARGEUR" as largeur, gid from
 "filterPoints" group by gid
Caused by: Field not found: the_geom

je pense que tout simplement j'utilise mal la fonction length ou bien le geomunion.... A votre avis d'où vient le problème?
Merci d'avance.
Reply | Threaded
Open this post in threaded view
|

Re: Field not found: the_geom

timea
J'ai oublié de dire que j'ai essayé la forme dans le catalogue sql d'OrbisGIS:
select Length(the_geom) from myTable;

mais cela n'a pas marché non plus....
Reply | Threaded
Open this post in threaded view
|

Re: Field not found: the_geom

Gwendall Petit
Administrator
Bonjour Timea,

As-tu vérifié que le champ qui porte la géométrie dans ta couche "filterPoints" se nomme bien "the_geom".
Comme tu fais appel à la fonction "exploded" il se peut que ton champ soit renommé en "unknown0".

Si c'est bien le cas, remplace the_geom par unknown0 dans ta requête finale :

create table "unionGridroute" as select geomunion(unknown0) as the_geom, length(unknown0) as longueur, "LARGEUR" as largeur, gid from  "filterPoints" group by gid;

De plus, je vois que tu fais appel aux champs "LARGEUR" et "gid" qui doivent provenir de "filterPoints". Mais es-tu bien certaine que ces champs sont dans cette table ? --> Dans la requête qui construit cette table on ne les voit pas --> tu demandes juste à récupérer l'ensemble des objets provenant de la couche "exploded". Le problème c'est que dans cette couche, tu n'as plus les champs "LARGEUR" ... que tu as généré dans la toute première couche "gridIntersectWithroute".
Reply | Threaded
Open this post in threaded view
|

Re: Field not found: the_geom

timea
Bonjour Gwendal,

Dsl mais je ne peux écrire que par période étant donnée ma situation actuelle...

Pour répondre: ta requête proposé ne marche pas.
Le problème ne vient pas de nom, car les fichiers contiennent bien les colonnes référencés. Je ne connais tjs pas assez bien le SQL mais j'ai du comprendre que ce message est en liaison avec la grammaire de ce langage.

Donc pour ça il faut que j'écris une ligne mieux structuré mais avec les mêmes champs ou bien séparer le commande en deux lignes.
D'abord le geomunion puis le "length"?

D'ailleurs j'ai essayé utiliser la requête disponible pour la compacité et cela ne marche pas. Faut-il y ajouter qc? (CircleCompacity dans le document pdf fournie par vous.)

Merci d'avance.
Reply | Threaded
Open this post in threaded view
|

Re: Field not found: the_geom

Gwendall Petit
Administrator
Bonjour Timea,

On va reprendre les choses depuis le début !

Dans ta requête :
select register('unionGridroute');
create table "unionGridroute" as select geomunion(the_geom) as the_geom, length("the_geom") as longueur, "LARGEUR" as largeur, gid from  "filterPoints" group by gid;
Tu cherches à unifier l'ensemble des objets de la couche "filterPoints" en les regroupant via le champ "gid". De plus tu souhaites obtenir la longueur de chaque géométrie et la largeur.

A mon avis, le problème vient du fait que tu appelles la fonction "Lenght" trop tôt. En effet tu veux connaître la longueur total des objets une fois regroupés.

Dès lors, je te prose de procéder comme suit :
select register('unionGridroute');
create table "unionGridroute" as select geomunion(the_geom) as the_geom, "LARGEUR" as largeur, gid from "filterPoints" group by gid;

select register('nom_nouvelle_couche');
create table nom_nouvelle_couche as select *, Length(the_geom) as longueur from "unionGridroute";
Je viens de faire un test sur mon pc, l'opération est passée sans soucis... j'ai donc bon espoir pour toi aussi.
De plus, si c'est OK, pense à remplacer le nom de la couche "unionGridroute"dans la requête qui suit... par "nom_nouvelle_couche".

Par ailleurs, je voudrais faire une petite remarque concernant ta requête suivante :
select register('filterPoints');
create table "filterPoints" as select * from exploded where dimension(the_geom) = 1;
Si j'ai bien compris, tu souhaites créer une nouvelle couches dans laquelle tu n'auras que des points ?
- Si c'est la cas, le numéro de la géométrie n'est pas le bon. En effet, on part du principe que la dimension du point = 0, celle de la ligne = 1 et celle du polygone = 2.
Donc ici dans ta requête tu vas sélectionner tout les objets de type ligne.
- Si c'était bien ton intention de sélectionner les lignes, le nom de ta couche m'a induit en erreur

Pour finir, je souhaiterais juste apporter une petite nuance à ce que tu as écrit précédemment : les traitements que nous mettons à disposition sur le site d'OrbisGIS (via les .pdf et l'aide en ligne) ont tous été testés à plusieurs reprises.... Donc sauf grosse erreur de notre part, ils fonctionnent tous.
Les problèmes que tu rencontres viennent en partie du fait que tu adaptes les scripts à tes propres besoins... et que parfois ça génère des erreurs.
Reply | Threaded
Open this post in threaded view
|

Re: Field not found: the_geom

timea
Bonjour Gwendal,

A mon avis, le problème vient du fait que tu appelles la fonction "Lenght" trop tôt. En effet tu veux connaître la longueur total des objets une fois regroupés.

Je suis d'accord, dans la dernière version envoyée, j'ai appelé trop tôt la fonction length.

Dès lors, je te prose de procéder comme suit :
select register('unionGridroute');
create table "unionGridroute" as select geomunion(the_geom) as the_geom, "LARGEUR" as largeur, gid from "filterPoints" group by gid;

select register('nom_nouvelle_couche');
create table nom_nouvelle_couche as select *, Length(the_geom) as longueur from "unionGridroute";
Je viens de faire un test sur mon pc, l'opération est passée sans soucis... j'ai donc bon espoir pour toi aussi.
De plus, si c'est OK, pense à remplacer le nom de la couche "unionGridroute"dans la requête qui suit... par "nom_nouvelle_couche".

Malheureusement chez moi cela ne marche pas.
Donc si je lance la requête suivante:
select register('gridIntersectWithroute');
create table "gridIntersectWithroute" as select intersection(a.the_geom,b.the_geom) as the_geom, a.gid, b."LARGEUR" from grid a, route b where isValid(b.the_geom)
and intersects(a.the_geom,b.the_geom);
select register('exploded');
create table exploded as select explode() from "gridIntersectWithroute";
select register('filterPoints');
create table "filterPoints" as select * from exploded where
dimension(the_geom) = 1;
select register('unionGridroute');
create table "unionGridroute" as select geomunion(the_geom) as the_geom, "LARGEUR" as largeur, gid from "filterPoints" group by gid;

select register('longu');
create table longu as select *, Length(the_geom) as longueur from "unionGridroute";

j'ai le message erreur suivant:
Semantic error in instruction:create table "unionGridroute" as select geomunion(the_geom) as the_geom, "LARGEUR" as largeur, gid from "filterPoints" group by gid
Caused by: Field not found: LARGEUR

pourtant la colonne est bien là, et elle s'appelle LARGEUR...
donc pas d'idée




Par ailleurs, je voudrais faire une petite remarque concernant ta requête suivante :
select register('filterPoints');
create table "filterPoints" as select * from exploded where dimension(the_geom) = 1;
Si j'ai bien compris, tu souhaites créer une nouvelle couches dans laquelle tu n'auras que des points ?

Non, je traite les routes, donc j'ai besoin des lignes et pas des points.

- Si c'est la cas, le numéro de la géométrie n'est pas le bon. En effet, on part du principe que la dimension du point = 0, celle de la ligne = 1 et celle du polygone = 2.
Donc ici dans ta requête tu vas sélectionner tout les objets de type ligne.
- Si c'était bien ton intention de sélectionner les lignes, le nom de ta couche m'a induit en erreur

Pour finir, je souhaiterais juste apporter une petite nuance à ce que tu as écrit précédemment : les traitements que nous mettons à disposition sur le site d'OrbisGIS (via les .pdf et l'aide en ligne) ont tous été testés à plusieurs reprises.... Donc sauf grosse erreur de notre part, ils fonctionnent tous.
Les problèmes que tu rencontres viennent en partie du fait que tu adaptes les scripts à tes propres besoins... et que parfois ça génère des erreurs.

Surement. Je vérifie.
Merci.

Reply | Threaded
Open this post in threaded view
|

Re: Field not found: the_geom

Gwendall Petit
Administrator
Bonjour Timea,

Je crois avoir compris d'ou provient ton problème.
select register('unionGridroute');
create table "unionGridroute" as select geomunion(the_geom) as the_geom, "LARGEUR" as largeur, gid from "filterPoints" group by gid;
Dans cette requête tu souhaites regrouper toutes les géométries via le champ "gid" et en plus tu veux que la largeur soit notée. Le soucis vient du fait qu'OrbisGIS ne sait pas comment regrouper les valeurs du champ "LARGEUR". Tel quel, il ne sait pas s'il faut retenir la valeur minimale, maximale, moyenne, la première par ordre ascendant, la somme ... ?
Il faut donc que tu lui indiques un opérateur qui va lui dire comment tu veux opérer le regroupement des valeurs de ce champ.

Voici un exemple, avec la création d'un champ qui comportera la somme des valeurs de largeur :
create table unionGridroute as select geomunion(the_geom) as the_geom, Sum("LARGEUR") as sum_largeur, gid from filterPoints group by gid;
Après c'est à toi de savoir quel opération tu vas utiliser pour ton étude.

timea wrote
pourtant la colonne est bien là, et elle s'appelle LARGEUR...
Oui effectivement. Si le problème vient bien de cela, je suis d'accord pour dire qu'OrbisGIS devrait être plus explicite dans l'indication de la nature du bug. Au lieu de mettre "Field not found", il serait préférable qu'il mette quelque chose du genre "incompatible operation..."
Reply | Threaded
Open this post in threaded view
|

Re: Field not found: the_geom

timea
Merci Gwendall!
Je trouve ta réponse très constructive!
(je peux la vérifier chez moi que demain, mais merci!)