Ich versuche, eine Reihe von zeitcodierten GPS-Punktdaten in Verhaltensweisen zu klassifizieren, die auf verschiedenen Attributen basieren.
Ich habe ein Attribut erstellt, das je nach Standort 0 für Zuhause und 1 für Auswärts ist, und möchte nun die Reisen von zu Hause aus nummerieren (eine Reihe von Punkten 01111111111110
wäre eine Reise, da sie zu Hause begann und endete). Ich habe das Attributfeld hinzugefügt, das die Reisenummern enthält, weiß aber nicht, wie das Feld berechnet werden soll, damit es auf dem Heim- / Auswärtsfeld basiert.
Hier ist ein Beispiel für die GPS-Daten (mit "*", um irrelevante Informationen anzuzeigen und einfach die Zeiten als 1, 2 usw. zu indizieren), die oben beschriebene Anzeige "Home / Away" und die gewünschte Auslöseanzeige "Trip". was ich berechnen muss:
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
....
Mein Datensatz ist zu groß, um jede Fahrt manuell in der Attributtabelle zu durchlaufen und zu nummerieren. Gibt es also eine Möglichkeit, das Feld basierend auf der Reihenfolge des Home / Away-Attributs zu berechnen und jeden "Klumpen" von Auswärtspunkten als zu kennzeichnen Ausflug?
Dies sind die Grundlagen dafür, wie Python-Code aussehen könnte (ich habe keine Erfahrung mit Code).
Ausdruck:
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
Nachdem ich das von matt wilkie empfohlene Skript verwendet habe, habe ich einige Änderungen vorgenommen, sodass meine erste Reise die Nummer 1, meine zweite die Nummer 2 usw. ist.
Hier ist der von matt modifizierte Code:
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
Dann wähle ich einfach für home = 0 und berechne mein Reisefeld zurück auf 0. Ordentlich geordnete Reisen.
trip
Variable beliebig oft neu initialisiert werden kann.row.TRIP = trip
Zeile in jedem der beiden Blöcke, die den Beginn und das Ende der Reise behandeln, zu kommentieren oder zu löschen . (Und denken Sie darüber nach,rows.updateRow(row)
welche folgen, da es dort nichts mehr zu retten gibt.)Die ArcGIS 10-Hilfe unter "Feldbeispiele berechnen" zeigt Ihnen, wie Sie den Akkumulationswert eines numerischen Felds berechnen. Dies reicht aus, vorausgesetzt, die Daten befinden sich physisch in der beabsichtigten zeitlichen Reihenfolge.
Um es direkt anzuwenden, invertieren Sie Ihren [Home / Away] -Indikator (subtrahieren Sie ihn von 1), sodass "0" "weg" und "1" "zu Hause" bedeutet. Ich nenne dies im folgenden Beispiel [Auswärts / Heim].
Berechnen Sie den kumulativen Wert - [kumulativ] im Beispiel.
Addiere eins und dividiere durch zwei - [Trip] im Beispiel (fast).
Setzen Sie schließlich [Trip] für alle "Home" -Datensätze auf Null. Nun stimmen die Ergebnisse mit dem Beispiel überein:
Im Folgenden finden Sie den Code aus der ArcGIS 10-Hilfe. Ich habe es leicht modifiziert, damit es jeden Schritt auf einmal macht: Jetzt müssen Sie es nur noch ausführen. Es sollte klar sein, wo [Heim / Auswärts] invertiert wird und wo der Schritt "1 addieren, durch 2 teilen" auftritt.
Ausdruck:
Ausdruckstyp:
Codeblock:
quelle
t
Speicherbereinigungszyklus ), sodass er an scheinbar zufälligen Stellen auf 0 zurückgesetzt wird.