#1 Wed 19 June 2002 13:06
- Maud Bauduret
- Invité
[ArcObjects] Filtre spatial dans VB ArcMap
Bonjour,
Je voudrais utiliser l'objet ISpatialFilter dans un script VB pour ArcMap, mais j'ai un peu de mal a parametrer le filtre et le curseur.
Quelqu'un l'a-t'il deja utilise et/ou sais comment l'utiliser.
Merci pour votre aide,
Maud
#2 Wed 19 June 2002 05:54
- Olivier De LA POMMERAYE
- Invité
Re: [ArcObjects] Filtre spatial dans VB ArcMap
Bonjour,
Voici une fonction qui permet de faire une requete spatial sur une ILayer et de recuperer un IFeatureCursor vous permettant ensuite de boucler sur les objets graphiques (IFeature) pour faire tout type de manipulation (calcul sur les formes, intersection, buffer etc ...)
Code:
Public Function SpatialQuery(TheIntersectILayer As ILayer, TheOverlayILayer As ILayer, TheQueryShape As IGeometry, TheesriSpatialRelEnum As esriSpatialRelEnum, Optional TheSpatialRelDescription As String) As IFeatureCursor Dim pGeom As IGeometry Dim TheIntersectFeatureLayer As IFeatureLayer Set TheIntersectFeatureLayer = TheIntersectILayer Dim TheOverlayFeatureLayer As IFeatureLayer Set TheOverlayFeatureLayer = TheOverlayILayer Dim TheIntersectFeatureClass As IFeatureClass Set TheIntersectFeatureClass = TheIntersectFeatureLayer.FeatureClass Dim TheOverlayFeatureClass As IFeatureClass Set TheOverlayFeatureClass = TheOverlayFeatureLayer.FeatureClass Dim TheIDField As IField Dim pFilter As ISpatialFilter Set pFilter = New SpatialFilter pFilter.SpatialRelDescription = TheSpatialRelDescription 'Inverse la selection de tous les polygones qui ont en communs l'exterieur du QueryPolygone et 'les Limites des polygones de Union_Result ' Query Geometry Requested Geometry '1 interior interior '2 interior Boundary '3 interior exterior '4 Boundary interior '5 Boundary Boundary '6 Boundary exterior '7 exterior interior '8 exterior Boundary '9 exterior exterior 'Note that any two shapes' exteriors always intersect Set pFilter.Geometry = TheQueryShape pFilter.GeometryField = TheIntersectFeatureClass.ShapeFieldName pFilter.SpatialRel = TheesriSpatialRelEnum Dim pOverlayFeatureCursor As IFeatureCursor Set pOverlayFeatureCursor = TheOverlayFeatureClass.Search(pFilter, False) Set SpatialQuery = pOverlayFeatureCursor End Function
Vous pouvez ensuite appelez cette fonction par des synthaxes du type:
Set TheGlobalIFeatureCursor = SpatialQuery(TheILayer, TheILayerToQuery, TheQueryPolygon, esriSpatialRelIntersects)
OU
Set TheGlobalIFeatureCursor = SpatialQuery(TheILayer, TheILayerToQuery, TheQueryPolygon, esriSpatialRelRelation)
L'utilisation de la methode esriSpatialRelRelation est franchement hasardeuse (domage parceque c'est vraiment puissant)
ArcObject se melange un peu les pedales entre les Bondary/Interior/Exterior, par exemple.
L'Interieur du polygone de requete n'intersecte pas l'Interieur des polygones de la couche
--> donc on doit avoir tous les polygones a l'EXTERIEUR du polygone de requete OR cela ne donne pas le meme resultat que soit l'Exterieur du polygone de requete intersecte l'Interieur des polygones de la couche
--> donc on devrait avoir tous les polygones a l'EXTERIEUR du polygone de requete et bien cela depend des Polygones en cause, parfois les deux marches, parfois aucun marche !
Pour ma part, j'ai du faire un buffer -1 de mon polygone de Requete pour que cela fonctionne dans tous les cas.
L'Objet TheGlobalIFeatureCursor est du type IFeatureCursor
Votre question etait un peu vague j'espere que cela pourra quand meme vous etre utile.
Cordialement
Olivier de LA POMMERAYE
Ingenieur SIG et Teledetection
Service des Methodes Administratives et de l'Informatique (SMAI)
Nouvelle-Caledonie