ST_CONSTRAINEDDELAUNAY, OrbisGIS 5.0

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

ST_CONSTRAINEDDELAUNAY, OrbisGIS 5.0

Thierry_SCHMIDT
Bonjour à tous,

je souhaite mettre en œuvre la fonction ST_CONSTRAINEDDELAUNAY et souhaite avoir des infos sur les données sources nécessaires et leurs formats.
A la base j'ai un fichier de point avec les valeurs à interpoler et un fichier de polylines (mes axes routiers) sur lesquels je souhaite contraindre l'interpolation.
le descriptif de la fonction indique --If the input geometry does not contain any lines, a delaunay triangulation will be computed.
Dans le précédent topic "ST_DELAUNAY, OrbisGIS 5.0" vous m'avez indiqué que les fonction ST_DELAUNAY et ST_CONSTRAINEDDELAUNAY ne sont plus agrégative.
 
du coup j'ai essayé un ajout des polylines dans le fichier de point puis une agrégation des géométries avant d'utiliser la triangulation. le code est présenté ci-dessous. J'ai un message d'erreur lors de l’exécution de la fonction ST_CONSTRAINEDDELAUNAY.

-- Creation de la table POLLUANT qui va contenir une géometrie. La valeur de concentration est affectée au niveau du Z de la géometrie.
create table POLLUANT as select ST_UpdateZ(the_geom, VALEUR) as the_geom from TABLE_POINT ;
-- addition des polylines à la table POLLUANT
insert into POLLUANT select the_geom from  ROUTE_POLYLINE ;
-- agrégation du tout en GeometryCollection via la fonction ST_ACCUM
create table POLLUANT_COLLECTION as select ST_ACCUM(the_geom) as the_geom from POLLUANT ;
--Triangulation de la table
create table TIN_POLLUANT as select ST_CONSTRAINEDDELAUNAY(the_geom) as the_geom from POLLUANT_COLLECTION ;

j'ai regarder dans le descriptif de noisemap mais la fonction ST_CONSTRAINEDDELAUNAY est à priori inclu dans une "macro fonction".

Ma démarche est elle approprié à la fonction ?  

voici le message d'erreur :
(les "..." au début indique qu'il me sort toute les géométries et vu que j'en ai bcp bcp, j'ai pas le début du message d'erreur alors j'ai repris que la fin)

...551, 306483.687 6703791.657)))): We should already be on this event point"; SQL statement:
create table TIN_POLLUANT as select ST_CONSTRAINEDDELAUNAY(the_geom) as the_geom from POLLUANT_COLLECTION [90105-176]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
        at org.h2.message.DbException.get(DbException.java:167)
        at org.h2.message.DbException.convertInvocation(DbException.java:311)
        at org.h2.engine.FunctionAlias$JavaMethod.getValue(FunctionAlias.java:493)
        at org.h2.expression.JavaFunction.getValue(JavaFunction.java:39)
        at org.h2.expression.Alias.getValue(Alias.java:37)
        at org.h2.command.dml.Select.queryFlat(Select.java:540)
        at org.h2.command.dml.Select.queryWithoutCache(Select.java:646)
        at org.h2.command.dml.Query.query(Query.java:323)
        at org.h2.command.dml.Insert.insertRows(Insert.java:168)
        at org.h2.command.dml.Insert.update(Insert.java:115)
        at org.h2.command.ddl.CreateTable.update(CreateTable.java:184)
        at org.h2.command.CommandContainer.update(CommandContainer.java:79)
        at org.h2.command.Command.executeUpdate(Command.java:254)
        at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:186)
        at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:160)
        at org.h2gis.utilities.wrapper.StatementWrapper.execute(StatementWrapper.java:93)
        at org.orbisgis.view.sqlconsole.actions.ExecuteScriptProcess.parseAndExecuteScript(ExecuteScriptProcess.java:125)
        at org.orbisgis.view.sqlconsole.actions.ExecuteScriptProcess.run(ExecuteScriptProcess.java:154)
        at org.orbisgis.view.background.Job.run(Job.java:79)
        at org.orbisgis.view.background.RunnableBackgroundJob.run(RunnableBackgroundJob.java:71)
        at java.lang.Thread.run(Unknown Source)
Caused by: org.jdelaunay.delaunay.error.DelaunayError: We should already be on this event point
        at org.jdelaunay.delaunay.ConstrainedMesh.forceConstraintIntegrity(ConstrainedMesh.java:917)
        at org.h2gis.h2spatialext.function.spatial.mesh.ST_ConstrainedDelaunay.buildDelaunay(ST_ConstrainedDelaunay.java:111)
        at org.h2gis.h2spatialext.function.spatial.mesh.ST_ConstrainedDelaunay.createCDT(ST_ConstrainedDelaunay.java:82)
        at org.h2gis.h2spatialext.function.spatial.mesh.ST_ConstrainedDelaunay.createCDT(ST_ConstrainedDelaunay.java:67)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.h2.engine.FunctionAlias$JavaMethod.getValue(FunctionAlias.java:481)
        ... 18 more


