def condition_g(rows, speeds, angles, index, maxSpeed): ''' assess condition (g) from the text ''' if index > 1 and index < len(rows) - 1: dist1 = geo.haversineDistance( rows[index][5], rows[index][6], rows[index - 2][5], rows[index - 2][6]) + geo.haversineDistance( rows[index + 1][5], rows[index + 1][6], rows[index][5], rows[index][6]) dist2 = geo.haversineDistance( rows[index - 1][5], rows[index - 1][6], rows[index - 2][5], rows[index - 2][6]) + geo.haversineDistance( rows[index + 1][5], rows[index + 1][6], rows[index - 1][5], rows[index - 1][6]) distTol = geo.haversineDistance(rows[index - 1][5], rows[index - 1][6], rows[index - 2][5], rows[index - 2][6]) distTol += geo.haversineDistance(rows[index][5], rows[index][6], rows[index - 1][5], rows[index - 1][6]) distTol += geo.haversineDistance(rows[index + 1][5], rows[index + 1][6], rows[index][5], rows[index][6]) distTol = max(DistRes, 0.1 * distTol) if dist1 < dist2 - distTol: return index - 1, 'g' if dist2 < dist1 - distTol: return index, 'g' return condition_h(rows, speeds, angles, index, maxSpeed)
def condition_h(rows, speeds, angles, index, maxSpeed): ''' assess condition (h) from the text ''' if index > 1 and index < len(rows) - 1: dist1 = geo.haversineDistance(rows[index][5], rows[index][6], rows[index-2][5], rows[index-2][6]) + geo.haversineDistance(rows[index+1][5], rows[index+1][6], rows[index][5], rows[index][6]) dist2 = geo.haversineDistance(rows[index-1][5], rows[index-1][6], rows[index-2][5], rows[index-2][6]) + geo.haversineDistance(rows[index+1][5], rows[index+1][6], rows[index-1][5], rows[index-1][6]) PD1 = geo.haversineDistance(rows[index-1][5], rows[index-1][6], rows[index-2][5], rows[index-2][6]) / dist2 PD2 = geo.haversineDistance(rows[index][5], rows[index][6], rows[index-2][5], rows[index-2][6]) / dist1 PT1 = geo.deltaTime((rows[index-2][1], rows[index-2][2], rows[index-2][3], rows[index-2][4]), (rows[index-1][1], rows[index-1][2], rows[index-1][3], rows[index-1][4])) / geo.deltaTime((rows[index-2][1], rows[index-2][2], rows[index-2][3], rows[index-2][4]), (rows[index+1][1], rows[index+1][2], rows[index+1][3], rows[index+1][4])) PT2 = geo.deltaTime((rows[index-2][1], rows[index-2][2], rows[index-2][3], rows[index-2][4]), (rows[index][1], rows[index][2], rows[index][3], rows[index][4])) / geo.deltaTime((rows[index-2][1], rows[index-2][2], rows[index-2][3], rows[index-2][4]), (rows[index+1][1], rows[index+1][2], rows[index+1][3], rows[index+1][4])) if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): return index-1, 'h' if abs(PD2 - PT2) > 0.1 + abs(PD1 - PT1): return index, 'h' return -1, 'i'
def condition_g(rows, speeds, angles, index, maxSpeed): ''' assess condition (g) from the text ''' if index > 1 and index < len(rows) - 1: dist1 = geo.haversineDistance(rows[index][5], rows[index][6], rows[index-2][5], rows[index-2][6]) + geo.haversineDistance(rows[index+1][5], rows[index+1][6], rows[index][5], rows[index][6]) dist2 = geo.haversineDistance(rows[index-1][5], rows[index-1][6], rows[index-2][5], rows[index-2][6]) + geo.haversineDistance(rows[index+1][5], rows[index+1][6], rows[index-1][5], rows[index-1][6]) distTol = geo.haversineDistance(rows[index-1][5], rows[index-1][6], rows[index-2][5], rows[index-2][6]) distTol += geo.haversineDistance(rows[index][5], rows[index][6], rows[index-1][5], rows[index-1][6]) distTol += geo.haversineDistance(rows[index+1][5], rows[index+1][6], rows[index][5], rows[index][6]) distTol = max(DistRes, 0.1*distTol) if dist1 < dist2 - distTol: return index-1, 'g' if dist2 < dist1 - distTol: return index, 'g' return condition_h(rows, speeds, angles, index, maxSpeed)
def trackSpeed(prevHeader, header): ''' computes the speed, including rounding tolerance from the reference, for the track at <header>. return None if some necessary data is missing ''' # check that all required data is present: if None in [header.latitude(), header.longitude(), prevHeader.latitude(), prevHeader.longitude()]: return None if None in [header.year(), header.month(), header.day(), header.time(), prevHeader.year(), prevHeader.month(), prevHeader.day(), prevHeader.time()]: return None dist = geo.haversineDistance(prevHeader, header) DTime = geo.deltaTime(prevHeader, header) speed = (dist - DistRes) / max(DTime, TimeRes) return speed
def trackSpeed(prev_row, row): ''' computes the speed, including rounding tolerance from the reference, for the track at <row>. return None if some necessary data is missing ''' # check that all required data (full timestamp + lat + long) is present: if None in [row[1], row[2], row[3], row[4], row[5], row[6]]: return None if None in [prev_row[1], prev_row[2], prev_row[3], prev_row[4], prev_row[5], prev_row[6] ]: return None dist = geo.haversineDistance(prev_row[5], prev_row[6], row[5], row[6]) DTime = geo.deltaTime((prev_row[1], prev_row[2], prev_row[3], prev_row[4]), (row[1], row[2], row[3], row[4])) speed = (dist - DistRes) / max(DTime, TimeRes) return speed
def condition_h(headers, speeds, angles, index, maxSpeed): ''' assess condition (h) from the text typeo in text, implementation incomplete ''' if index > 1 and index < len(headers) - 1: dist1 = geo.haversineDistance(headers[index], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index]) dist2 = geo.haversineDistance(headers[index-1], headers[index-2]) + geo.haversineDistance(headers[index + 1], headers[index-1]) PD1 = geo.haversineDistance(headers[index-1], headers[index-2]) / dist2 PD2 = geo.haversineDistance(headers[index], headers[index-2]) / dist1 PT1 = geo.deltaTime(headers[index-2], headers[index-1]) / geo.deltaTime(headers[index-2], headers[index+1]) PT2 = geo.deltaTime(headers[index-2], headers[index]) / geo.deltaTime(headers[index-2], headers[index+1]) if abs(PD1-PT1) > 0.1 + abs(PD2-PT2): return index-1, 'h' if abs(PD2 - PT2) > 0.1 + abs(PD1 - PT1): return index, 'h' return -1, 'i'