001: /*
002: * This file is part of the GeOxygene project source files.
003: *
004: * GeOxygene aims at providing an open framework which implements OGC/ISO specifications for
005: * the development and deployment of geographic (GIS) applications. It is a open source
006: * contribution of the COGIT laboratory at the Institut Géographique National (the French
007: * National Mapping Agency).
008: *
009: * See: http://oxygene-project.sourceforge.net
010: *
011: * Copyright (C) 2005 Institut Géographique National
012: *
013: * This library is free software; you can redistribute it and/or modify it under the terms
014: * of the GNU Lesser General Public License as published by the Free Software Foundation;
015: * either version 2.1 of the License, or any later version.
016: *
017: * This library is distributed in the hope that it will be useful, but WITHOUT ANY
018: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
019: * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
020: *
021: * You should have received a copy of the GNU Lesser General Public License along with
022: * this library (see file LICENSE if present); if not, write to the Free Software
023: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024: *
025: */
026:
027: package fr.ign.cogit.geoxygene.contrib.appariement.reseaux;
028:
029: import java.util.ArrayList;
030: import java.util.List;
031:
032: import fr.ign.cogit.geoxygene.feature.Population;
033:
034: /**
035: * Paramètres de l'appariement.
036: *
037: * @author Mustiere - IGN / Laboratoire COGIT
038: * @version 1.0
039: */
040: public class ParametresApp implements Cloneable {
041:
042: /////////////////////////////////////////////////////////////////////////////////
043: ///////////// PARAMETRES SPECIFIANT QUELLE DONNEES SONT TRAITEES ////////////
044: /////////////////////////////////////////////////////////////////////////////////
045:
046: /** Liste des classes d'arcs de la BD 1 (la moins détaillée) concernés par l'appariement */
047: public List populationsArcs1 = new ArrayList();
048:
049: /** Liste des classes de noeuds de la BD 1 (la moins détaillée) concernés par l'appariement */
050: public List populationsNoeuds1 = new ArrayList();
051:
052: /** Liste des classes d'arcs de la BD 2 (la plus détaillée) concernés par l'appariement */
053: public List populationsArcs2 = new ArrayList();
054:
055: /** Liste des classes de noeuds de la BD 2 (la plus détaillée) concernés par l'appariement */
056: public List populationsNoeuds2 = new ArrayList();
057:
058: /** Prise en compte de l'orientation des arcs sur le terrain (sens de circulation).
059: * Si true : on suppose tous les arcs en double sens.
060: * Si false: on suppose tous les arcs en sens unique, celui défini par la géométrie.
061: * NB: ne pas confondre cette orientation 'géographique réelle', avec l'orientation de la géoémtrie.
062: *
063: * Utile ensuite pour l'appariement des arcs.
064: */
065: public boolean populationsArcsAvecOrientationDouble = true;
066:
067: /////////////////////////////////////////////////////////////////////////////////
068: ///////////////// TAILLES DE RECHERCHE ///////////////////////
069: ///////////////// Ecarts de distance autorisés ///////////////////////
070: ///////////////// CE SONT LES PARAMETRES PRINCIPAUX ///////////////////////
071: /////////////////////////////////////////////////////////////////////////////////
072:
073: /** Distance maximale autorisée entre deux noeuds appariés.
074: */
075: public float distanceNoeudsMax = 150;
076:
077: /** Distance maximale autorisée entre deux noeuds appariés, quand le noeud du réseau 1
078: * est une impasse uniquement.
079: * Ce paramètre permet de prendre en compte le fait que la localisation exacte des extrémités d'impasse
080: * est assez imprécise dans certains réseaux (où commence exactement une rivière par exemple?).
081: *
082: * Si cette distance est strictement négative, alors ce paramètre n'est pas pris en compte,
083: * et la distance maximale est la même pour tous les noeuds, y-compris aux extrémités.
084: */
085: public float distanceNoeudsImpassesMax = -1;
086:
087: /** Distance maximum autorisée entre les arcs des deux réseaux.
088: * La distance est définie au sens de la "demi-distance de Hausdorf" des arcs
089: * du réseau 2 vers les arcs du réseau 1.
090: */
091: public float distanceArcsMax = 100;
092:
093: /** Distance minimum sous laquelle l'écart de distance pour divers arcs du réseaux 2
094: * (distance vers les arcs du réseau 1) n'a plus aucun sens.
095: * Cette distance est typiquement de l'ordre de la précision géométrique du rééseau le moins précis.
096: */
097: public float distanceArcsMin = 30;
098:
099: /////////////////////////////////////////////////////////////////////////////////
100: ///////////// TRAITEMENTS TOPOLOGIQUES A L'IMPORT /////////////////
101: /////////////////////////////////////////////////////////////////////////////////
102:
103: /** Les noeuds proches du réseau 1 sont fusionnés en un seul noeud
104: * (proches = éloignés de moins que ce paramètre).
105: * Si ce paramètre est >0, les noeuds sont fusionés à une position moyenne, et les arcs sont déformés pour suivre.
106: * Si ce paramètre est =0, seul les noeuds strictement superposés sont fusionnés.
107: * Si ce paramètre est <0 (défaut), aucune fusion n'est faite.
108: */
109: public double topologieSeuilFusionNoeuds1 = -1;
110:
111: /** Les noeuds proches du réseau 2 sont fusionnés en un seul noeud
112: * (proches = éloignés de moins que ce paramètre).
113: * Si ce paramètre est >0, les noeuds sont fusionés à une position moyenne, et les arcs sont déformés pour suivre.
114: * Si ce paramètre est =0, seul les noeuds strictement superposés sont fusionnés.
115: * Si ce paramètre est <0 (défaut), aucune fusion n'est faite.
116: */
117: public double topologieSeuilFusionNoeuds2 = -1;
118:
119: /** Les noeuds du réseau 1 contenus dans une même surface de la population en paramètre
120: * seront fusionnés en un seul noeud pour l'appariement.
121: * Ce paramètre peut être null (défaut), auquel il est sans influence.
122: * Exemple typique: on fusionne toutes les extrémités de lignes ferrés arrivant dans une même aire de triage,
123: * si les aires de triage sont définies par des surfaces dans les données.
124: */
125: public Population topologieSurfacesFusionNoeuds1 = null;
126:
127: /** Les noeuds du réseau 2 contenus dans une même surface de la population en paramètre
128: * seront fusionnés en un seul noeud pour l'appariement.
129: * Ce paramètre peut être null (défaut), auquel il est sans influence.
130: * Exemple typique: on fusionne toutes les extrémités de lignes ferrés arrivant dans une même aire de triage,
131: * si les aires de triage sont définies par des surfaces dans les données.
132: */
133: public Population topologieSurfacesFusionNoeuds2 = null;
134:
135: /** Doit-on eliminer pour l'appariement les noeuds du réseau 1 qui n'ont que 2 arcs incidents
136: * et fusionner ces arcs ?
137: */
138: public boolean topologieElimineNoeudsAvecDeuxArcs1 = false;
139:
140: /** Doit-on eliminer pour l'appariement les noeuds du réseau 2 qui n'ont que 2 arcs incidents
141: * et fusionner ces arcs ?
142: */
143: public boolean topologieElimineNoeudsAvecDeuxArcs2 = false;
144:
145: /** Doit-on rendre le réseau 1 planaire (créer des noeuds aux intersections d'arcs)?
146: */
147: public boolean topologieGraphePlanaire1 = false;
148:
149: /** Doit-on rendre le réseau 2 planaire (créer des noeuds aux intersections d'arcs)?
150: */
151: public boolean topologieGraphePlanaire2 = false;
152:
153: /** Fusion des arcs doubles.
154: * Si true: si le réseau 1 contient des arcs en double (même géométrie exactement),
155: * alors on les fusionne en un seul arc pour l'appariement.
156: * Si false: rien n'est fait.
157: */
158: public boolean topologieFusionArcsDoubles1 = false;
159:
160: /** Fusion des arcs doubles.
161: * Si true: si le réseau 2 contient des arcs en double (même géométrie exactement),
162: * alors on les fusionne en un seul arc pour l'appariement.
163: * Si false: rien n'est fait.
164: */
165: public boolean topologieFusionArcsDoubles2 = false;
166:
167: /////////////////////////////////////////////////////////////////////////////////
168: ////////// TRAITEMENTS DE SURDECOUPAGE DES RESEAUX A L'IMPORT ///////////
169: /////////////////////////////////////////////////////////////////////////////////
170:
171: /** Doit on projeter les noeuds du réseau 1 sur le réseau 2 pour découper ce dernier ?
172: * Ce traitement réalise un surdécoupage du réseau 2 qui facilite l'appariement dans certains cas
173: * (par exemple si les réseaux ont des niveaux de détail proches), mais qui va aussi un peu
174: * à l'encontre de la philosophie générale du processus d'appariement.
175: * A utiliser avec modération donc.
176: */
177: public boolean projeteNoeuds1SurReseau2 = false;
178:
179: /** Distance max de la projection des noeuds 2 sur le réseau 1.
180: * Utile uniquement si projeteNoeuds1SurReseau2 = true.
181: */
182: public double projeteNoeuds1SurReseau2_DistanceNoeudArc = 0;
183:
184: /** Distance min entre la projection d'un noeud sur un arc et les extrémités de cet arc
185: * pour créer un nouveau noeud sur le réseau 2.
186: * Utile uniquement si projeteNoeuds1SurReseau2 = true.
187: */
188: public double projeteNoeuds1SurReseau2_DistanceProjectionNoeud = 0;
189:
190: /** Si true: on ne projete que les impasses du réseau 1 sur le réseau 2
191: * Si false: on projete tous les noeuds du réseau 1 sur le réseau 2.
192: * Utile uniquement si projeteNoeuds1SurReseau2 = true.
193: */
194: public boolean projeteNoeuds1SurReseau2_ImpassesSeulement = false;
195:
196: /** Doit on projeter les noeuds du réseau 2 sur le réseau 1 pour découper ce dernier ?
197: * Ce traitement réalise un surdécoupage du réseau 1 qui facilite l'appariement dans certains cas
198: * (par exemple si les réseaux ont des niveaux de détail proches), mais qui va aussi un peu
199: * à l'encontre de la philosophie générale du processus d'appariement.
200: * A utiliser avec modération donc.
201: */
202: public boolean projeteNoeud2surReseau1 = false;
203:
204: /** Distance max de la projection des noeuds 1 sur le réseau 2.
205: * Utile uniquement si projeteNoeuds2SurReseau1 = true.
206: */
207: public double projeteNoeud2surReseau1_DistanceNoeudArc = 0;
208:
209: /** Distance min entre la projection d'un noeud sur un arc et les extrémités de cet arc
210: * pour créer un nouveau noeud sur le réseau 1.
211: * Utile uniquement si projeteNoeuds2SurReseau1 = true.
212: */
213: public double projeteNoeud2surReseau1_DistanceProjectionNoeud = 0;
214:
215: /** Si true: on ne projete que les impasses du réseau 2 sur le réseau 1
216: * Si false: on projete tous les noeuds du réseau 2 sur le réseau 1.
217: * Utile uniquement si projeteNoeuds1SurReseau2 = true.
218: */
219: public boolean projeteNoeud2surReseau1_ImpassesSeulement = false;
220:
221: /////////////////////////////////////////////////////////////////////////////////
222: ///////////// VARIANTES DU PROCESSUS GENERAL //////////////////////
223: /////////////////////////////////////////////////////////////////////////////////
224:
225: /** Niveau de complexité: recherche ou non de liens 1-n aux noeuds.
226: * Si true: un noeud du réseau 1 est toujours apparié avec au plus un noeud du réseau 2 (1-1).
227: * Si false (défaut): on recherche liens 1-n aux noeuds .
228: *
229: * NB: dans le cas simple, le processus est énormément simplifié !!!!!!!!
230: * Ceci peut être pertinent si les données ont le même niveau de détail par exemple.
231: */
232: public boolean varianteForceAppariementSimple = false;
233:
234: /** Appariement en deux passes qui tente un surdécoupage du réseau pour les arcs non appariés en première passe.
235: * Si true: les arcs du réseau 1 non appariés dans une première passe sont redécoupés de manière
236: * à introduire un noeud dans le reséau 1 aux endroits où il s'éloigne trop du réseau 2.
237: * Si false (défaut): processus en une seule passe.
238: *
239: * NB: pour l'instant, après ce re-découpage l'appariement est entièrement refait, ce qui est long
240: * et très loin d'être optimisé: code à revoir !!!
241: */
242: public boolean varianteRedecoupageArcsNonApparies = false;
243:
244: /** Appariement en deux passes qui tente un surdécoupage du réseau pour les noeuds non appariés en première passe.
245: * Si true: les noeuds du réseau 1 non appariés dans une première passe sont projetés au plus proche
246: * sur le réseau 2 pour le découper
247: * Si false (défaut): processus en une seule passe.
248: *
249: * Il s'agit en fait de la même opération que celle qui est faite quand 'projeteNoeuds1SurReseau2'='true',
250: * mais uniquement pour les noeuds non appariés en première passe, et avec des seuils éventuellement
251: * différents et définis par les paramètres suivants :
252: * - redecoupageNoeudsNonAppariesDistanceNoeudArc.
253: * - redecoupageNoeudsNonAppariesDistanceProjectionNoeud
254: *
255: * NB: pour l'instant, après ce re-découpage l'appariement est entièrement refait, ce qui est long
256: * et très loin d'être optimal: à revoir à l'occasion,
257: */
258: public boolean varianteRedecoupageNoeudsNonApparies = false;
259:
260: /** Distance max de la projection des noeuds du réseau 1 sur le réseau 2.
261: * Utilisé uniquement si varianteRedecoupageNoeudsNonApparies = true.
262: */
263: public double varianteRedecoupageNoeudsNonApparies_DistanceNoeudArc = 100;
264:
265: /** Distance min entre la projection d'un noeud sur un arc et les extrémités de cet arc
266: * pour créer un nouveau noeud sur le réseau 2 ?
267: * Utilisé uniquement si varianteRedecoupageNoeudsNonApparies = true.
268: */
269: public double varianteRedecoupageNoeudsNonApparies_DistanceProjectionNoeud = 50;
270:
271: /** Quand un arc est apparié à un ensemble d'arcs, élimine de cet ensemble
272: * les petites impasses qui créent des aller-retour parasites (de longueur inférieure à distanceNoeuds).
273: * NB: paramètre spécifique aux réseaux simples, qui permet d'améliorer le recalage.
274: */
275: public boolean varianteFiltrageImpassesParasites = false;
276:
277: /** Recherche des ronds-points (faces circulaires) dans le réseau 2, pour éviter
278: * d'apparier un noeud du réseau 1 à une partie seulement d'un rond-point
279: * (si une partie seulement est appariée, tout le rond point devient apparié).
280: * NB: Paramètre utile uniquement pour les réseaux routiers a priori.
281: */
282: public boolean varianteChercheRondsPoints = false;
283:
284: /////////////////////////////////////////////////////////////////////////////////
285: ///////////// OPTIONS D'EXPORT ////////////
286: /////////////////////////////////////////////////////////////////////////////////
287: /** Si true, la géométrie des liens est calculée des objets2 vers les objets 2
288: * si false, c'est l'inverse
289: */
290: public boolean exportGeometrieLiens2vers1 = true;
291:
292: /////////////////////////////////////////////////////////////////////////////////
293: ///////////// OPTIONS DE DEBUG ////////////
294: /////////////////////////////////////////////////////////////////////////////////
295: /** Paramètre pour gérer l'affichage des commentaires dans la fenêtre de contrôle
296: * Si c'est égal à 0 : aucun commentaire n'est affiché
297: * Si c'est égal à 1 : le début des grandes étapes et les principaux résultats sont signalés
298: * Si c'est égal à 2 (debug) : tous les messages sont affichés
299: */
300: public int debugAffichageCommentaires = 1;
301:
302: /** Pour debug uniquement. Sur quels objets fait-on le bilan?
303: * Si true (normal) : On fait le bilan au niveau des objets géographiques initiaux,
304: * et on exporte des liens de la classe appariement.Lien entre objets géographiques initiaux;
305: * Si false (pour étude/débug): On fait le bilan au niveau des arcs des cartes topo ayant servi au calcul
306: * et on exporte des liens de la classe appariementReseaux.LienReseaux entre objets des cartes topo.
307: */
308: public boolean debugBilanSurObjetsGeo = true;
309:
310: /** Pour la représentation graphique des liens d'appariement entre cartes topos.
311: * Si true : On représente les liens entre arcs par des tirets réguliers,
312: * Si false : On représente les liens entre arcs par un trait reliant les milieux.
313: */
314: public boolean debugTirets = true;
315:
316: /** Pour la représentation graphique des liens d'appariement entre cartes topos.
317: * Si on représente les liens entre arcs par des tirets réguliers, pas entre les tirets.
318: */
319: public double debugPasTirets = 50;
320:
321: /** Pour la représentation graphique des liens d'appariement entre cartes topos.
322: * Si true : On représente les liens entre des objets et un noeud, avec un buffer autour de ces objets
323: * Si false : On représente les liens entre objets 2 à 2 par des trait reliant les milieux.
324: */
325: public boolean debugBuffer = false;
326:
327: /** Pour la représentation graphique des liens d'appariement entre cartes topos.
328: * pour la représetnation des liens d'appariement, taille du buffer autour des objets appariés à un noeud.
329: */
330: public double debugTailleBuffer = 10;
331:
332: }
|