Suite

Exclure des couches de l'accrochage à l'aide d'IPointSnapper


Je travaille avec ArcObjects en C# et j'essaie d'exclure toutes les couches de carte sauf une (la seule sur laquelle je veux accrocher) de l'environnement de capture. J'utilise les interfaces ISnappingEnvironment et IPointSnapper. J'ai mis le code suivant dans la méthode OnClick de l'outil que j'utilise :

m_Snapper = m_SnappingEnvironment.PointSnapper; ISet anExclLyrSet = new SetClass(); m_Snapper.ExcludedLayers(ref anExclLyrSet); //… boucle sur toutes les couches de la carte, en ajoutant toutes sauf celle d'intérêt à anExclLyrSet m_Snapper.ClearCache();

Fondamentalement, j'obtiens des performances de capture médiocres en raison de la présence d'une couche de fond de carte qui contient plusieurs couches d'entités. Si je désactive ce calque (rendre invisible), les performances sont bonnes.

J'ai confirmé que toutes les couches (pour les couches de type composite, j'ajoute également chaque sous-couche à l'exclusion) sont ajoutées à l'ensemble d'exclusion, mais je n'arrive pas à améliorer les performances sans la désactiver couche de fond de carte. Je ne sais pas ce que je fais mal - le cache doit-il être effacé après l'exclusion de chaque couche individuelle ? J'apprécierais les idées que n'importe qui pourrait avoir à ce sujet. Merci!

Marc C.


Voici la solution que nous avons choisie pour ce problème. Il est appelé lors de la configuration de l'environnement de capture.

///  /// Construit (ajoute des couches) au jeu d'exclusion pour IPointSnapper. Configurez pour exclure toutes les /// couches à l'exception de celle portant le nom fourni. ///  ///  Référence à la carte.  ///  Référence à l'exclusion de couche définie pour IPointSnapper.  ///  Nom de la couche à NE PAS exclure.  ///  Référence au PointSnapper.  public static void BuildSnappingExclusionSet(IMap aMap, ref ISet anExclLyrSet, string aStr, IPointSnapper pSnapper) { ILayer aLyr = null; ICompositeLayer aCompLyr = null; IBasemapLayer aBmapLyr = null; IBasemapSubLayer aBmapSubLyr = null; for (int i = 0; i < aMap.LayerCount; i++) { aLyr = aMap.get_Layer(i); try // Fonctionne s'il s'agit d'un type de couche composite { aCompLyr = (ICompositeLayer)aLyr; aBmapLyr = (IBasemapLayer)aLyr; if (aBmapLyr != null) // couche de fond de carte - doit être traitée différemment { for (int j = 0; j < aCompLyr.Count; j++) { aBmapSubLyr = (IBasemapSubLayer)aCompLyr.get_Layer(j); aLyr = aBmapSubLyr.Layer; if (aLyr.Name != aStr) anExclLyrSet.Add(aBmapSubLyr.Layer); } } else // sinon, traiter comme une couche composite ordinaire { for (int j = 0; j < aCompLyr.Count; j++) { aLyr = aCompLyr.get_Layer(j); if (aLyr.Name != aStr) anExclLyrSet.Add(aLyr); } } } catch // N'implique pas une couche composite - ajoutez simplement à l'exclusion { if (aLyr.Name != aStr) anExclLyrSet.Add(aLyr); } pSnapper.ClearCache(); } }


Voir la vidéo: QGIS calage couche polygone polyline zone tompon intersection (Octobre 2021).