Utiliser ArcPy pour zoomer sur l'entité sélectionnée?

19

Existe-t-il un moyen de zoomer sur l'étendue d'une entité sélectionnée à l'aide du module ArcPy dans ArcGIS Desktop 10.

Zachary
la source

Réponses:

16

J'ai un morceau de code qui fonctionne. Je l'ai trouvé ici sur le site Web de l'ESRI. Ajoutez-le en tant que script à un modèle, puis connectez-y la sortie d'un outil de sélection par attribut. Il fait exactement ce que je veux.

import arcpy
mxd = arcpy.mapping.MapDocument('CURRENT')
df = arcpy.mapping.ListDataFrames(mxd, "Layers") [0]
df.zoomToSelectedFeatures()
arcpy.RefreshActiveView()
Zachary
la source
La plupart des fonctionnalités de script qui gèrent la gestion, l'affichage ou la sortie des documents (mxd) utiliseront le module de cartographie ArcPy. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/…
mindless.panda
3
+1 df.zoomToSelectedFeatures()C'est comme ça que je le fais. Vous pouvez également définir l'échelle avec df.scale = yourscalehere.
Nathanus
10

Comme vous l'avez déjà supposé,

df.zoomToSelectedFeatures()

changera l'étendue du bloc de données à toutes les entités sélectionnées dans le bloc de carte. Si vous souhaitez simplement zoomer sur un jeu de sélection pour un calque spécifique, utilisez lyr.getSelectedExtent(). J'ajuste également le facteur d'échelle de la carte pour que mon code ressemble à ceci:

df.extent = lyr.getSelectedExtent()
df.scale *= 1.5
arcpy.RefreshActiveView()

ou ca:

df.extent = lyr.getSelectedExtent()
df.scale = 12000 # 1:1,000
arcpy.RefreshActiveView()
Erik Anderson
la source
1

Donc, pour ajouter à cela, j'ai eu besoin de garder une trace de l'étendue la plus large sur plusieurs couches sans aucune fonctionnalité sélectionnée. Le code suivant suivra l'étendue la plus éloignée dans chaque direction. extend_object reste constant dans tous les appels à la fonction et doit être initialisé à l'une des couches que vous incluez. L'argument "couche" à track_extent est un objet arcpy.Mapping.Layer. Lorsque vous êtes prêt à enregistrer votre carte, définissez simplement l'étendue de votre dataframe via quelque chose comme data_frame.extent = extend_object

extent_object = initial_layer.getExtent()

def track_extent(extent_object,layer):

    l_properties = layer.getExtent()

    # each of these essentially says that if this layer is further out to one direction than the current setting, change the setting
    if l_properties.XMin < extent_object.XMin:
        extent_object.XMin = l_properties.XMin
    if l_properties.YMin < extent_object.YMin:
        extent_object.YMin = l_properties.YMin
    if l_properties.XMax > extent_object.XMax:
        extent_object.XMax = l_properties.XMax
    if l_properties.YMax > extent_object.YMax:
        extent_object.YMax = l_properties.YMax
nicksan
la source