6 votos

Describir un sistema de coordenadas en arcpy

Tengo un python script en ArcGIS 10.1 que toma algunas entradas del usuario. Una de las entradas es un sistema de coordenadas. Me gustaría probar si el sistema de coordenadas que el usuario eligió fue proyectado o geográfico.

Una muestra del código es:

input1 = arcpy.GetParameterAsText(0)
input2 = arcpy.GetParameterAsText(1)
coordsys = arcpy.GetParameterAsText(2)

desc1 = arcpy.Describe(input1)
desc2 = arcpy.Describe(input2)
descCoordSys = arcpy.Describe(coordsys)

El código funciona bien hasta la última línea.

He obligado al usuario a introducir un sistema de coordenadas en la tercera línea: enter image description here

¿Qué me estoy perdiendo aquí?


EDITAR:

He intentado aplicar los cambios propuestos por @dmahr pero sigue sin funcionar. No está llegando a la parte anidada try declaración. Sólo se cierra con el error "Hubo un error con un archivo de entrada. Por favor, ejecute de nuevo". No estoy seguro de lo que estoy haciendo mal. He probado con sistemas de coordenadas proyectadas y geográficas.

input1 = arcpy.GetParameterAsText(0)
input2 = arcpy.GetParameterAsText(1)
coordsys = arcpy.GetParameter(2)

try:
    desc1 = arcpy.Describe(input1)
    desc2 = arcpy.Describe(input2)

    try:
        coordsys_linearunit = coordsys.linearUnitName
    except:
        arcpy.AddError("Input coordinate system is not projected.")
        sys.exit("Exiting.")

except:
    arcpy.AddError("There was an error with an input file.  Please run again.")
    sys.exit("Exiting.")

6voto

auramo Puntos 161

Dos posibles soluciones que he encontrado al jugar con el SpatialReference clase:

  1. En el diálogo de parámetros de su herramienta script, cambie el tipo de datos del parámetro Sistema de coordenadas a Referencia espacial. Una referencia espacial contiene un poco más de información que un sistema de coordenadas y es lo que se espera por GetParameter si esperas que cree un SpatialReference objeto.

    • Nota: En mis pruebas esto sólo funciona cuando se ejecuta como una herramienta script, no como un script de Python independiente, presumiblemente porque GetParameter requiere las definiciones de los parámetros de la herramienta script para inferir qué tipo de objeto crear a partir de la cadena de entrada.
  2. Además del cambio anterior puede utilizar el SpatialReference.loadFromString() para crear un objeto de referencia espacial a partir de su representación de cadena explícitamente. Esto debería funcionar tanto dentro de una herramienta script como en un script independiente de Python. Por ejemplo

    import arcpy
    input1 = arcpy.GetParameterAsText(0)
    input2 = arcpy.GetParameterAsText(1)
    srtxt = arcpy.GetParameterAsText(2)
    sr = arcpy.SpatialReference()
    sr.loadFromString(srtxt)
    if not sr.type == "Projected":
        raise RuntimeError("Input coordinate system is not projected.")

    Notarás que también cambié la comprobación del tipo de sistema de coordenadas para ser más explícito y cambié la lógica de manejo de errores para levantar un error que es un poco más pitónico, aunque eres libre de manejarlo como quieras.

5voto

El arcpy.GetParameterAsText obtiene el parámetro y lo convierte en un objeto de cadena. Se desea utilizar la función arcpy.GetParameter en su lugar.

Además, creo que no es necesario utilizar arcpy.Describe en un parámetro del sistema de coordenadas. En su lugar, se puede utilizar un arcpy.SpatialReference se devuelve el objeto. Así que podría utilizar el siguiente código:

input1 = arcpy.GetParameterAsText(0)
input2 = arcpy.GetParameterAsText(1)
coordsys = arcpy.GetParameter(2)

desc1 = arcpy.Describe(input1)
desc2 = arcpy.Describe(input2)

try:
    coordsyslinearunit = coordsys.linearUnitName
except:
    arcpy.AddError("Input coordinate system is not projected")

También se podría integrar este proceso de comprobación en los métodos de validación de la herramienta, de modo que el usuario no pudiera ejecutar la herramienta sin introducir un sistema de coordenadas proyectado.

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