IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SIG : Système d'information Géographique Discussion :

[GeoTools] "Découpage" de polygon


Sujet :

SIG : Système d'information Géographique

  1. #1
    Membre éclairé
    Ingénieur de recherche
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur de recherche

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 825
    Points
    825
    Par défaut [GeoTools] "Découpage" de polygon
    Que je m'explique clairement d'abord ^^

    En fait je travaille sur des données réelles réparties en plusieurs shapefiles
    - régions habitées
    - rivières
    - routes
    - altitude
    - ...

    Et mon travail consiste à "remplir" les régions habitées. Pour faire ça j'aurai besoin de "couper" mes données pour me concentrer sur un seul village. Pas de problème pour isoler un village avec son identifiant, mais je dois "couper" les rivières et routes situées dans la même zone pour travailler tranquillement.

    J'ai essayé de "filtrer" à la main avec un itérateur et aussi en utilisant les Filter de GeoTools, je cherche simplement à garder les géométries qui se trouvent dans la BoudingBox de mon village. Seulement GeoTools me renvoit systématiquement une zone qui fait environ 100 fois la taille de mon village en hauteur et largeur, et ce même si je lui donne les X,Y manuellement, ce qui fait que je récupérer plusieurs dizaines de rivières au lieu d'avoir juste celle qui traverse mon village...

    Quelqu'un aurait une idée sur ce qui ne va pas?

    Aussi, est-ce qu'il y a un moyen de "couper" les géométries par la suite?

    Et, tant que j'y suis, comment peut-on retrouver les distances réelles si on a pas de fichier de projection associé à nos données?

    Merci ^^

  2. #2
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    Citation Envoyé par Haseo86 Voir le message
    J'ai essayé de "filtrer" à la main avec un itérateur et aussi en utilisant les Filter de GeoTools, je cherche simplement à garder les géométries qui se trouvent dans la BoudingBox de mon village. Seulement GeoTools me renvoit systématiquement une zone qui fait environ 100 fois la taille de mon village en hauteur et largeur, et ce même si je lui donne les X,Y manuellement, ce qui fait que je récupérer plusieurs dizaines de rivières au lieu d'avoir juste celle qui traverse mon village...

    Quelqu'un aurait une idée sur ce qui ne va pas?
    Plutot bizarre, je vois deux possibilitées :
    - La BBox que tu créé n'est pas dans la meme projection que tes données, ce qui expliquerait que l'emprise ne correspond pas.
    - Tes données sont des multilignes ..etc.. de grande tailles ce qui expliquerait qu'elles sortent largement de la BBox, ce qui est normal vu que tu ne les coupent pas.

    Citation Envoyé par Haseo86 Voir le message
    Aussi, est-ce qu'il y a un moyen de "couper" les géométries par la suite?
    Oui, quand tu parcours tes données, tu dois avoir des objects de type Feature. Dans chaque Feature tu as une geometrie.
    Une fois que tu as cette object geometrique (qui va etre une sous classe de com.vividsolutions.jts.geom.Geometry) tu trouveras dessus toutes les methodes dont tu as besoin, intersect, within ...etc...
    Il ne reste qu'a faire une boucle sur les données.

    Citation Envoyé par Haseo86 Voir le message
    Et, tant que j'y suis, comment peut-on retrouver les distances réelles si on a pas de fichier de projection associé à nos données?
    Non, il te faut le fichier de projection. Sans ca tu ne peux pas savoir en quelles unités sont tes données, ni les transformations mathematique qui y sont appliqués. Donc pas de mesures correctes possibles.


    Pour ton autre question :
    Savez-vous comment calculer la distance réelle entre deux points ou deux géométries avec GeoTools?
    Oui je sais comment faire.
    Le plus simple est d'obtenir les deux geometries en question (dans la meme projection) et d'utiliser la methode distance (que tu trouvera sur les deux geometries) en passant l'autre geometrie en parametre.
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

  3. #3
    Membre éclairé
    Ingénieur de recherche
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur de recherche

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 825
    Points
    825
    Par défaut
    J'aurai une question à propos des projections ^^

    J'ai donc plein de shapefiles avec des données différentes, mais seulement quelques uns avec un fichier de projection. Cependant, quand j'ouvre mes shapefiles sous OpenJump, tout se place correctement les uns sur les autres, même ceux qui n'ont pas de shapefile. C'est possible d'utiliser le fichier de projection d'un fichier pour mesurer sur un autre?

    En fait il y a quoi dans un fichier de projection? Ca se présente comment?

  4. #4
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    tu peux utiliser le fichier de projection pour tes autres fichiers sans problèmes.
    Il suffit de renommer le fichier pour qu'il est le meme nom que le shapefile.

    ville.shp
    ville.prj

    c'est pas plus compliqué

    tu peux essayer d'en ouvrir un pour voir le contenu, c'est en gros une définition de la projection et de ses paramètres.

    exemple de prj :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    PROJCS["NTF_Lambert_II_étendu",     
    GEOGCS["GCS_NTF",DATUM["D_NTF",SPHEROID["Clarke_1880_IGN",6378249.2,293.46602]],
        PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]
    ],
    PROJECTION["Lambert_Conformal_Conic"],
    PARAMETER["False_Easting",600000.0],
    PARAMETER["False_Northing",2200000.0],
    PARAMETER["Central_Meridian",2.3372291667],
    PARAMETER["Standard_Parallel_1",45.8989188889],
    PARAMETER["Standard_Parallel_2",47.6960144444],
    PARAMETER["Scale_Factor",1.0],
    PARAMETER["Latitude_Of_Origin",46.8],
    UNIT["Meter",1.0]
    ]
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

  5. #5
    Membre éclairé
    Ingénieur de recherche
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur de recherche

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 825
    Points
    825
    Par défaut Précisions
    Donc, maintenant j'ai mes données de villages et de rivières qui ont la même projection, et les cartes sont bien "alignées" quand je les ouvre avec OpenJump par exemple. Mais sous GeoTools la sélection automatique avec BoundingBox me retourne une zone beaucoup trop large.

    Voilà ce que je devrais avoir (je sélectionne à la main avec le FID, le village est entouré en rouge):


    Et voilà ce que j'obtiens avec le filtre BoudingBox de GeoTools (j'ai entouré un vert la zone que je devrais avoir):



    J'ai également essayé en donnant au filtre une Box construite avec les (x,y) Max et Min du village, c'est pareil. Mes données sont toutes des polygon à première vue.

    Je joins le code de la classe qui fait le découpage si jamais ça inspire quelqu'un.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    public static MapContext cutAllAroundGivenVillage(int idVillage,
    			String filename) throws CQLException {
    		Filter filter = CQL.toFilter("ID == " + idVillage);
    
    		FeatureCollection<SimpleFeatureType, SimpleFeature> isolatedVillage = Ressources.populationRegion
    				.subCollection(filter);
    
    		FeatureIterator<SimpleFeature> iterator = isolatedVillage.features();
    		SimpleFeature village = null;
    		try {
    			while (iterator.hasNext()) {
    				SimpleFeature feature = iterator.next();
    				village = feature;
    			}
    		} finally {
    			iterator.close();
    		}
    		if (village != null) {
    			MapContext mapcontext = new DefaultMapContext();
    			mapcontext.setTitle("Projet");
    
    			StyleBuilder sb = new StyleBuilder();
    
    			MapLayer maplayer = new DefaultMapLayer(isolatedVillage, sb
    					.createStyle(sb.createPolygonSymbolizer()));
    			maplayer.setTitle("Village");
    			maplayer.setVisible(true);
    			maplayer.setQuery(Query.ALL);
    			mapcontext.addLayer(maplayer);
    
    			URL shapeURL = RessourcesLoader.class.getResource("ShapeFile2008/"
    					+ Ressources.riverRegionFile);
    			FeatureSource<SimpleFeatureType, SimpleFeature> featureSource;
    			try {
    				featureSource = Shapereader
    						.featureSourceFromShapeFile(shapeURL);
    				FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null);
    				FeatureType schema = featureSource.getSchema();
    
    				String geometryPropertyName = schema.getGeometryDescriptor()
    						.getLocalName();
    				CoordinateReferenceSystem crs = schema.getGeometryDescriptor()
    						.getCoordinateReferenceSystem();
    
    				ReferencedEnvelope bbox = new ReferencedEnvelope(106.048, 20.862, 106.034, 20.858,crs);
    				filter = ff.bbox(ff.property(geometryPropertyName), bbox);
    				Set<FeatureId> fids = new HashSet<FeatureId>();
    				FeatureId fid = ff.featureId("VnRiver2_region.464");
    				fids.add(fid);
    
    				//filter = ff.id( fids );
    
    				FeatureCollection<SimpleFeatureType, SimpleFeature> selectedRivers = featureSource.getFeatures(filter);
    
    				iterator = selectedRivers.features();
    				try {
    					while (iterator.hasNext()) {
    						SimpleFeature feature = iterator.next();
    						System.out.println(feature.getAttribute("ENG")
    								+ feature.getIdentifier().getID());
    
    					}
    				} finally {
    					iterator.close();
    				}
    
    				maplayer = new DefaultMapLayer(selectedRivers, sb
    						.createStyle(sb.createPolygonSymbolizer()));
    				maplayer.setTitle("Rivers");
    				maplayer.setVisible(true);
    				maplayer.setQuery(Query.ALL);
    				mapcontext.addLayer(maplayer);
    
    				return mapcontext;
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		return null;
    	}
    Désolé pour le dérangement ^^

    Fab'

  6. #6
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    Quelques solutions :

    1-------------------------------------------

    essai avec intersect plutot que bbox pour le filtre a tout hasard.

    2----------------------------------------------

    Plutot que de créé un featureCollection a chaque fois, utilise directement le filtre fourni avec l'objet Query.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    maplayer = new DefaultMapLayer(selectedRivers, sb
    						.createStyle(sb.createPolygonSymbolizer()));
    				maplayer.setTitle("Rivers");
    				maplayer.setVisible(true);
    				maplayer.setQuery(Query.ALL);
    				mapcontext.addLayer(maplayer);
    il faut que tu créé une DefaultQuery , que tu configure le filtre de cette query et que tu donnes cette query au maplayer.

    3 -------------------------------------------------------

    Combien de polygone de rivières as tu vraiment dans ta couche ?
    Avec les images que tu me montre j'ai l'impression qu'il y a un seul gros polygon representant la surface hydro et non des troncons de rivieres.

    4 ------------------------------------------------------

    Si rien de ci dessus marche, fait un system out de ton filtre pour vérifier et au pire tu le collera ici.
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

  7. #7
    Membre éclairé
    Ingénieur de recherche
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur de recherche

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 825
    Points
    825
    Par défaut
    Ok je vais essayer de voir tout ça, merci ^^

    Citation Envoyé par eclesia Voir le message
    Quelques solutions :

    Avec les images que tu me montre j'ai l'impression qu'il y a un seul gros polygon representant la surface hydro et non des troncons de rivieres.
    Non non, j'ai bien un polygone pour chaque rivière (1782 polygones en tout dans le shapefile), et justement dans l'image de "ce que je devrais avoir", il y a juste un polygon de rivière qui est selectionné.

    [EDIT] : Juste pour vérifier, j'ai essayé d'appliquer le filtre bbox sur le fichier contenant mon village directement, mais là aussi ça me renvoie une zone 10 fois trop grande...

    [EDIT2] : J'ai au final laissé tomber tous les filtres GeoTools et utilisé directement les méthodes de JTS, et ça marche impeccable ^^

    Par contre j'ai un autre problème ^^ : http://www.developpez.net/forums/d73...e/#post4252345

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo