4 votos

Mover una capa de grupo de servicios de mapas fuera de una capa de grupo con ArcPy

Estoy luchando para mover los servicios web (en mosaico mapas base) de las capas de grupo en el marco de datos. He usado arcpy.la cartografía.ListLayers a redactar una lista de capas, luego he averiguado lo que es una capa de grupo con .isGroupLayer y he probado el grupo de capas de nombre y, a continuación, lo que se "apoya". Sin embargo he fracasado miserablemente a recoger raro servicio web capa de grupo y de moverse. He probado de arcpy.la cartografía.AddLayer entre un puñado de cosas.

Todas las ideas son bienvenidas. Mi resultado deseado es no tener servicios web en el grupo de capas.

enter image description here

import arcpy
mxd ="C:\\Data\\native.mxd"
OriginMxd = arcpy.mapping.MapDocument (mxd)
df = arcpy.mapping.ListDataFrames(OriginMxd)[0]

for OPFSLyr in arcpy.mapping.ListLayers(OriginMxd, "", df):
    if str(OPFSLyr) == "Basemap": # if  it's named basemap
        if OPFSLyr.isGroupLayer:
            for subLayer in OPFSLyr:
                print subLayer
                arcpy.mapping.AddLayer(df, subLayer, "BOTTOM")
                OriginMxd.save()

4voto

tobefound Puntos 163

Usted está cerca. En lugar de AddLayer, puede utilizar MoveLayer. El ESRI código de ejemplo, junto con algunos ajustes a sus propias estructuras de datos pueden ser ajustados para mover las capas que desee hasta la raíz de la trama de datos. Ver código:

mxd = arcpy.mapping.MapDocument(r"C:\peendata\MoveLayers.mxd")
df = arcpy.mapping.ListDataFrames(mxd)[0]
moveThese = []

for layer in arcpy.mapping.ListLayers(mxd, "", df):
    print str(layer.name) + ">>>"
    if layer.isServiceLayer:
        print str(layer) + " is a service layer"
    if layer.isFeatureLayer:
        print str(layer) + " is a feature layer"
    if layer.isRasterLayer:
        print str(layer) + " is a raster layer"
    if layer.isGroupLayer:
        print str(layer) + " is a group layer"
    if str(layer) == "Group Layer 1":
        refLayer = layer

    if(layer.isServiceLayer and not layer.isGroupLayer):
        print "qualifies for movement"
        moveThese.append(layer)

for layer in moveThese:
    print "moving " + str(layer) 
    arcpy.mapping.MoveLayer(df, refLayer, layer, "BEFORE")

mxd.saveACopy(r"C:\peendata\MoveLayersDone.mxd")
del mxd

Algunas advertencias: no todos los servicios web son definidos como servicios web. Por ejemplo, OpenStreetMap, que también se añade como un enlace externo, es una capa de paquete, por lo que el código anterior no se mueva. Yo no pude encontrar una manera de detectar si es una capa de paquete desde la web, así que asegúrese de que las capas que desea mover son lo que usted espera de código sabio.

En lo que respecta a su particular estructura de capas, se recomienda que la Global_Imagery es una capa bloqueada conjunto, por lo que no puede su subcapas incluso en ArcMap con la mano. De hecho, el código todavía qué (tipo de), pero la movida capas están rotos, y los originales están todavía en su lugar. Asegúrese de que las capas que están tratando de mover son realmente los móviles a mano.

Finalmente, el código, obviamente, deben ser ajustados a qué es exactamente lo que está buscando: usted no quiere que ellos en el nivel de raíz, de su grupo superior de la capa puede ser llamado de otra manera, etc. Incluido son algunas de las funciones que puede utilizar para probar las propiedades de la capa.

Ah, y sí. A veces las capas de servicio son también el grupo de capas - modo de prueba cuidadosamente.

Para referencia, mi capa de la estructura de pre y post: TOC pre and post-move

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X