Estoy tratando de clasificar un conjunto de datos de puntos codificados por tiempo gps en comportamientos basados en diferentes atributos.
He creado un atributo que es 0 para el hogar y 1 para el visitante según la ubicación, y ahora quiero numerar los viajes fuera de casa (un conjunto de puntos 01111111111110
sería un viaje porque comenzó y terminó en casa). He agregado el campo de atributo que tendrá los números de viaje, pero no sé cómo calcular el campo, por lo que se basa en el campo local / visitante.
Aquí hay un ejemplo de los datos del GPS (usando "*" para indicar información irrelevante y simplemente indexando los tiempos como 1, 2, etc.), el indicador "Local / Ausente" descrito anteriormente y el indicador de viaje deseado, "Viaje", que necesito calcular:
Time Lat Lon Home/Away Trip
1 * * 0 0
2 * * 1 1
3 * * 1 1
....
12 * * 1 1
13 * * 0 0
14 * * 0 0
15 * * 1 2
16 * * 1 2
....
34 * * 1 2
35 * * 0 0
36 * * 0 0
37 * * 1 3
....
Mi conjunto de datos es demasiado grande para pasar manualmente y numerar cada viaje en la tabla de atributos, por lo tanto, ¿hay alguna manera de calcular el campo en función de cómo se ordena el atributo local / visitante y cada "grupo" de puntos de distancia se designa como un ¿viaje?
Estos son los huesos básicos del aspecto que podría tener el código Python (no tengo experiencia con el código).
Expresión:
trip = Reclass(!home!)
Codeblock:
def Reclass(home):
if (home = 0):
return 0
elif (home = 1 and lastValue = 0):
return _(incremental numbering?)_
elif (home = 1 and lastValue = 1):
return lastValue
Después de usar el script recomendado de matt wilkie, hice algunos cambios para que mi primer viaje sea el número 1, el segundo sea el 2, etc.
Aquí está el código modificado de Matt's:
import arcpy
rows = arcpy.UpdateCursor("test2")
trip = 0
for row in rows:
if row.home == 0:
prev = row.home
row.TRIP = trip
rows.updateRow(row)
elif row.home == 1 and prev == 0:
trip += 1
prev = row.home
row.TRIP = trip
rows.updateRow(row)
rows.next()
elif row.home == 1 and prev == 1:
prev = row.home
row.TRIP = trip
rows.updateRow(row)
rows.next()
row.TRIP = trip
rows.updateRow(row)
del row, rows
Luego solo selecciono para inicio = 0 y calculo mi campo de viaje nuevamente a 0. Viajes ordenados cuidadosamente.
trip
variable puede reiniciarse cualquier número arbitrario de veces.row.TRIP = trip
línea en cada uno de los dos bloques que manejan el inicio y el final del viaje. (y, ahora que lo pienso, lorows.updateRow(row)
que sigue, ya que ya no hay nada que salvar allí.)La ayuda de ArcGIS 10 en "Calcular ejemplos de campo" le muestra cómo "Calcular el valor acumulativo de un campo numérico". Esto hará el truco, siempre que los datos estén físicamente en el orden temporal previsto.
Para aplicarlo directamente, invierta su indicador [Local / Ausente] (reste de 1) para que "0" signifique "ausente" y "1" significa "local". Llamo a esto [Ausente / Inicio] en el ejemplo a continuación.
Calcule su valor acumulativo - [Acumulativo] en el ejemplo.
Agregue uno y divida por dos - [Disparo] en el ejemplo (casi).
Finalmente, establezca [Viaje] en cero para todos los registros de "inicio". Ahora los resultados concuerdan con el ejemplo:
Para el registro, aquí está el código tomado de la ayuda de ArcGIS 10. Lo modifiqué un poco para que hiciera todos los pasos a la vez: ahora solo necesitas ejecutarlo. Debe quedar claro dónde se invierte [Inicio / Visitante] y dónde se produce el paso "sumar 1, dividir por 2".
Expresión:
Tipo de expresión:
Bloque de código:
fuente
t
lo que se restablecerá a 0 en lugares aparentemente aleatorios.