4 votos

En ArcObjects, ¿cómo puedo cambiar la referencia espacial de un Mapa (Marco de Datos) existentes en un MXD?

Necesito cambiar la referencia espacial de un MXD mediante programación. En ArcMap interfaz de usuario, me gustaría tomar los siguientes pasos: 1) Abrir las propiedades del marco de datos e ir a la pestaña Sistema de Coordenadas; 2) haga clic en el pequeño botón de globo (Agregar Sistema de Coordenadas) y elija Nuevo Sistema de Coordenadas Proyectadas; 3) elegir Mercator; 4) introducir nombre personalizado para el sistema de coordenadas; 5) cambiar el Standard_Parallel_1 parámetro en el valor adecuado; y 6) Guardar y pulse aceptar. En última instancia, la necesidad de automatizar este proceso a lo largo de cientos de MXDs.

Realmente estoy muy confundido acerca de dónde comenzar. Mi investigación se ha convertido en un montón de referencias a IProjectedCoordinateSystemEdit y sus clases e interfaces para la lectura/escritura de parámetros para matrices con IParamter y relacionados, pero me estoy encontrando una gran cantidad de información confusa. Es así, que las Interfaces y Clases debo comenzar con, y cuál es la manera más concisa de lograr la automatización del proceso que describo arriba?

Mi código en la actualidad se abre el MXD para ser procesados en un IMapDocument y los cambios de un conjunto de PageLayout y los ajustes del Mapa. Lo que queda es el cambio de la referencia espacial. Gracias por la orientación que usted puede ofrecer.

ACTUALIZACIÓN (@Hornbydd) Aquí es el de Python cuerpo principal del código. (Por CIERTO, cuando se accede a ArcObjects de Python, una cosa que Python no se puede hacer es implementar interfaces, de modo de responder a los eventos y a la ampliación de ArcGIS no es posible. Todavía tengo que encontrar los objetos com que no puede acceder, sin embargo.)

f = open(chartprops, 'r')

i = 0
for chrt in f:
    if i == 0:  #skip the header
        i = i + 1
        continue
    props = chrt.split(',')
    chartnm = props[0]
    scale = float(props[1])
    latorig = props[2]
    pixwidth = float(props[3])
    pixheight = float(props[4])
    if len(props) > 5:
        pprwidth = float(props[5])
        pprheight = float(props[6])
        pprorienttxt = props[7]
    else:
        pprwidth = pixwidth / 254.0
        pprheight = pixheight / 254.0
        if pprwidth > pprheight:
            pprorienttxt = 'LANDSCAPE'
        else:
            pprorienttxt = 'PORTRAIT'
    if pprorienttxt == 'PORTRAIT':
        pprorient = 1
    else:
        pprorient = 2

    #copy template chart MXD to chart output location
    #==== WARNING! ====
    # If the mxd already exists in the detination folder,
    # it will be overwritten
    #==================
    destmxd = outloc + os.path.sep + chartnm + '.mxd'
    shutil.copy(templt, destmxd)

    pMapDoc = NewObj(esriCarto.MapDocument, esriCarto.IMapDocument)
    pMapDoc.Open(destmxd)
    pPgLayout = pMapDoc.PageLayout
    pPgLayout3 = CType(pPgLayout, esriCarto.IPageLayout3)
    pPage = pPageLayout3.Page
    pPage.Units(esriInches)
    pPage.PutCustomSize(pprwidth, pprheight)
    pPage.Orientation(pprorient)
    pMap = pMapDoc.Map
    pMap.MapUnits(esriInches)
    pMap.SetPageSize(pprwidth, pprheight)
    pMap.ReferenceScale(1.0/scale)
    pMap.MapScale(1.0/scale)

    pMapDoc.Close()
    i = i + 1
f.close()

2voto

John Kramlich Puntos 286

No estoy seguro de si son más de la ingeniería de esto? O he simplificado en mi cabeza! Yo era capaz de ir a través de un conjunto de MXD cambiando la referencia espacial de la primera dataframe con algunos relativamente simple código python, por lo que no ArcObjects necesario. A continuación está el código que he usado.

import arcpy

def main():
    try:
        # Get desired spatial reference from an existing shapefile
        fc = r"C:\temp\myData.shp"
        sr = arcpy.Describe(fc).spatialReference

        # Create a list of MXD's
        arcpy.env.workspace = r"C:\temp"
        mxdlist = arcpy.ListFiles("*.mxd")

        # Main update loop
        for m in mxdlist:
            # Create MapDocument object
            fullpath = arcpy.env.workspace + "\\" + m
            print "processing " + fullpath
            mxd = arcpy.mapping.MapDocument(fullpath)

            # Get first dataframe in map document and set spatialreference
            df = arcpy.mapping.ListDataFrames(mxd)[0]
            df.spatialReference = sr

            # Overwrite mxd
            mxd.save()
    except:
        print "A critical error occurred during the execution of this Script, cannot continue!"

if __name__ == '__main__':
    arcpy.env.overwriteOutput=True
    main()

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