Thierry
Reply | Threaded
Open this post in threaded view
|

Re: ST_CONSTRAINEDDELAUNAY, OrbisGIS 5.0

Nicolas F.
Administrator
bonjour,

Je n'ai pas vu ton jeu de données mais je sais que j'ai eu des problèmes avec une grille de point en entrée. L'astuce est :

1) d'ajouter un point à gauche (axe X inférieur) pour résoudre le problème puis enlever les triangles qui touchent ce point

ou

2) Déplacer légerement un des point existant à gauche

en:
JDelaunay does'nt like aligned points in the left side of the input. (This is an issue). You should move one point at the west (X negative) using an epsilon value.

Cordialement,

Nicolas Fortin
Reply | Threaded
Open this post in threaded view
|

Re: ST_CONSTRAINEDDELAUNAY, OrbisGIS 5.0

Thierry_SCHMIDT
Bonjour Nicolas,

j'ai effectivement une grille avec alignement de plusieurs point en X min.
j'ai essayé ton astuce en ajoutant un point X min mais le message persiste.
J'ai également ajouté :
- un FENCE pour sélectionner uniquement les routes dans ma zone d'étude et limiter la zone de calcul.
- un ST_Explode pour être sûr de n'avoir pas de multipolylignes.
- un filtre pour être sûr de n'avoir qu'un seul point pour un X et Y donnée.

