6 votos

¿Cómo ejecutar Viewshed en una característica en el tiempo en shapefile?

Tengo más de 100 funciones en un shapefile y quiero crear individuales viewsheds para cada y, a continuación, ejecute los procesos en cada una de las resultantes viewsheds en ArcGIS utilizando Python.

  • Es posible escribir una secuencia de comandos mediante un cursor para ejecutar a través de cada "fila" y el uso que el individuo punto de observador para ejecutar el viewshed? Luego de actualizar el cursor a la siguiente fila y volver a ejecutar hasta que todas las características que se han agotado?

O tengo que primero se Divide el shapefile en más de 100 archivos y ejecutar cada uno individualmente?

  • También, es posible designar los nombres de fichero resultante viewsheds (o shapefiles) el uso de un campo específico?

5voto

Aissen Puntos 131

Nunca he usado la viewshed herramienta, así que no puedo hablar con los detalles de uso de dicha herramienta, sin embargo en lo que respecta a su propuesta, en esta pregunta voy a añadir aquí una respuesta para construir en KHibma de la solución.

La primera cosa que tenemos que abordar es el formato de la consulta SQL: "[OID] = count". Tal y como está, esta consulta se producirá un error ya que "la cuenta", como se representa aquí, es una cadena de caracteres y cadenas de caracteres deben ser rodeado por comillas simples: "[OID] = 'count'". Ahora, la segunda razón por la que esta consulta no es que OID es un campo entero y, como tal, no habrá OID valor igual a "count". Aquí es donde el formato de cadena entra en juego: '"OID" = {}'.format(i) o '"OID" = {0}'.format(i) para aquellos que utilizan Python 2.6.x (Utilice comillas para delimitar el campo de nombre cuando se utiliza un archivo shapefile. Consulte la ayuda de ArcGIS.).

Para evitar ciertas dificultades para hacer consultas sobre el OBJECTID de campo, podemos anidar el bucle en un cursor para asegurarse de que sólo estamos consultando OID valores que existen:

arcpy.MakeFeatureLayer_management ("C:/data/pts.shp", "pts")

with arcpy.da.SearchCursor('pts',['OID']) as cursor:
    for row in cursor:
        oid = row.OID # or whatever your OBJECTID field is called
        arcpy.SelectLayerByAttribute_management ("pts", "NEW_SELECTION", '"OID" = {}'.format(oid))
        outViewshed = Viewshed("elevation","pts",2,"CURVED_EARTH",0.15)
        outViewshed.save("C:/sapyexamples/output/outvwshd"+oid)

3voto

Spatial Pariah Puntos 332

OK, tomando prestado de la respuesta de @Jason, fue capaz de afinar un poco para llegar finalmente a un script que funciona muy bien. También cambié para utilizar FID en vez de OID. De cualquier manera, va a funcionar.

arcpy.MakeFeatureLayer_management (inPoints, "pts")

with arcpy.da.SearchCursor('pts',['FID']) as cursor:
    for row in cursor:
        fid = str(row[0]) ### Must be string
        print fid
        arcpy.SelectLayerByAttribute_management ("pts", "NEW_SELECTION", '"FID" = {}'.format(fid))
        outViewshed = Viewshed(inDEM,"pts",1,"CURVED_EARTH",0.15)
        outViewshed.save("C:/Python/output/viewsheds/"+fid)

Tal vez esto le ayudará a alguien en el futuro. ¡Gracias a todos!

1voto

Galbrezu Puntos 142

Usted podría hacer un cursor, pero sus más sencillo para utilizar la selección por atributos de la herramienta. Sólo tiene que poner en un bucle ... Aquí un poco de código no probado (usted probablemente tendrá que jugar con la expresión en la selección de: (nota: acabo de añadir la cuenta a nombre de salida, si desea obtener el valor específico de un campo, entonces usted tendrá que abrir un cursor)

arcpy.MakeFeatureLayer_management ("C:/data/pts.shp", "pts")
count = int(arcpy.GetCount_management("pts").getOutput(0)) 
i=0
while i < count:
   arcpy.SelectLayerByAttribute_management ("pts", "NEW_SELECTION", "[OID] = i")
   outViewshed = Viewshed("elevation","pts",2,"CURVED_EARTH",0.15)
   outViewshed.save("C:/sapyexamples/output/outvwshd"+count)
   i+=1

O usted podría hacer todo en un modelo. La "avanzada" del modelo en la parte inferior de este tema se explica cómo hacerlo. Acaba de cortar a cabo el cómputo de área de la parte, y sólo el viewsheds con el iterador. Utilizando el modelo de la herramienta de "obtener el valor del campo" se puede utilizar en línea de variables para actualizar el final del nombre de salida. Esto sería realmente mi manera preferida de hacer frente a este problema (modelo de secuencia de comandos)

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