J'essaie de classer un ensemble de données ponctuelles gps encodées dans le temps en comportements basés sur différents attributs.
J'ai créé un attribut qui est 0 pour la maison et 1 pour l'extérieur en fonction de l'emplacement, et je veux maintenant numéroter les voyages loin de chez eux (un ensemble de points 01111111111110
serait un voyage car il a commencé et s'est terminé à la maison). J'ai ajouté le champ d'attribut qui contiendra les numéros de trajet, mais je ne sais pas comment calculer le champ afin qu'il soit basé sur le champ domicile / extérieur.
Voici un exemple des données GPS (en utilisant "*" pour indiquer des informations non pertinentes et simplement l'indexation des heures comme 1, 2, etc.), l'indicateur "Domicile / Absent" décrit ci-dessus, et l'indicateur de trajet souhaité, "Trip", dont j'ai besoin pour calculer:
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
....
Mon ensemble de données est trop volumineux pour être parcouru manuellement et numéroter chaque trajet dans la table attributaire. voyage?
Ce sont les bases de ce à quoi pourrait ressembler le code Python (je ne suis pas expérimenté avec le code).
Expression:
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
Après avoir utilisé le script recommandé de matt wilkie, j'ai apporté quelques modifications pour que mon premier voyage soit le numéro 1, mon deuxième soit 2, etc.
Voici le code modifié de Matt:
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
Ensuite, je sélectionne simplement home = 0 et je calcule mon champ de voyage à 0. Voyages soigneusement ordonnés.
trip
variable peut être réinitialisée un nombre arbitraire de fois.row.TRIP = trip
ligne dans chacun des deux blocs qui gèrent le début et la fin du voyage. (et, à bien y penser, cerows.updateRow(row)
qui suit, car il n'y a plus rien à y sauver.)L'aide d'ArcGIS 10 sous "calculer des exemples de champs" vous montre comment "calculer la valeur cumulée d'un champ numérique". Cela fera l'affaire, à condition que les données soient physiquement dans l'ordre temporel prévu.
Pour l'appliquer directement, inversez votre indicateur [Domicile / Absent] (soustrayez-le de 1) de sorte que "0" signifie "loin" et "1" signifie "maison". J'appelle cela [Absent / Domicile] dans l'exemple ci-dessous.
Calculez sa valeur cumulée - [Cumulative] dans l'exemple.
Ajoutez un et divisez par deux - [Trip] dans l'exemple (presque).
Enfin, définissez [Trip] sur zéro pour tous les enregistrements "home". Maintenant, les résultats correspondent à l'exemple:
Pour mémoire, voici le code extrait de l'aide d'ArcGIS 10. Je l'ai légèrement modifié pour qu'il fasse chaque étape à la fois: maintenant il vous suffit de l'exécuter. Il doit être clair où [Domicile / Absent] est inversé et où l'étape "ajouter 1, diviser par 2" se produit.
Expression:
Type d'expression:
Bloc de code:
la source
t
sera donc réinitialisé à 0 dans des endroits apparemment aléatoires.