voici le warning qui est affiché en bas dans OrbisGIS lors de l'utilisation de la fonction ST_CONSTRAINEDDELAUNAY  (cf. capture d'écran à la fin du post):
"Exeption calling user-defined function: "createCDT(GEOMETRYCOLLECTION (POINT (xxxxxx yyyyyyy), (POINT (xxxx.......""

Dans ma table POLLUANT_COLLECTION (sur laquelle j’exécute Delaunay) j'ai bien un seul enregistrement comprenant des points en X Y Z et des lignes en X Y.

Le nouveau code est détaillé ci-dessous.

-- prétraitement des routes
--création d'une enveloppe de travail
create table FENCE as select ST_MAKEENVELOPE(346000, 6681500, 364000, 6698000) as the_geom ;
-- sélection des routes comprises dans l'enveloppe d'étude
create table ROUTE_ETUDE as select ST_Intersection(a.the_geom,b.the_geom)as the_geom, a.ID_TRRTE  from BDCARTO_AGGLO_A2013_V2014_L93_POLYLINE a, FENCE b where ST_Intersects(a.the_geom, b.the_geom) ;
-- éclatement des multipolylignes pour etre sûr de travailler uniquement avec des polylignes
create table ROUTE_EXPLODE as select * from ST_Explode('ROUTE_ETUDE') order by EXPLOD_ID, ID_TRRTE;

-- calcul de l'interpolation
-- vérification de la table point à interpoler  
create table CONCENTRATION as select THE_GEOM, AVG(NO2_MOY) as NO2_MOY, COUNT(THE_GEOM) as nb_point from ADMS_NANTES_2013_POINT group by THE_GEOM order by THE_GEOM ;
-- Creation de la table POLLUANT qui va contenir une géometrie. La valeur de concentration est affectée au niveau du Z de la géometrie.
create table POLLUANT as select ST_UpdateZ(the_geom, NO2_MOY) as the_geom from CONCENTRATION ;
-- ajout d'un point Est pour debugger l'interpolation
INSERT INTO POLLUANT VALUES('POINT (335000 6690000 15)') ;
-- addition des polylines à la table POLLUANT
insert into POLLUANT select the_geom from ROUTE_EXPLODE  ;
-- agrégation du tout en GeometryCollection via la fonction ST_ACCUM
create table POLLUANT_COLLECTION as select ST_ACCUM(the_geom) as the_geom from POLLUANT ;
--Triangulation de la table
create table TIN_POLLUANT as select ST_CONSTRAINEDDELAUNAY(the_geom) as the_geom from POLLUANT_COLLECTION ;

voici une capture d'écran avec le warning en bas
Reply | Threaded
Open this post in threaded view
|

Re: ST_CONSTRAINEDDELAUNAY, OrbisGIS 5.0

Nicolas F.
Administrator

Bonjour,

Je ne comprend pas pourquoi tu ajoutes les routes dans le maillage sachant que tes routes n'ont pas de NO2 au Z de chaque point ?


-Nicolas

 

 

Le 2015-02-25 10:43, Thierry_SCHMIDT [via OrbisGIS] a écrit :

Bonjour Nicolas,

j'ai effectivement une grille avec alignement de plusieurs point en X min.
j'ai essayé ton astuce en ajoutant un point X min mais le message persiste.
J'ai également ajouté :
- un FENCE pour sélectionner uniquement les routes dans ma zone d'étude et limiter la zone de calcul.
- un ST_Explode pour être sûr de n'avoir pas de multipolylignes.
- un filtre pour être sûr de n'avoir qu'un seul point pour un X et Y donnée.

voici le warning qui est affiché en bas dans OrbisGIS lors de l'utilisation de la fonction ST_CONSTRAINEDDELAUNAY  (cf. capture d'écran à la fin du post):
"Exeption calling user-defined function: "createCDT(GEOMETRYCOLLECTION (POINT (xxxxxx yyyyyyy), (POINT (xxxx.......""

Dans ma table POLLUANT_COLLECTION (sur laquelle j’exécute Delaunay) j'ai bien un seul enregistrement comprenant des points en X Y Z et des lignes en X Y.

Le nouveau code est détaillé ci-dessous.

-- prétraitement des routes
--création d'une enveloppe de travail
create table FENCE as select ST_MAKEENVELOPE(346000, 6681500, 364000, 6698000) as the_geom ;
-- sélection des routes comprises dans l'enveloppe d'étude
create table ROUTE_ETUDE as select ST_Intersection(a.the_geom,b.the_geom)as the_geom, a.ID_TRRTE  from BDCARTO_AGGLO_A2013_V2014_L93_POLYLINE a, FENCE b where ST_Intersects(a.the_geom, b.the_geom) ;
-- éclatement des multipolylignes pour etre sûr de travailler uniquement avec des polylignes
create table ROUTE_EXPLODE as select * from ST_Explode('ROUTE_ETUDE') order by EXPLOD_ID, ID_TRRTE;

-- calcul de l'interpolation
-- vérification de la table point à interpoler  
create table CONCENTRATION as select THE_GEOM, AVG(NO2_MOY) as NO2_MOY, COUNT(THE_GEOM) as nb_point from ADMS_NANTES_2013_POINT group by THE_GEOM order by THE_GEOM ;
-- Creation de la table POLLUANT qui va contenir une géometrie. La valeur de concentration est affectée au niveau du Z de la géometrie.
create table POLLUANT as select ST_UpdateZ(the_geom, NO2_MOY) as the_geom from CONCENTRATION ;
-- ajout d'un point Est pour debugger l'interpolation
INSERT INTO POLLUANT VALUES('POINT (335000 6690000 15)') ;
-- addition des polylines à la table POLLUANT
insert into POLLUANT select the_geom from ROUTE_EXPLODE  ;
-- agrégation du tout en GeometryCollection via la fonction ST_ACCUM
create table POLLUANT_COLLECTION as select ST_ACCUM(the_geom) as the_geom from POLLUANT ;
--Triangulation de la table
create table TIN_POLLUANT as select ST_CONSTRAINEDDELAUNAY(the_geom) as the_geom from POLLUANT_COLLECTION ;

voici une capture d'écran avec le warning en bas



If you reply to this email, your message will be added to the discussion below:
http://orbisgis.3871844.n2.nabble.com/ST-CONSTRAINEDDELAUNAY-OrbisGIS-5-0-tp7575246p7575255.html
To start a new topic under OrbisGIS Users, email [hidden email]
To unsubscribe from OrbisGIS Users, click here.
NAML

 

 
Reply | Threaded
Open this post in threaded view
|

Re: ST_CONSTRAINEDDELAUNAY, OrbisGIS 5.0

Thierry_SCHMIDT
Humm... :-/

bah en faite je souhaite contraindre mon interpolation par mes axes (pour améliorer l'interpolation delaunay standard) mais ne sachant pas utiliser la fonction, je n'étais pas au courant que les axes qui servent de contrainte doivent aussi avoir un Z à chaque nœud
-> Le mieux serait de disposer d'un jeux de donnée prêt à l’emploi pour que je comprenne où je pèche et savoir comment mettre en forme mes données avant l'interpolation.

sinon j'ai testé 3 idées (et 3 échecs) en liens avec ton précédent commentaire

idée 1 : ajout d'un Z fictif à mes polylignes
je viens de faire un test avec un Z fictif pour les polylignes avant de créer ma geometrycollection (ST_ACCUM) puis mon interpolation. Le message d'erreur s'affiche lors de l'interpolation.

idée 2 :  si la fonction n'accepte pas le Z pour les polylignes, il faut p-e que dans ma grille de calcul, j'ai un point avec un Z à chaque nœud de mes polylignes.

j'ai alors fait un test en sortant les nœuds de mes polylignes pour les ajouter à mon fichier de point de départ :
- convertir les polylignes en point via ST_ToMultiPoint
- puis ST_Explode pour avoir 1 seul point par enregistrement
- puis suppression des doublons
- puis ajout du Z
- puis ajout à la table point de départ

et enfin ajout des polylignes sans Z, création d'une geometrycollection (ST_ACCUM) et interpolation.
Résultats : idem que les précédemment, j'ai le même message d'erreur
"Exception calling user-defined function: createCDT(GEOMETRYCOLLECTION( POINT"

idée 3 : vu le message d'erreur "createCDT(GEOMETRYCOLLECTION....", j'ai essayé d’exécuter l'interpolation sans créer la GEOMETRYCOLLECTION au préalable (sans la fonction ST_ACCUM avant) et la j'ai un autre message d'erreur :
"ERROR [Thread-409] (ExecuteScriptProcess.java:160) - Exception calling user-defined function: "createCDT(POINT (345391.9398 6693525)): not enough points found to triangularize"; SQL statement:"