#1 Mon 18 August 2008 12:02
- calito
- Participant actif
- Date d'inscription: 2 Jun 2008
- Messages: 112
Requete spatiale
Bonjour,
Je veux selectionner les entités d'une couche qui intersectent une cellule selectionnée de ma grille. J' ai commencé, mais le probleme c que je n'arrive pas à preciser que c'est à partir de la cellule selectionnées". lorsque je lance mon application, il selectionne toute les entités de la couche.
voici le code:
Code:
Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pComp As IFeatureLayer Set pComp = pMxDoc.FocusMap.Layer(1) Dim pFeatureSelection As IFeatureSelection Set pFeatureSelection = pComp Dim Grille As IFeatureLayer Set Grille = pMxDoc.FocusMap.Layer(2) Dim pEnumGeom As IEnumGeometry Set pEnumGeom = New EnumFeatureGeometry Dim pEnumGeometryBind As IEnumGeometryBind 'QI entre IEnumGeometryBind et IEnumGeometry Set pEnumGeometryBind = pEnumGeom pEnumGeometryBind.BindGeometrySource Nothing, _ Grille.FeatureClass Dim pGeomFactory As IGeometryFactory Set pGeomFactory = New GeometryEnvironment Dim pGeom As IGeometry Set pGeom = _ pGeomFactory.CreateGeometryFromEnumerator(pEnumGeom) 'Création du filtre spatial Dim pSpatialFilter As ISpatialFilter Set pSpatialFilter = New SpatialFilter '.. sur la géométrie pGeom ... Set pSpatialFilter.Geometry = pGeom ' ..avec la relation "intersectent" pSpatialFilter.SpatialRel = esriSpatialRelIntersects ' On sélectionne les entités "troncons" pFeatureSelection.SelectFeatures pSpatialFilter, _ esriSelectionResultNew, False pMxDoc.ActiveView.Refresh End Sub
Merci deja pour votre aide.
Hors ligne
#2 Tue 19 August 2008 09:54
Re: Requete spatiale
Dans les ArcObjects, tu as des IFeatureLayer, mais aussi des interfaces liées aux sélections (un peu plus haut dans le diagramme Carto), il suffit donc de récupérer ce IFeatureSelection (ou autre appellation je fais de tête) pour déclarer qu'on veut faire nos actions à partir des éléments sélectionnés.
Si tu ne trouves pas cette interface, dis-le, je chercherai, je sais où trouver.
Jérôme Cuinet
L'avantage de la Chine, c'est que le soleil se couche plus tard !
Hors ligne
#3 Tue 19 August 2008 11:31
- Fabien.Krzewinski
- Participant occasionnel
- Date d'inscription: 19 Aug 2008
- Messages: 18
Re: Requete spatiale
Bonjour,
J'ai exactement le même problème. Je n'arrive pas à "convertir" les données de la requête en FeatureLayer.
Si quelqu'un avait la gentillesse de poster une portion de code ou les différents "cast" à effectuer, cela pourraient m'éclairer et je lui en serais très reconnaissant
Fabien
Hors ligne
#4 Tue 19 August 2008 11:47
- calito
- Participant actif
- Date d'inscription: 2 Jun 2008
- Messages: 112
Re: Requete spatiale
wow, ca'm parrait difficile.
J'ai visualiser le diagramme carto, les co-class que j'ai vu, j'ai l'impression qu'il n'ont aucun rapport à ce que je veux faire.
Aidez-moi.
Merci encore.
Hors ligne
#5 Tue 19 August 2008 15:11
Re: Requete spatiale
Ces diagrammes ne sont pas évident à manipuler quand on les découvre.
Pour le diagramme Carto de la 9.2, 3° page, classe abstraite parente de la classe FeatureLayer nommée FeatureBaseLayer, tu as une interface IFeatureSelection (ma mémoire était bonne).
Tu remplace donc ta ligne
Code:
Dim Grille As IFeatureLayer
par
Code:
Dim Grille As IFeatureSelection
(comme pour pFeatureSelection finalement).
p.s : Tout à coup j'ai un petit doute, tu me dis si ça fonctionne ?
Jérôme Cuinet
L'avantage de la Chine, c'est que le soleil se couche plus tard !
Hors ligne
#6 Tue 19 August 2008 15:29
- calito
- Participant actif
- Date d'inscription: 2 Jun 2008
- Messages: 112
Re: Requete spatiale
Non, ca'n marche pas lorsque je declare Grille de type IFeatureSelection
Parce que dans la troisieme ligne dans le bout de code plus bas, en gras, grille attend la propriete featureclass. Donc si Grille est de type IFeatureSelection, ce sera impossible, parce que cet interface n'implemente pas featureclass
Code:
Set pEnumGeometryBind = pEnumGeom pEnumGeometryBind.BindGeometrySource Nothing, _ [b]Grille.FeatureClass[/b]
Hors ligne
#7 Tue 19 August 2008 16:23
Re: Requete spatiale
J'avais bien raison de douter (ce n'est pas marrant, le problème est toujours là )
Je vois exactement pourquoi cela ne fonctionne pas et je me rappelle d'avoir eu ce genre de problème. La sélection à partir de l'interface IFeatureSelection est un joli raccourci très sympa qui permet pour les cas simple de ne pas utiliser la partie GeoDatabase. Or la sélection est à la base une fonction de GeoDatabase, et pour les cas compliqués, on est obligé de faire avec.
Il n'y a pas d'interface magique, tu es obligé de construire ton filtre géométrique. La page How to execute spatial queries résume les façons de faire.
Si tu veux forcément utiliser la sélection en cours, tu peux récupérer un ICursor en faisant un ISelectionSet.Search(), le ISelectionSet pouvant être récupéré depuis le (fameux désormais) IFeatureSelection. Avec ce ICursor et une petite boucle tu pourra constituer ta géométrie de filtre spatial.
Un peu plus compliqué que ce que je croyais, mais je rouille un peu. Merci de me dérouiller
Jérôme Cuinet
L'avantage de la Chine, c'est que le soleil se couche plus tard !
Hors ligne
#8 Tue 19 August 2008 17:21
- calito
- Participant actif
- Date d'inscription: 2 Jun 2008
- Messages: 112
Re: Requete spatiale
voici comment j'ai fait, malgré tout, ca'n marche pas.
Code:
Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pFRouteLayer As IFeatureLayer Set pFRouteLayer = pMxDoc.FocusMap.Layer(5) Dim pFeatureSelection As IFeatureSelection Set pFeatureSelection = pFRouteLayer Dim Grille As IFeatureLayer Set Grille = pMxDoc.FocusMap.Layer(0) Dim pEnumGeom As IEnumGeometry Set pEnumGeom = New EnumFeatureGeometry Dim pEnumGeometryBind As IEnumGeometryBind [b]'Ce que je viens d'ajouter[/b] Dim GTable As ITable Dim GCursseur As ICursor Set GTable = pMxDoc.FocusMap.Layer(0) 'QI entre IEnumGeometryBind et IEnumGeometry Set pEnumGeometryBind = pEnumGeom pEnumGeometryBind.BindGeometrySource Nothing, _ Grille.FeatureClass Dim pGeomFactory As IGeometryFactory Set pGeomFactory = New GeometryEnvironment Dim pGeom As IGeometry 'Création d'une seule géométrie à partir de l'ensemble des entités couche(0) Set pGeom = _ pGeomFactory.CreateGeometryFromEnumerator(pEnumGeom) 'Création du filtre spatial Dim pSpatialFilter As ISpatialFilter Set pSpatialFilter = New SpatialFilter '.. sur la géométrie pGeom ... Set pSpatialFilter.Geometry = pGeom ' ..avec la relation "intersectent" pSpatialFilter.SpatialRel = esriSpatialRelIntersects Set GCursseur = GTable.Search(pSpatialFilter, False) 'requete.Search(filtre, False) ' On sélectionne les entités de la couche(5) pFeatureSelection.SelectFeatures pSpatialFilter, _ esriSelectionResultNew, False pMxDoc.ActiveView.Refresh End Sub
Hors ligne
#9 Thu 21 August 2008 11:25
- Fabien.Krzewinski
- Participant occasionnel
- Date d'inscription: 19 Aug 2008
- Messages: 18
Re: Requete spatiale
Bon, voilà ce que j'ai réussi à faire.
Code:
Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pMap As IMap Set pMap = pMxDoc.FocusMap Dim pFMaillage As IFeatureLayer Set pFMaillage = pMap.Layer(0) Dim pFBrunet As IFeatureLayer Set pFBrunet = pMap.Layer(1) Dim pFSelBrunet As IFeatureSelection Set pFSelBrunet = pFBrunet Dim pClassMaillage As IFeatureClass Set pClassMaillage = pFMaillage.FeatureClass Dim pMaille As IFeature 'il faudrait boucler sur le GetFeature (1) avec un compteur Set pMaille = pClassMaillage.GetFeature(1) Dim pGeom As IGeometry Set pGeom = pMaille.Shape Dim pSpatialFilter As ISpatialFilter Set pSpatialFilter = New SpatialFilter Set pSpatialFilter.Geometry = pGeom pSpatialFilter.SpatialRel = esriSpatialRelIntersects pFSelBrunet.SelectFeatures pSpatialFilter, esriSelectionResultNew, False pMxDoc.ActiveView.Refresh
En espérant que ça puisse t'aider...
Fabien
Hors ligne