Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

Jeirhome
Membre
Lieu: Liverion
Date d'inscription: 22 Aug 2006
Messages: 4298
Site web

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 smile


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

Jeirhome
Membre
Lieu: Liverion
Date d'inscription: 22 Aug 2006
Messages: 4298
Site web

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

Jeirhome
Membre
Lieu: Liverion
Date d'inscription: 22 Aug 2006
Messages: 4298
Site web

Re: Requete spatiale

J'avais bien raison de douter big_smile (ce n'est pas marrant, le problème est toujours là sad)

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 tongue


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

 

Pied de page des forums

Powered by FluxBB