Réponses:
Je dirais oui. La classe de couches a une méthode getSelectedExtent et le Dataframe a une propriété d'extension. Je n'ai pas encore essayé.
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()
df.zoomToSelectedFeatures()
C'est comme ça que je le fais. Vous pouvez également définir l'échelle avec df.scale = yourscalehere
.
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()
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