├── F-Trail -- Fractals for Taxi Trajectories.pdf ├── T-Drive article.pdf ├── Trajectory Clustering -- A Partition-and-Group Framework.pdf ├── auxiliary.py ├── clustering_scripts ├── __init__.py ├── auxiliary.pyc ├── coordination.py ├── coordination.pyc ├── distance_functions.py ├── distance_functions.pyc ├── generator_initializer.py ├── generic_dbscan.py ├── generic_dbscan.pyc ├── geometry.py ├── geometry.pyc ├── hooks.py ├── hooks.pyc ├── line_segment_averaging.py ├── line_segment_averaging.pyc ├── linked_list.py ├── linked_list.pyc ├── main2.py ├── main2.pyc ├── mutable_float.py ├── mutable_float.pyc ├── parallel_processing.py ├── parallel_processing.pyc ├── parameter_estimation.py ├── processed_trajectory_connecting.py ├── representative_line_finding.py ├── representative_line_finding.pyc ├── representative_trajectory_average_inputs.py ├── representative_trajectory_average_inputs.pyc ├── simulated_annealing.py ├── traclus_dbscan.py ├── traclus_dbscan.pyc ├── trajectory.py ├── trajectory_partitioning.py └── trajectory_partitioning.pyc ├── data2 ├── 1.txt ├── 10.txt ├── 15.txt ├── 16.txt ├── 17.txt ├── 18.txt ├── 19.txt ├── 2.txt ├── 20.txt ├── 21.txt ├── 22.txt ├── 23.txt ├── 24.txt ├── 25.txt ├── 26.txt ├── 27.txt ├── 28.txt ├── 29.txt ├── 3.txt ├── 30.txt ├── 31.txt ├── 32.txt ├── 33.txt ├── 34.txt ├── 35.txt ├── 36.txt ├── 37.txt ├── 38.txt ├── 39.txt ├── 4.txt ├── 40.txt ├── 41.txt ├── 42.txt ├── 43.txt ├── 44.txt ├── 45.txt ├── 46.txt ├── 47.txt ├── 48.txt ├── 49.txt ├── 5.txt ├── 50.txt ├── 51.txt ├── 52.txt ├── 53.txt ├── 54.txt ├── 55.txt ├── 56.txt ├── 57.txt ├── 58.txt ├── 59.txt ├── 6.txt ├── 60.txt ├── 61.txt ├── 62.txt ├── 63.txt ├── 64.txt ├── 65.txt ├── 66.txt ├── 67.txt ├── 68.txt ├── 69.txt ├── 7.txt ├── 8.txt └── 9.txt ├── data_list_json_100.txt ├── fractal_dimension.py ├── parallel_clustering.py └── read_data_and_analysis_start.py /F-Trail -- Fractals for Taxi Trajectories.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/F-Trail -- Fractals for Taxi Trajectories.pdf -------------------------------------------------------------------------------- /T-Drive article.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/T-Drive article.pdf -------------------------------------------------------------------------------- /Trajectory Clustering -- A Partition-and-Group Framework.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/Trajectory Clustering -- A Partition-and-Group Framework.pdf -------------------------------------------------------------------------------- /auxiliary.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Aug 22 17:37:56 2018 4 | 5 | @author: alari 6 | """ 7 | 8 | #%% auxiliary functions 9 | import numpy as np 10 | import os 11 | 12 | global distcol 13 | global timecol 14 | global velcol 15 | global accol 16 | distcol = 'dDist_km' 17 | timecol = 'dTime_min' 18 | velcol = 'velocity_km_min' 19 | accol = 'acc_km_minsq' 20 | 21 | def get_files(direc): 22 | full_files = [] 23 | for root, dirs, files in os.walk(direc): 24 | for name in files: 25 | full_files.append(os.path.join(root, name)) 26 | 27 | return(full_files) 28 | 29 | 30 | def add_time_diff(data): 31 | '''float64''' 32 | data[timecol] = (data['date_time'].shift(-1) - data['date_time'])/ np.timedelta64(1, 'm') 33 | return(data) 34 | 35 | def add_dist_diff(data): 36 | 37 | '''float64''' 38 | data[distcol] = np.append(pythagoras(data['latitude'], data['longitude']),0) 39 | return(data) 40 | 41 | def add_acc_vel(data): 42 | 43 | 44 | ''' float64''' 45 | data[velcol]=np.divide(data[distcol],data[timecol]) 46 | data[accol]=np.divide(data[velcol],data[timecol]) 47 | 48 | return(data) 49 | 50 | def doPipe(data): 51 | # ============================================================================= 52 | # if(quarterdata==1): 53 | # data = data.query('taxi_id<2501') 54 | # ============================================================================= 55 | 56 | data = data.pipe(add_time_diff)\ 57 | .pipe(add_dist_diff)\ 58 | .pipe(add_acc_vel) 59 | data_out = filterByTimeThreshold(data,-0.01,0) 60 | return(data_out) 61 | 62 | def doPipeForEach(datalist): 63 | '''Apply the doPipe function for every element in the input datalist''' 64 | data_list = [doPipe(r) for r in datalist] 65 | 66 | return(data_list) 67 | 68 | def produceFormat(data_list,ifrenamed): 69 | if(ifrenamed==0): 70 | data_list = [k.rename(index=str,columns={'latitude':'x','longitude':'y'}) for k in data_list] 71 | cc = [o[['x','y']].to_dict(orient='records') for o in data_list] 72 | return(cc) 73 | 74 | 75 | def doFeatureProc(data_list): 76 | data_list = [x.drop_duplicates(inplace=True) for x in data_list] 77 | data_list = [x.dropna(inplace=True) for x in data_list] 78 | data_list = [doPipe(x,distcol,timecol,0) for x in data_list] 79 | return(data_list) 80 | 81 | def doTimeDistCrosstab(data): 82 | import pandas as pd 83 | data['dist_ind'] = data[distcol]>5000.0 84 | data['time_ind'] = data[timecol]>300 85 | tab = pd.crosstab(data['dist_ind'],data['time_ind']) 86 | return(tab) 87 | 88 | def filterByTimeThreshold(data,threshold,ifsmaller): 89 | 90 | if(ifsmaller==1): 91 | filtered = data[(data[timecol]< threshold) & (data[timecol]> -1*threshold)] 92 | else : 93 | filtered = data[data[timecol] > threshold] 94 | 95 | return(filtered) 96 | 97 | 98 | def pythagoras(lat_in, lon_in): 99 | lat = np.array(lat_in) 100 | lon = np.array(lon_in) 101 | 102 | lat *= np.pi/180 # angles to radians 103 | lon *= np.pi/180 104 | 105 | lon1 = lon[0:-1] # all but last 106 | lon2 = lon[1:] # all but first 107 | 108 | lat1 = lat[0:-1] # all but last 109 | lat2 = lat[1:] # all but first 110 | 111 | x = (lon2-lon1) * np.cos((lat1+lat2)/2) # shift in lon 112 | y = lat2-lat1 # shift in lat 113 | 114 | d = np.sqrt(x**2 + y**2) * 6371 115 | return d 116 | 117 | def giveFilenames(settings): 118 | outnames = ['out'+str(idx)+'setting'+str(setidx)+'.txt' for idx in range(0,20) for setidx in range(0,len(settings))] 119 | filenames = ['input'+str(idx)+'setting'+str(setidx)+'.txt' for idx in range(0,20) for setidx in range(0,len(settings))] 120 | partitioned_trajectories = ['trajectory_list'+str(idx)+'setting'+str(setidx)+'.txt' for idx in range(0,20) for setidx in range(0,len(settings))] 121 | clusters = ['cluster_list'+str(idx)+'setting'+str(setidx)+'.txt' for idx in range(0,20) for setidx in range(0,len(settings))] 122 | #filenames= ['input'+str(i)+'.txt' for i in range(0,20)] 123 | # outnames= ['out'+str(i)+'.txt' for i in range(0,20)] 124 | #partitioned_trajectories = ['trajectory_list'+str(i)+'.txt' for i in range(0,20)] 125 | # clusters = ['cluster_list'+str(i)+'.txt' for i in range(0,20)] 126 | return(filenames,outnames,partitioned_trajectories,clusters) 127 | 128 | 129 | def produceConfigs(): 130 | idx = 0 131 | outconfs = [None]*5*3*4 132 | for eps in np.linspace(0.002,0.1,5): 133 | for min_neighbours in [2,8,10]: 134 | # for min_num_traj in [10,15,20]: 135 | for mp in [1E-7,1E-2,0.1,1]: 136 | outconfs[idx]={"epsilon": eps, "min_neighbors": min_neighbours, \ 137 | "min_num_trajectories_in_cluster": 5,\ 138 | "min_vertical_lines": 2,\ 139 | "min_prev_dist": mp} 140 | idx +=1 141 | return(outconfs) 142 | 143 | -------------------------------------------------------------------------------- /clustering_scripts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/__init__.py -------------------------------------------------------------------------------- /clustering_scripts/auxiliary.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/auxiliary.pyc -------------------------------------------------------------------------------- /clustering_scripts/coordination.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Jan 10, 2016 3 | 4 | @author: Alex 5 | ''' 6 | from generic_dbscan import dbscan 7 | import hooks 8 | from line_segment_averaging import get_representative_line_from_trajectory_line_segments 9 | from traclus_dbscan import TrajectoryLineSegmentFactory, \ 10 | TrajectoryClusterFactory, BestAvailableClusterCandidateIndex 11 | from trajectory_partitioning import get_line_segment_from_points, \ 12 | call_partition_trajectory 13 | 14 | def run_traclus(point_iterable_list, epsilon, min_neighbors, min_num_trajectories_in_cluster, \ 15 | min_vertical_lines, \ 16 | min_prev_dist,\ 17 | partitioned_points_hook=hooks.partitioned_points_hook, \ 18 | clusters_hook=hooks.clusters_hook): 19 | cleaned_input = [] 20 | for traj in map(lambda l: with_spikes_removed(l), point_iterable_list): 21 | cleaned_traj = [] 22 | if len(traj) > 1: 23 | prev = traj[0] 24 | cleaned_traj.append(traj[0]) 25 | for pt in traj[1:]: 26 | if prev.distance_to(pt) > 0.0: 27 | cleaned_traj.append(pt) 28 | prev = pt 29 | if len(cleaned_traj) > 1: 30 | cleaned_input.append(cleaned_traj) 31 | 32 | return the_whole_enchilada(point_iterable_list=cleaned_input, \ 33 | epsilon=epsilon, \ 34 | min_neighbors=min_neighbors, \ 35 | min_num_trajectories_in_cluster=min_num_trajectories_in_cluster, \ 36 | min_vertical_lines=min_vertical_lines, \ 37 | min_prev_dist=min_prev_dist, \ 38 | partitioned_points_hook=partitioned_points_hook, \ 39 | clusters_hook=clusters_hook) 40 | 41 | def with_spikes_removed(trajectory): 42 | if len(trajectory) <= 2: 43 | return trajectory[:] 44 | 45 | spikes_removed = [] 46 | spikes_removed.append(trajectory[0]) 47 | cur_index = 1 48 | while cur_index < len(trajectory) - 1: 49 | if trajectory[cur_index - 1].distance_to(trajectory[cur_index + 1]) > 0.0: 50 | spikes_removed.append(trajectory[cur_index]) 51 | cur_index += 1 52 | 53 | spikes_removed.append(trajectory[cur_index]) 54 | return spikes_removed 55 | 56 | def the_whole_enchilada(point_iterable_list, epsilon, min_neighbors, min_num_trajectories_in_cluster, \ 57 | min_vertical_lines, \ 58 | min_prev_dist,\ 59 | partitioned_points_hook=hooks.partitioned_points_hook, \ 60 | clusters_hook=hooks.clusters_hook): 61 | trajectory_line_segment_factory = TrajectoryLineSegmentFactory() 62 | def _dbscan_caller(cluster_candidates): 63 | line_seg_index = BestAvailableClusterCandidateIndex(cluster_candidates, epsilon) 64 | return dbscan(cluster_candidates_index=line_seg_index, #TrajectoryLineSegmentCandidateIndex(cluster_candidates), \ 65 | min_neighbors=min_neighbors, \ 66 | cluster_factory=TrajectoryClusterFactory()) 67 | 68 | all_traj_segs_iter_from_all_points_caller = \ 69 | get_all_trajectory_line_segments_iterable_from_all_points_iterable_caller(get_line_segs_from_points_func=get_trajectory_line_segments_from_points_iterable, \ 70 | trajectory_line_segment_factory=trajectory_line_segment_factory, \ 71 | trajectory_partitioning_func=call_partition_trajectory, \ 72 | line_seg_from_points_func=get_line_segment_from_points, \ 73 | partitioned_points_hook=partitioned_points_hook) 74 | cluster_iter_from_points_caller = \ 75 | get_cluster_iterable_from_all_points_iterable_caller(get_all_traj_segs_from_all_points_caller=all_traj_segs_iter_from_all_points_caller, \ 76 | dbscan_caller=_dbscan_caller, \ 77 | clusters_hook=clusters_hook) 78 | representative_line_from_trajectory_caller = get_representative_lines_from_trajectory_caller(min_vertical_lines=min_vertical_lines, min_prev_dist=min_prev_dist) 79 | return representative_line_seg_iterable_from_all_points_iterable(point_iterable_list, get_cluster_iterable_from_all_points_iterable_caller=cluster_iter_from_points_caller, \ 80 | get_representative_line_seg_from_trajectory_caller=representative_line_from_trajectory_caller, \ 81 | min_num_trajectories_in_cluster=min_num_trajectories_in_cluster) 82 | 83 | def get_cluster_iterable_from_all_points_iterable_caller(get_all_traj_segs_from_all_points_caller, \ 84 | dbscan_caller, \ 85 | clusters_hook): 86 | def _func(point_iterable_list): 87 | clusters = get_cluster_iterable_from_all_points_iterable(point_iterable_list=point_iterable_list, \ 88 | get_all_traj_segs_from_all_points_caller=get_all_traj_segs_from_all_points_caller, \ 89 | dbscan_caller=dbscan_caller) 90 | if clusters_hook: 91 | clusters_hook(clusters) 92 | return clusters 93 | return _func 94 | 95 | def get_representative_lines_from_trajectory_caller(min_vertical_lines, min_prev_dist): 96 | def _func(trajectory_line_segs): 97 | return get_representative_line_from_trajectory_line_segments(trajectory_line_segments=trajectory_line_segs, \ 98 | min_vertical_lines=min_vertical_lines, min_prev_dist=min_prev_dist) 99 | return _func 100 | 101 | def representative_line_seg_iterable_from_all_points_iterable(point_iterable_list, \ 102 | get_cluster_iterable_from_all_points_iterable_caller, \ 103 | get_representative_line_seg_from_trajectory_caller, 104 | min_num_trajectories_in_cluster): 105 | rep_lines = [] 106 | clusters = get_cluster_iterable_from_all_points_iterable_caller(point_iterable_list) 107 | for traj_cluster in clusters: 108 | if traj_cluster.num_trajectories_contained() >= min_num_trajectories_in_cluster: 109 | rep_lines.append(get_representative_line_seg_from_trajectory_caller(traj_cluster.get_trajectory_line_segments())) 110 | 111 | return rep_lines 112 | 113 | def get_cluster_iterable_from_all_points_iterable(point_iterable_list, get_all_traj_segs_from_all_points_caller, \ 114 | dbscan_caller): 115 | return dbscan_caller(get_all_traj_segs_from_all_points_caller(point_iterable_list)) 116 | 117 | def get_all_trajectory_line_segments_iterable_from_all_points_iterable_caller(get_line_segs_from_points_func, \ 118 | trajectory_line_segment_factory, trajectory_partitioning_func, \ 119 | line_seg_from_points_func, \ 120 | partitioned_points_hook): 121 | def _func(point_iterable_list): 122 | traj_line_segs = get_all_trajectory_line_segments_iterable_from_all_points_iterable(point_iterable_list=point_iterable_list, \ 123 | get_line_segs_from_points_func=get_line_segs_from_points_func, \ 124 | trajectory_line_segment_factory=trajectory_line_segment_factory, \ 125 | trajectory_partitioning_func=trajectory_partitioning_func, \ 126 | line_seg_from_points_func=line_seg_from_points_func) 127 | if partitioned_points_hook: 128 | partitioned_points_hook(traj_line_segs) 129 | return traj_line_segs 130 | return _func 131 | 132 | def get_all_trajectory_line_segments_iterable_from_all_points_iterable(point_iterable_list, \ 133 | get_line_segs_from_points_func, \ 134 | trajectory_line_segment_factory, trajectory_partitioning_func, \ 135 | line_seg_from_points_func): 136 | out = [] 137 | cur_trajectory_id = 0 138 | for point_trajectory in point_iterable_list: 139 | line_segments = get_line_segs_from_points_func(point_iterable=point_trajectory, 140 | trajectory_line_segment_factory=trajectory_line_segment_factory, 141 | trajectory_id=cur_trajectory_id, 142 | trajectory_partitioning_func=trajectory_partitioning_func, 143 | line_seg_from_points_func=line_seg_from_points_func) 144 | temp = 0 145 | for traj_seg in line_segments: 146 | out.append(traj_seg) 147 | temp += 1 148 | if temp <= 0: 149 | raise Exception() 150 | 151 | cur_trajectory_id += 1 152 | 153 | return out 154 | 155 | 156 | def get_trajectory_line_segments_from_points_iterable(point_iterable, trajectory_line_segment_factory, trajectory_id, \ 157 | trajectory_partitioning_func, line_seg_from_points_func): 158 | good_point_iterable = filter_by_indices(good_indices=trajectory_partitioning_func(trajectory_point_list=point_iterable), \ 159 | vals=point_iterable) 160 | line_segs = consecutive_item_func_iterator_getter(consecutive_item_func=line_seg_from_points_func, \ 161 | item_iterable=good_point_iterable) 162 | def _create_traj_line_seg(line_seg): 163 | return trajectory_line_segment_factory.new_trajectory_line_seg(line_seg, trajectory_id=trajectory_id) 164 | 165 | return map(_create_traj_line_seg, line_segs) 166 | 167 | def filter_by_indices(good_indices, vals): 168 | return _filter_by_indices(good_indices, vals) 169 | 170 | def _filter_by_indices(good_indices, vals): 171 | vals_iter = iter(vals) 172 | good_indices_iter = iter(good_indices) 173 | out_vals = [] 174 | 175 | num_vals = 0 176 | for i in good_indices_iter: 177 | if i != 0: 178 | raise ValueError("the first index should be 0, but it was " + str(i)) 179 | else: 180 | for item in vals_iter: 181 | out_vals.append(item) 182 | break 183 | num_vals = 1 184 | break 185 | 186 | max_good_index = 0 187 | vals_cur_index = 1 188 | for i in good_indices_iter: 189 | max_good_index = i 190 | for item in vals_iter: 191 | num_vals += 1 192 | if vals_cur_index == i: 193 | vals_cur_index += 1 194 | out_vals.append(item) 195 | break 196 | else: 197 | vals_cur_index += 1 198 | 199 | for i in vals_iter: 200 | num_vals += 1 201 | 202 | if num_vals < 2: 203 | raise ValueError("list passed in is too short") 204 | if max_good_index != num_vals - 1: 205 | raise ValueError("last index is " + str(max_good_index) + \ 206 | " but there were " + str(num_vals) + " vals") 207 | return out_vals 208 | 209 | def consecutive_item_func_iterator_getter(consecutive_item_func, item_iterable): 210 | out_vals = [] 211 | iterator = iter(item_iterable) 212 | last_item = None 213 | num_items = 0 214 | for item in iterator: 215 | num_items = 1 216 | last_item = item 217 | break 218 | if num_items == 0: 219 | raise ValueError("iterator doesn't have any values") 220 | 221 | for item in iterator: 222 | num_items += 1 223 | out_vals.append(consecutive_item_func(last_item, item)) 224 | last_item = item 225 | 226 | if num_items < 2: 227 | raise ValueError("iterator didn't have at least two items") 228 | 229 | return out_vals 230 | -------------------------------------------------------------------------------- /clustering_scripts/coordination.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/coordination.pyc -------------------------------------------------------------------------------- /clustering_scripts/distance_functions.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Dec 29, 2015 3 | 4 | @author: Alex 5 | ''' 6 | import math 7 | 8 | def determine_longer_and_shorter_lines(line_a, line_b): 9 | if line_a.length < line_b.length: 10 | return (line_b, line_a) 11 | else: 12 | return (line_a, line_b) 13 | 14 | 15 | def get_total_distance_function(perp_dist_func, angle_dist_func, parrallel_dist_func): 16 | def __dist_func(line_a, line_b, perp_func=perp_dist_func, angle_func=angle_dist_func, \ 17 | parr_func=parrallel_dist_func): 18 | return perp_func(line_a, line_b) + angle_func(line_a, line_b) + \ 19 | parr_func(line_a, line_b) 20 | return __dist_func 21 | 22 | def perpendicular_distance(line_a, line_b): 23 | longer_line, shorter_line = determine_longer_and_shorter_lines(line_a, line_b) 24 | dist_a = shorter_line.start.distance_to_projection_on(longer_line) 25 | dist_b = shorter_line.end.distance_to_projection_on(longer_line) 26 | 27 | if dist_a == 0.0 and dist_b == 0.0: 28 | return 0.0 29 | 30 | return (dist_a * dist_a + dist_b * dist_b) / (dist_a + dist_b) 31 | 32 | def __perpendicular_distance(line_a, line_b): 33 | longer_line, shorter_line = determine_longer_and_shorter_lines(line_a, line_b) 34 | dist_a = longer_line.line.project(shorter_line.start).distance_to(shorter_line.start) 35 | dist_b = longer_line.line.project(shorter_line.end).distance_to(shorter_line.end) 36 | 37 | if dist_a == 0.0 and dist_b == 0.0: 38 | return 0.0 39 | else: 40 | return (math.pow(dist_a, 2) + math.pow(dist_b, 2)) / (dist_a + dist_b) 41 | 42 | def angular_distance(line_a, line_b): 43 | longer_line, shorter_line = determine_longer_and_shorter_lines(line_a, line_b) 44 | sine_coefficient = shorter_line.sine_of_angle_with(longer_line) 45 | return abs(sine_coefficient * shorter_line.length) 46 | 47 | #def __parrallel_distance(line_a, line_b): 48 | 49 | def parrallel_distance(line_a, line_b): 50 | longer_line, shorter_line = determine_longer_and_shorter_lines(line_a, line_b) 51 | def __func(shorter_line_pt, longer_line_pt): 52 | return shorter_line_pt.distance_from_point_to_projection_on_line_seg(longer_line_pt, \ 53 | longer_line) 54 | return min([longer_line.dist_from_start_to_projection_of(shorter_line.start), \ 55 | longer_line.dist_from_start_to_projection_of(shorter_line.end), \ 56 | longer_line.dist_from_end_to_projection_of(shorter_line.start), \ 57 | longer_line.dist_from_end_to_projection_of(shorter_line.end)]) 58 | 59 | def dist_to_projection_point(line, proj): 60 | return min(proj.distance_to(line.start), proj.distance_to(line.end)) -------------------------------------------------------------------------------- /clustering_scripts/distance_functions.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/distance_functions.pyc -------------------------------------------------------------------------------- /clustering_scripts/generator_initializer.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Jan 6, 2016 3 | 4 | @author: Alex 5 | ''' 6 | 7 | class GeneratorInitializer: 8 | ''' 9 | classdocs 10 | ''' 11 | def __init__(self, generator_func, *args): 12 | self.generator_func = generator_func 13 | self.args = args 14 | 15 | def __iter__(self): 16 | return self.generator_func(*self.args) 17 | 18 | -------------------------------------------------------------------------------- /clustering_scripts/generic_dbscan.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Dec 30, 2015 3 | 4 | @author: Alex 5 | ''' 6 | import collections 7 | 8 | 9 | class ClusterCandidate: 10 | def __init__(self): 11 | self.cluster = None 12 | self.__is_noise = False 13 | 14 | def is_classified(self): 15 | return self.__is_noise or self.cluster != None 16 | 17 | def is_noise(self): 18 | return self.__is_noise 19 | 20 | def set_as_noise(self): 21 | self.__is_noise = True 22 | 23 | def assign_to_cluster(self, cluster): 24 | self.cluster = cluster 25 | self.__is_noise = False 26 | 27 | def distance_to_candidate(self, other_candidate): 28 | raise NotImplementedError() 29 | 30 | class ClusterCandidateIndex: 31 | def __init__(self, candidates, epsilon): 32 | self.candidates = candidates 33 | self.epsilon = epsilon 34 | 35 | def find_neighbors_of(self, cluster_candidate): 36 | neighbors = [] 37 | 38 | for item in self.candidates: 39 | if item != cluster_candidate and \ 40 | cluster_candidate.distance_to_candidate(item) <= self.epsilon: 41 | neighbors.append(item) 42 | return neighbors 43 | 44 | class Cluster: 45 | def __init__(self): 46 | self.members = [] 47 | self.member_set = set() 48 | 49 | def add_member(self, item): 50 | if item in self.member_set: 51 | raise Exception("item: " + str(item) + " already exists in this cluster") 52 | self.member_set.add(item) 53 | self.members.append(item) 54 | 55 | def __repr__(self): 56 | return str(self.members) 57 | 58 | class ClusterFactory(): 59 | def new_cluster(self): 60 | return Cluster() 61 | 62 | def dbscan(cluster_candidates_index, min_neighbors, cluster_factory): 63 | clusters = [] 64 | item_queue = collections.deque() 65 | 66 | for item in cluster_candidates_index.candidates: 67 | if not item.is_classified(): 68 | neighbors = cluster_candidates_index.find_neighbors_of(item) 69 | if len(neighbors) >= min_neighbors: 70 | cur_cluster = cluster_factory.new_cluster() 71 | cur_cluster.add_member(item) 72 | item.assign_to_cluster(cur_cluster) 73 | 74 | for other_item in neighbors: 75 | other_item.assign_to_cluster(cur_cluster) 76 | cur_cluster.add_member(other_item) 77 | item_queue.append(other_item) 78 | 79 | expand_cluster(item_queue, cur_cluster, min_neighbors, \ 80 | cluster_candidates_index) 81 | clusters.append(cur_cluster) 82 | else: 83 | item.set_as_noise() 84 | 85 | return clusters 86 | 87 | def expand_cluster(item_queue, cluster, min_neighbors, cluster_candidates_index): 88 | while len(item_queue) > 0: 89 | item = item_queue.popleft() 90 | neighbors = cluster_candidates_index.find_neighbors_of(item) 91 | if len(neighbors) >= min_neighbors: 92 | for other_item in neighbors: 93 | if not other_item.is_classified(): 94 | item_queue.append(other_item) 95 | if other_item.is_noise() or not other_item.is_classified(): 96 | other_item.assign_to_cluster(cluster) 97 | cluster.add_member(other_item) 98 | 99 | 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /clustering_scripts/generic_dbscan.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/generic_dbscan.pyc -------------------------------------------------------------------------------- /clustering_scripts/geometry.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Mar 23, 2016 3 | 4 | @author: Alex 5 | ''' 6 | import math 7 | 8 | from representative_trajectory_average_inputs import DECIMAL_MAX_DIFF_FOR_EQUALITY 9 | 10 | 11 | _delta = 0.000000001 12 | 13 | def set_max_delta_for_equality(delta): 14 | _delta = delta 15 | 16 | class Vec2(object): 17 | def __init__(self, x, y): 18 | self.x = float(x) 19 | self.y = float(y) 20 | if x != 0.0: 21 | self.angle = math.degrees(math.atan(float(y) / x)) 22 | elif y == 0.0: 23 | self.angle = 0 24 | elif y > 0.0: 25 | self.angle = 90 26 | elif y < 0.0: 27 | self.angle = -90 28 | 29 | if self.x < 0: 30 | self.angle += 180 31 | 32 | def dot_product_with(self, other_vector): 33 | return self.x * other_vector.x + self.y * other_vector.y 34 | 35 | def as_dict(self): 36 | return {'x': self.x, 'y': self.y} 37 | 38 | def multipled_by_matrix(self, x1, y1, x2, y2): 39 | new_x = self.x * x1 + self.y * x2 40 | new_y = self.x * y1 + self.y * y2 41 | return Vec2(new_x, new_y) 42 | 43 | def rotated(self, angle_in_degrees): 44 | cos_angle = math.cos(math.radians(angle_in_degrees)) 45 | sin_angle = math.sin(math.radians(angle_in_degrees)) 46 | return self.multipled_by_matrix(x1=cos_angle, y1=sin_angle, x2=-sin_angle, y2=cos_angle) 47 | 48 | def almost_equals(self, other): 49 | return abs(self.x - other.x) <= DECIMAL_MAX_DIFF_FOR_EQUALITY and \ 50 | abs(self.y - other.y) <= DECIMAL_MAX_DIFF_FOR_EQUALITY 51 | 52 | def __eq__(self, other): 53 | return other != None and abs(self.x - other.x) < _delta and abs(self.y - other.y) < _delta 54 | 55 | def __ne__(self, other): 56 | return not self.__eq__(other) 57 | 58 | def __str__(self): 59 | return "x: " + str(self.x) + ". y: " + str(self.y) 60 | 61 | def distance(diff_x, diff_y): 62 | return math.sqrt(diff_x * diff_x + diff_y * diff_y) 63 | 64 | class Point(Vec2): 65 | def __init__(self, x, y): 66 | Vec2.__init__(self, x, y) 67 | 68 | def distance_to(self, other_point): 69 | diff_x = other_point.x - self.x 70 | diff_y = other_point.y - self.y 71 | return math.sqrt(math.pow(diff_x, 2) + math.pow(diff_y, 2)) 72 | 73 | def distance_to_projection_on(self, line_segment): 74 | diff_x = self.x - line_segment.start.x 75 | diff_y = self.y - line_segment.start.y 76 | 77 | return abs(diff_x * line_segment.unit_vector.y - diff_y * line_segment.unit_vector.x) 78 | #return self.distance_from_point_to_projection_on_line_seg(self, line_segment) 79 | 80 | def rotated(self, angle_in_degrees): 81 | result = Vec2.rotated(self, angle_in_degrees) 82 | return Point(result.x, result.y) 83 | 84 | class LineSegment(object): 85 | @staticmethod 86 | def from_tuples(start, end): 87 | return LineSegment(Point(start[0], start[1]), Point(end[0], end[1])) 88 | 89 | def __init__(self, start, end): 90 | self.start = start 91 | self.end = end 92 | self.length = start.distance_to(end) 93 | 94 | if self.length > 0.0: 95 | unit_x = (end.x - start.x) / self.length 96 | unit_y = (end.y - start.y) / self.length 97 | self.unit_vector = Point(unit_x, unit_y) 98 | 99 | def as_dict(self): 100 | return {'start': self.start.as_dict(), 'end': self.end.as_dict()} 101 | 102 | def sine_of_angle_with(self, other_line_segment): 103 | return self.unit_vector.x * other_line_segment.unit_vector.y - \ 104 | self.unit_vector.y * other_line_segment.unit_vector.x 105 | 106 | def dist_from_start_to_projection_of(self, point): 107 | diff_x = self.start.x - point.x 108 | diff_y = self.start.y - point.y 109 | return abs(diff_x * self.unit_vector.x + diff_y * self.unit_vector.y) 110 | 111 | def dist_from_end_to_projection_of(self, point): 112 | diff_x = self.end.x - point.x 113 | diff_y = self.end.y - point.y 114 | return abs(diff_x * self.unit_vector.x + diff_y * self.unit_vector.y) 115 | 116 | def almost_equals(self, other): 117 | return (self.start.almost_equals(other.start) and self.end.almost_equals(other.end)) #or \ 118 | #(self.end.almost_equals(other.start) and self.start.almost_equals(other.end)) 119 | 120 | def __eq__(self, other): 121 | return other != None and (self.start == other.start and self.end == other.end) #or \ 122 | #(self.end == other.start and self.start == other.end) 123 | 124 | def __ne__(self, other): 125 | return not self.__eq__(other) 126 | 127 | def __str__(self): 128 | return "start: " + str(self.start) + ". end: " + str(self.end) 129 | 130 | -------------------------------------------------------------------------------- /clustering_scripts/geometry.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/geometry.pyc -------------------------------------------------------------------------------- /clustering_scripts/hooks.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Feb 8, 2016 3 | 4 | @author: Alex 5 | ''' 6 | def partitioned_points_hook(partitioned_points): 7 | pass 8 | 9 | def clusters_hook(clusters): 10 | pass -------------------------------------------------------------------------------- /clustering_scripts/hooks.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/hooks.pyc -------------------------------------------------------------------------------- /clustering_scripts/line_segment_averaging.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Jan 5, 2016 3 | 4 | @author: Alex 5 | ''' 6 | 7 | from representative_trajectory_average_inputs import get_representative_trajectory_average_inputs,\ 8 | DECIMAL_MAX_DIFF_FOR_EQUALITY 9 | from geometry import Point 10 | from representative_line_finding import get_average_vector, get_rotated_line_segment 11 | 12 | def get_representative_line_from_trajectory_line_segments(trajectory_line_segments, min_vertical_lines, min_prev_dist): 13 | average_trajectory_vector = get_average_vector(line_segment_list=map(lambda x: x.line_segment, trajectory_line_segments)) 14 | 15 | for traj_line_seg in trajectory_line_segments: 16 | traj_line_seg.line_segment = get_rotated_line_segment(traj_line_seg.line_segment, \ 17 | - average_trajectory_vector.angle) 18 | 19 | representative_points = get_representative_line_from_rotated_line_segments(trajectory_line_segments=trajectory_line_segments, \ 20 | min_vertical_lines=min_vertical_lines, \ 21 | min_prev_dist=min_prev_dist) 22 | return map(lambda x: x.rotated(angle_in_degrees=average_trajectory_vector.angle), representative_points) 23 | 24 | def get_representative_line_from_rotated_line_segments(trajectory_line_segments, min_vertical_lines, min_prev_dist): 25 | inputs = get_representative_trajectory_average_inputs(trajectory_line_segments=trajectory_line_segments, \ 26 | min_prev_dist=min_prev_dist, min_lines=min_vertical_lines) 27 | out = [] 28 | for line_seg_averaging_input in inputs: 29 | vert_val = get_mean_vertical_coordinate_in_line_segments(line_seg_averaging_input) 30 | out.append(Point(line_seg_averaging_input['horizontal_position'], vert_val)) 31 | return out 32 | 33 | def interpolate_within_line_segment(line_segment, horizontal_coordinate): 34 | min_x = min(line_segment.start.x, line_segment.end.x) 35 | max_x = max(line_segment.start.x, line_segment.end.x) 36 | 37 | if not (min_x <= horizontal_coordinate + DECIMAL_MAX_DIFF_FOR_EQUALITY \ 38 | and max_x >= horizontal_coordinate - DECIMAL_MAX_DIFF_FOR_EQUALITY): 39 | raise Exception("horizontal coordinate " + str(horizontal_coordinate) + \ 40 | " not within horizontal range of line segment" + \ 41 | " with bounds " + str(min_x) + " and " + str(max_x)) 42 | elif line_segment.start.y - line_segment.end.y == 0.0: 43 | return line_segment.start.y 44 | elif line_segment.start.x - line_segment.end.x == 0.0: 45 | return (line_segment.end.y - line_segment.start.y) / 2.0 + line_segment.start.y 46 | else: 47 | return float((horizontal_coordinate - line_segment.start.x)) / (line_segment.end.x - line_segment.start.x) * \ 48 | (line_segment.end.y - line_segment.start.y) + line_segment.start.y 49 | 50 | def line_segment_averaging_set_iterable(line_segments_to_average): 51 | line_segment_averaging_set = [] 52 | horizontal_coord = line_segments_to_average['horizontal_position'] 53 | for seg in line_segments_to_average['lines']: 54 | line_segment_averaging_set.append({'horizontal_pos': horizontal_coord, 'line_seg': seg.line_segment}) 55 | 56 | return line_segment_averaging_set 57 | 58 | def number_average(iter_ob, func): 59 | total = 0.0 60 | count = 0 61 | for item in iter_ob: 62 | total += func(item) 63 | count += 1 64 | 65 | if count == 0: 66 | raise Exception("no input given to take average of") 67 | else: 68 | return total / count 69 | 70 | def get_mean_vertical_coordinate_in_line_segments(line_segments_to_average): 71 | def apply_interpolation_to_line_segment(interpolation_info): 72 | if interpolation_info['line_seg'] == None or interpolation_info['horizontal_pos'] == None: 73 | raise Exception("nil key. " + str(interpolation_info) + " was passed to apply_interpolation_to_line_segment") 74 | return interpolate_within_line_segment(interpolation_info['line_seg'], interpolation_info['horizontal_pos']) 75 | 76 | return number_average(line_segment_averaging_set_iterable(line_segments_to_average), \ 77 | apply_interpolation_to_line_segment) -------------------------------------------------------------------------------- /clustering_scripts/line_segment_averaging.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/line_segment_averaging.pyc -------------------------------------------------------------------------------- /clustering_scripts/linked_list.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Jan 2, 2016 3 | 4 | @author: Alex 5 | ''' 6 | from compiler.ast import Node 7 | 8 | 9 | class LinkedList: 10 | def __init__(self): 11 | self.head = LinkedListNode(None) 12 | self.head.next = self.head 13 | self.head.prev = self.head 14 | self.size = 0 15 | 16 | def __iter__(self): 17 | return LinkedListIter(self) 18 | 19 | def __len__(self): 20 | return self.size 21 | 22 | def __getitem__(self, index): 23 | if index >= self.size or index < 0: 24 | raise IndexError 25 | 26 | cur = self.head.next 27 | count = 0 28 | while count < index: 29 | cur = cur.next 30 | count += 1 31 | return cur.item 32 | 33 | def add_last(self, item): 34 | temp = LinkedListNode(item) 35 | self.add_last_node(temp) 36 | 37 | def add_first(self, item): 38 | temp = LinkedListNode(item) 39 | self.add_first_node(temp) 40 | 41 | def get_first(self): 42 | if self.empty(): 43 | raise Exception("can't get item from empty list") 44 | return self.head.next.item 45 | 46 | def get_last(self): 47 | if self.empty(): 48 | raise Exception("can't get item from empty list") 49 | return self.head.prev.item 50 | 51 | def empty(self): 52 | return self.head == self.head.next 53 | 54 | def add_last_node(self, new_node): 55 | new_node.next = self.head 56 | new_node.prev = self.head.prev 57 | self.head.prev.next = new_node 58 | self.head.prev = new_node 59 | self.size += 1 60 | 61 | def add_first_node(self, new_node): 62 | new_node.next = self.head.next 63 | new_node.prev = self.head 64 | self.head.next.prev = new_node 65 | self.head.next = new_node 66 | self.size += 1 67 | 68 | def remove_node(self, new_node): 69 | if self.size == 0: 70 | raise Exception("trying to remove a node from empty list") 71 | new_node.next.prev = new_node.prev 72 | new_node.prev.next = new_node.next 73 | self.size -= 1 74 | 75 | class LinkedListNode: 76 | def __init__(self, item): 77 | self.item = item 78 | self.next = None 79 | self.prev = None 80 | 81 | class LinkedListIter: 82 | def __init__(self, list): 83 | self.list = list 84 | self.pos = list.head.next 85 | 86 | def next(self): 87 | if self.pos == self.list.head: 88 | raise StopIteration 89 | else: 90 | item = self.pos.item 91 | self.pos = self.pos.next 92 | return item -------------------------------------------------------------------------------- /clustering_scripts/linked_list.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/linked_list.pyc -------------------------------------------------------------------------------- /clustering_scripts/main2.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Mar 27, 2016 3 | 4 | @author: Alex 5 | ''' 6 | 7 | import click 8 | from geometry import Point 9 | import json 10 | from coordination import run_traclus 11 | import os 12 | 13 | # ============================================================================= 14 | # @click.command() 15 | # @click.option( 16 | # '--input-file', '-i', 17 | # help='Input File. Should contain Trajectories and Traclus Parameters.' \ 18 | # 'See integ_tests/raw_campus_trajectories.txt for an example.', 19 | # required=True) 20 | # @click.option( 21 | # '--output-file', '-o', 22 | # help='Output File. Will contain a list of the representative trajectories as Json.', 23 | # required=True) 24 | # @click.option( 25 | # '--partitioned-trajectories-output-file-name', '-p', 26 | # help='Optional file to dump the output from the partitioning stage to.') 27 | # @click.option( 28 | # '--clusters-output-file-name', '-c', 29 | # help='Optional file to dump the clusters with their line segments to.') 30 | # ============================================================================= 31 | def doIt(input_file, 32 | output_file, 33 | partitioned_trajectories_output_file_name=None, 34 | clusters_output_file_name=None): 35 | result = parse_input_and_run_traclus(input_file, 36 | partitioned_trajectories_output_file_name, 37 | clusters_output_file_name) 38 | 39 | dict_result = map(lambda traj: map(lambda pt: pt.as_dict(), traj), result) 40 | 41 | with open(get_correct_path_to_file(output_file), 'w') as output_stream: 42 | output_stream.write(json.dumps(dict_result)) 43 | 44 | def parse_input_and_run_traclus(input_file, 45 | partitioned_trajectories_output_file_name=None, 46 | clusters_output_file_name=None): 47 | parsed_input = None 48 | with open(get_correct_path_to_file(input_file), 'r') as input_stream: 49 | parsed_input = json.loads(input_stream.read()) 50 | 51 | for required_param in ['trajectories', 52 | 'epsilon', 53 | 'min_neighbors', 54 | 'min_num_trajectories_in_cluster', 55 | 'min_vertical_lines', 56 | 'min_prev_dist']: 57 | assert parsed_input[required_param], "missing param: " + str(required_param) 58 | 59 | trajs = map(lambda traj: map(lambda pt: Point(**pt), traj), parsed_input['trajectories']) 60 | 61 | partitioned_traj_hook = \ 62 | get_dump_partitioned_trajectories_hook(partitioned_trajectories_output_file_name) 63 | 64 | clusters_hook = get_dump_clusters_hook(clusters_output_file_name) 65 | 66 | 67 | return run_traclus(point_iterable_list=trajs, 68 | epsilon=parsed_input['epsilon'], 69 | min_neighbors=parsed_input['min_neighbors'], 70 | min_num_trajectories_in_cluster=parsed_input['min_num_trajectories_in_cluster'], 71 | min_vertical_lines=parsed_input['min_vertical_lines'], 72 | min_prev_dist=parsed_input['min_prev_dist'], 73 | partitioned_points_hook=partitioned_traj_hook, 74 | clusters_hook=clusters_hook) 75 | 76 | def get_dump_partitioned_trajectories_hook(file_name): 77 | if not file_name: 78 | return None 79 | 80 | def func(partitioned_stage_output): 81 | dict_trajs = map(lambda traj_line_seg: traj_line_seg.line_segment.as_dict(), 82 | partitioned_stage_output) 83 | with open(get_correct_path_to_file(file_name), 'w') as output: 84 | output.write(json.dumps(dict_trajs)) 85 | return func 86 | 87 | def get_dump_clusters_hook(file_name): 88 | if not file_name: 89 | return None 90 | 91 | def func(clusters): 92 | all_cluster_line_segs = [] 93 | for clust in clusters: 94 | line_segs = clust.get_trajectory_line_segments() 95 | dict_output = map(lambda traj_line_seg: traj_line_seg.line_segment.as_dict(), 96 | line_segs) 97 | all_cluster_line_segs.append(dict_output) 98 | 99 | with open(get_correct_path_to_file(file_name), 'w') as output: 100 | output.write(json.dumps(all_cluster_line_segs)) 101 | return func 102 | 103 | def get_correct_path_to_file(file_name): 104 | return file_name 105 | 106 | if __name__ == '__main2__': 107 | doIt() -------------------------------------------------------------------------------- /clustering_scripts/main2.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/main2.pyc -------------------------------------------------------------------------------- /clustering_scripts/mutable_float.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Jan 8, 2016 3 | 4 | @author: Alex 5 | ''' 6 | 7 | class MutableFloat(object): 8 | def __init__(self, val): 9 | self.set_val(val) 10 | 11 | def set_val(self, val): 12 | if val == None: 13 | raise Exception("trying to set val to None") 14 | self.val = val 15 | 16 | def increment(self, other): 17 | self.val += other 18 | 19 | def multiply(self, other): 20 | self.val *= other 21 | 22 | def get_val(self): 23 | return self.val 24 | 25 | class MutableNumber(MutableFloat): 26 | def __init__(self, val): 27 | MutableFloat.__init__(self, val) 28 | -------------------------------------------------------------------------------- /clustering_scripts/mutable_float.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/mutable_float.pyc -------------------------------------------------------------------------------- /clustering_scripts/parallel_processing.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Aug 22 00:06:30 2018 4 | 5 | @author: alari 6 | """ 7 | from multiprocessing import Process 8 | from multiprocessing import Pool, cpu_count 9 | import multiprocessing as mp 10 | import os 11 | import auxiliary as a 12 | import json 13 | import codecs 14 | from main2 import doIt 15 | import pickle 16 | import numpy as np 17 | 18 | def info(title): 19 | print(title) 20 | print('module name:', __name__) 21 | print('parent process:', os.getppid()) 22 | print('process id:', os.getpid()) 23 | 24 | def writeDataList(data_list_json): 25 | data_json_100 = data_list_json[0:100] 26 | with open('data_list_json_100.txt', 'wb') as f: 27 | pickle.dump(data_json_100, f,protocol=2) 28 | return(data_json_100) 29 | 30 | def readDataList(jsonfile): 31 | with open(jsonfile, 'rb') as f: 32 | data_list_json = pickle.load(f) 33 | return(data_list_json) 34 | 35 | def saveFileInfo(ifexists,data_list_json,dataname,dumpneeded): 36 | if(ifexists==0): 37 | with open(dataname, 'rb') as f: 38 | data_list_json = pickle.load(f) 39 | 40 | settings = a.produceConfigs() # all clustering settings to test out 41 | maxidx = 20 42 | filenames =[None]*maxidx*len(settings) 43 | outnames =[None]*maxidx*len(settings) 44 | trajectory_list =[None]*maxidx*len(settings) 45 | cluster_list =[None]*maxidx*len(settings) 46 | 47 | multiplier = np.floor(len(data_list_json)/maxidx) 48 | for idx in range(0,maxidx): # chuncking into files for testing 49 | # ,"trajectories":cc} 50 | sub_prepared = data_list_json[int(idx*multiplier):int((idx+1)*multiplier)] # subset the data 51 | 52 | for setidx,se in enumerate(settings): 53 | se['trajectories']=sub_prepared # add the file to the setting dictionary 54 | param_and_traj = se 55 | # filenames for clustering 56 | filename = 'input'+str(idx)+'setting'+str(setidx)+'.txt' 57 | filenames[idx] = filename 58 | outnames[idx] = 'out'+str(idx)+'setting'+str(setidx)+'.txt' 59 | trajectory_list[idx] = 'trajectories'+str(idx)+'setting'+str(setidx)+'.txt' 60 | cluster_list[idx] = 'clusters'+str(idx)+'setting'+str(setidx)+'.txt' 61 | 62 | fullpath = 'testdata/'+ filename 63 | if (dumpneeded ==1): 64 | with open(fullpath, 'wb') as f: 65 | json.dump(param_and_traj, codecs.getwriter('utf-8')(f), ensure_ascii=False) 66 | return(filenames,outnames,trajectory_list,cluster_list) 67 | 68 | def doClustering(filenames): 69 | 70 | # info('function doClustering') 71 | problemidx = [None]*20 72 | for idx in range(0,len(filenames)): 73 | # python main.py -i in[idx] -o out[idx] 74 | try: # -m timeit 75 | doIt(filenames[idx],outnames[idx],trajectory_list[idx],cluster_list[idx]) 76 | except: 77 | problemidx[idx]=idx 78 | continue 79 | idx+=1 80 | return(problemidx) 81 | 82 | if __name__ == "__main__": 83 | #doClustering() 84 | data_json_100 = readDataList('data_list_json_100.txt') 85 | filenames,outnames,trajectory_list,cluster_list = saveFileInfo(1,data_json_100,'test',0) # file list 86 | 87 | pool = Pool(processes=int(4)) 88 | problemidx = pool.map(doClustering, filenames,chunksize=5) 89 | print(problemidx) 90 | # ============================================================================= 91 | # with Pool(4) as p: 92 | # p.map(doClustering) 93 | # ============================================================================= 94 | # ============================================================================= 95 | # p = Process(target=doClustering) # , args=('filenames','outnames') 96 | # p.start() 97 | # p.join() 98 | # ============================================================================= 99 | 100 | 101 | 102 | # ============================================================================= 103 | # python main.py -i filenames[idx] -o outnames[idx] 104 | # 105 | # python main.py -i "input2.txt" -o "out2.txt" 106 | # ============================================================================= 107 | # -m timeit 108 | -------------------------------------------------------------------------------- /clustering_scripts/parallel_processing.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/parallel_processing.pyc -------------------------------------------------------------------------------- /clustering_scripts/parameter_estimation.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Feb 11, 2016 3 | 4 | @author: Alex 5 | ''' 6 | import math 7 | from simanneal import Annealer 8 | import copy 9 | import random 10 | from mutable_float import MutableFloat 11 | from coordination import the_whole_enchilada 12 | 13 | def find_entropy(all_line_segs): 14 | def _get_neighbors(seg): 15 | return seg.get_num_neighbors() + 1 16 | 17 | sum_total_neighborhood_size = reduce(lambda x, y: x + y, \ 18 | map(_get_neighbors, all_line_segs)) 19 | 20 | def _probability_func(line_seg, sum_total_neighborhood_size): 21 | return _get_neighbors(line_seg) * 1.0 / sum_total_neighborhood_size 22 | 23 | def _single_entry_entropy(line_seg): 24 | prob_value = _probability_func(line_seg, sum_total_neighborhood_size) 25 | return prob_value * math.log(prob_value, 2) 26 | 27 | return -1 * reduce(lambda x, y: x + y, map(_single_entry_entropy, all_line_segs)) 28 | 29 | class TraclusSimulatedAnnealingState: 30 | def __init__(self, input_trajectories, epsilon): 31 | if epsilon < 0.0: 32 | raise ValueError("can't have a negative epsilon") 33 | 34 | Annealer.copy_strategy = 'method' 35 | self.input_trajectories = input_trajectories 36 | self.epsilon = epsilon 37 | self.entropy = None 38 | 39 | def get_epsilon(self): 40 | return self.epsilon 41 | 42 | def get_input_trajectories(self): 43 | return self.input_trajectories 44 | 45 | def get_entropy(self): 46 | if self.entropy == None: 47 | raise Exception() 48 | return self.entropy 49 | 50 | def compute_entropy(self, clusters): 51 | all_line_segs = [] 52 | for single_cluster in clusters: 53 | all_line_segs.extend(single_cluster.get_trajectory_line_segments()) 54 | self.entropy = find_entropy(all_line_segs=all_line_segs) 55 | 56 | def copy(self): 57 | return TraclusSimulatedAnnealingState(self.input_trajectories, self.epsilon) 58 | 59 | class TraclusSimulatedAnnealer(Annealer): 60 | def __init__(self, initial_state, max_epsilon_step_change): 61 | self.max_epsilon_step_change = max_epsilon_step_change 62 | Annealer.__init__(self, initial_state=initial_state) 63 | 64 | def move(self): 65 | new_epsilon = max(0.0, self.state.get_epsilon() + \ 66 | random.uniform(-self.max_epsilon_step_change, self.max_epsilon_step_change)) 67 | self.state = TraclusSimulatedAnnealingState(self.state.input_trajectories, \ 68 | new_epsilon) 69 | 70 | def energy(self): 71 | the_whole_enchilada(point_iterable_list=self.state.get_input_trajectories(), \ 72 | epsilon=self.state.get_epsilon(), \ 73 | min_neighbors=0, \ 74 | min_num_trajectories_in_cluster=1, \ 75 | min_vertical_lines=100, \ 76 | min_prev_dist=100, \ 77 | clusters_hook=self.state.compute_entropy) 78 | return self.state.get_entropy() 79 | 80 | 81 | -------------------------------------------------------------------------------- /clustering_scripts/processed_trajectory_connecting.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Feb 19, 2016 3 | 4 | @author: Alex 5 | ''' 6 | import math 7 | from geometry import LineSegment 8 | import collections 9 | from heapq import heappush 10 | from heapq import heappop 11 | 12 | class FilteredTrajectory: 13 | def __init__(self, trajectory, id): 14 | self.id = id 15 | self.trajectory = trajectory 16 | 17 | class FilteredTrajectoryConnection: 18 | def __init__(self, start_pt, end_pt, start_traj_id, end_traj_id): 19 | self.start_pt = start_pt 20 | self.end_pt = end_pt 21 | self.start_traj_id = start_traj_id 22 | self.end_traj_id = end_traj_id 23 | 24 | class FilteredPointGraphNode: 25 | def __init__(self, point, index, original_trajectory_id): 26 | self.point = point 27 | self.index = index 28 | self.original_trajectory_id = original_trajectory_id 29 | self.neighbor_indices = set() 30 | self.graph_component_id = None 31 | 32 | def add_neighbor(self, other_node): 33 | if other_node != self: 34 | self.neighbor_indices.add(other_node.index) 35 | other_node.neighbor_indices.add(self.index) 36 | 37 | def get_neighbor_indices(self): 38 | return self.neighbor_indices 39 | 40 | def get_original_trajectory_id(self): 41 | return self.original_trajectory_id 42 | 43 | def build_point_graph(filtered_trajectories, add_other_neigbors_func=None): 44 | cur_pt_index = 0 45 | pt_graph = [] 46 | 47 | for traj in filtered_trajectories: 48 | prev_pt_graph_node = None 49 | for pt in traj.trajectory: 50 | pt_graph.append(FilteredPointGraphNode(pt, cur_pt_index, traj.id)) 51 | if prev_pt_graph_node != None: 52 | pt_graph[cur_pt_index].add_neighbor(prev_pt_graph_node) 53 | if add_other_neigbors_func != None: 54 | add_other_neigbors_func(node_index=cur_pt_index, pt_graph=pt_graph) 55 | prev_pt_graph_node = pt_graph[cur_pt_index] 56 | cur_pt_index += 1 57 | 58 | return pt_graph 59 | 60 | def compute_graph_component_ids(pt_graph, find_other_neighbors_func): 61 | next_component_id = 0 62 | for pt_node in pt_graph: 63 | if pt_node.graph_component_id == None: 64 | mark_all_in_same_component(pt_node, next_component_id, \ 65 | pt_graph, find_other_neighbors_func) 66 | next_component_id += 1 67 | 68 | def mark_all_in_same_component(pt_node, component_id, pt_graph, \ 69 | find_other_neighbors_func): 70 | node_queue = collections.deque() 71 | node_queue.append(pt_node) 72 | 73 | while len(node_queue) > 0: 74 | temp_node = node_queue.popleft() 75 | 76 | def queue_adder_func(neighbor_index): 77 | if pt_graph[neighbor_index].graph_component_id == None: 78 | pt_graph[neighbor_index].graph_component_id = component_id 79 | node_queue.append(pt_graph[neighbor_index]) 80 | elif pt_graph[neighbor_index].graph_component_id != component_id: 81 | raise Exception("graph edges should not be directional") 82 | 83 | for neighbor_index in temp_node.get_neighbor_indices(): 84 | queue_adder_func(neighbor_index) 85 | for neighbor_index in find_other_neighbors_func(pt_node=temp_node, \ 86 | pt_graph=pt_graph): 87 | queue_adder_func(neighbor_index) 88 | 89 | def get_find_other_nearby_neighbors_func(max_distance): 90 | def _func(node_index, pt_graph): 91 | for temp_node in pt_graph: 92 | if temp_node.point.distance_to(pt_graph[node_index].point) <= max_distance: 93 | pt_graph[node_index].add_neighbor(temp_node) 94 | return _func 95 | 96 | def compute_shortest_path(start_node_index, end_node_index, pt_graph, \ 97 | pt_pt_distance_func): 98 | priority_queue = [] 99 | distances_from_start = [None] * len(pt_graph) 100 | distances_from_start[start_node_index] = 0.0 101 | back_edges = [None] * len(pt_graph) 102 | heappush(priority_queue, (0.0, start_node_index)) 103 | 104 | end_node_reached = False 105 | while len(priority_queue) > 0: 106 | temp_node_index = heappop(priority_queue)[1] 107 | if temp_node_index == end_node_index: 108 | end_node_reached = True 109 | break 110 | for neighbor_index in pt_graph[temp_node_index].get_neighbor_indices(): 111 | temp_dist = pt_pt_distance_func(temp_node_index, neighbor_index, pt_graph) + \ 112 | distances_from_start[temp_node_index] 113 | if distances_from_start[neighbor_index] == None or \ 114 | temp_dist < distances_from_start[neighbor_index]: 115 | distances_from_start[neighbor_index] = temp_dist 116 | heappush(priority_queue, (temp_dist, neighbor_index)) 117 | back_edges[neighbor_index] = temp_node_index 118 | 119 | if not end_node_reached: 120 | return None, None 121 | 122 | cur_index = end_node_index 123 | shortest_path = [end_node_index] 124 | while cur_index != start_node_index: 125 | cur_index = back_edges[cur_index] 126 | shortest_path.append(cur_index) 127 | shortest_path.reverse() 128 | 129 | return shortest_path, distances_from_start[end_node_index] 130 | 131 | def find_nearest_points_to_point(point, pt_graph, distance_func, max_dist): 132 | nearby_points = [] 133 | for pt_node in pt_graph: 134 | if distance_func(point, pt_node.point) < max_dist: 135 | nearby_points.append(pt_node.index) 136 | return nearby_points 137 | 138 | def find_all_possible_connections(start_pt, end_pt, \ 139 | pt_graph, distance_func, max_dist_to_existing_pt): 140 | near_start_indices = find_nearest_points_to_point(start_pt, pt_graph, \ 141 | distance_func, \ 142 | max_dist_to_existing_pt) 143 | near_end_indices = find_nearest_points_to_point(end_pt, pt_graph, \ 144 | distance_func, \ 145 | max_dist_to_existing_pt) 146 | 147 | possible_connections = [] 148 | for start_index in near_start_indices: 149 | for end_index in near_end_indices: 150 | if pt_graph[end_index].graph_component_id == \ 151 | pt_graph[start_index].graph_component_id: 152 | possible_connections.append((start_index, end_index)) 153 | return possible_connections 154 | 155 | def find_shortest_connection(start_pt, end_pt, pt_graph, max_dist_to_existing_pt): 156 | def pt_pt_distance_func_for_finding_nearby_points(pt_a, pt_b): 157 | return pt_a.distance_to(pt_b) 158 | 159 | def pt_pt_distance_func_for_shortest_path_finding(a_index, b_index, pt_graph): 160 | pt_a = pt_graph[a_index].point 161 | pt_b = pt_graph[b_index].point 162 | return math.pow(pt_a.x - pt_b.x, 2) + math.pow(pt_a.y - pt_b.y, 2) 163 | 164 | possible_connections = find_all_possible_connections(start_pt=start_pt, end_pt=end_pt, \ 165 | pt_graph=pt_graph, \ 166 | distance_func=pt_pt_distance_func_for_finding_nearby_points, 167 | max_dist_to_existing_pt=max_dist_to_existing_pt) 168 | if len(possible_connections) == 0: 169 | return None, None 170 | 171 | shortest_connection = None 172 | for connection in possible_connections: 173 | temp_path, temp_dist = \ 174 | compute_shortest_path(start_node_index=connection[0], \ 175 | end_node_index=connection[1], \ 176 | pt_graph=pt_graph, \ 177 | pt_pt_distance_func=pt_pt_distance_func_for_shortest_path_finding) 178 | if shortest_connection == None or temp_dist < shortest_connection[1]: 179 | shortest_connection = (temp_path, temp_dist) 180 | 181 | return map(lambda i: pt_graph[i].point, shortest_connection[0]), \ 182 | shortest_connection[1] 183 | 184 | def find_nearest_points_to_all_trajectory_endpoints(filtered_trajectories): 185 | nearest_point_line_segments = [] 186 | 187 | for traj in filtered_trajectories: 188 | nearest_point_line_segments.extend(get_nearest_point_line_segs(traj, \ 189 | filtered_trajectories)) 190 | 191 | return nearest_point_line_segments 192 | 193 | def get_nearest_point_line_segs(traj, all_trajectories): 194 | def get_all_points_of_trajectory(trajectory): 195 | point_list = map(lambda x: x.start, \ 196 | map(lambda y: y.trajectory, all_trajectories)) 197 | point_list.append(trajectory.end) 198 | return point_list 199 | 200 | def get_nearest_point_in_line_segs_to_point(point): 201 | min_dist_line_seg = None 202 | min_square_dist = None 203 | 204 | for other_traj in all_trajectories: 205 | if other_traj.id != traj.id: 206 | for other_pt in get_all_points_of_trajectory(other_traj): 207 | temp_square_dist = math.pow(other_pt.x - point.x, 2) + \ 208 | math.pow(other_pt.y - point.y, 2) 209 | if min_square_dist == None or temp_square_dist < min_square_dist: 210 | min_square_dist = temp_square_dist 211 | min_dist_line_seg = LineSegment(point, other_pt) 212 | return min_dist_line_seg 213 | 214 | nearest_to_start = \ 215 | get_nearest_point_in_line_segs_to_point(traj.trajectory[0].start) 216 | nearest_to_end = \ 217 | get_nearest_point_in_line_segs_to_point(traj.trajectory[len(traj) - 1].end) 218 | 219 | return map(lambda x: FilteredTrajectoryConnection(x), \ 220 | [nearest_to_start, nearest_to_end]) 221 | -------------------------------------------------------------------------------- /clustering_scripts/representative_line_finding.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Jan 6, 2016 3 | 4 | @author: Alex 5 | ''' 6 | from geometry import Vec2, LineSegment 7 | 8 | def get_average_vector(line_segment_list): 9 | if len(line_segment_list) < 1: 10 | raise Exception("tried to get average vector of an empty line segment list") 11 | 12 | total_x = 0.0 13 | total_y = 0.0 14 | 15 | for segment in line_segment_list: 16 | if segment.end.x < segment.start.x: 17 | total_x += segment.start.x - segment.end.x 18 | else: 19 | total_x += segment.end.x - segment.start.x 20 | total_y += segment.end.y - segment.start.y 21 | 22 | return Vec2(total_x, total_y) 23 | 24 | def get_rotated_line_segment(line_segment, angle_in_degrees): 25 | if angle_in_degrees > 90.0 or angle_in_degrees < -90.0: 26 | raise Exception("trying to rotate line segment by an illegal number of degrees: " + str(angle_in_degrees)) 27 | 28 | new_start = line_segment.start.rotated(angle_in_degrees) 29 | new_end = line_segment.end.rotated(angle_in_degrees) 30 | 31 | return LineSegment.from_tuples((new_start.x, new_start.y), (new_end.x, new_end.y)) -------------------------------------------------------------------------------- /clustering_scripts/representative_line_finding.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/representative_line_finding.pyc -------------------------------------------------------------------------------- /clustering_scripts/representative_trajectory_average_inputs.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Jan 1, 2016 3 | 4 | @author: Alex 5 | ''' 6 | from linked_list import LinkedList 7 | from linked_list import LinkedListNode 8 | from operator import attrgetter 9 | 10 | DECIMAL_MAX_DIFF_FOR_EQUALITY = 0.0000001 11 | 12 | class TrajectoryLineSegmentEndpoint: 13 | def __init__(self, horizontal_position, line_segment, line_segment_id, list_node): 14 | self.horizontal_position = horizontal_position 15 | self.line_segment = line_segment 16 | self.line_segment_id = line_segment_id 17 | self.list_node = list_node 18 | 19 | def get_sorted_line_seg_endpoints(trajectory_line_segments): 20 | line_segment_endpoints = [] 21 | cur_id = 0 22 | 23 | for traj_segment in trajectory_line_segments: 24 | list_node = LinkedListNode(traj_segment) 25 | line_segment_endpoints.append(TrajectoryLineSegmentEndpoint(traj_segment.line_segment.start.x, \ 26 | traj_segment, cur_id, list_node)) 27 | line_segment_endpoints.append(TrajectoryLineSegmentEndpoint(traj_segment.line_segment.end.x, \ 28 | traj_segment, cur_id, list_node)) 29 | cur_id += 1 30 | 31 | return sorted(line_segment_endpoints, key=attrgetter('horizontal_position')) 32 | 33 | def numbers_within(a, b, max_diff): 34 | return abs(a - b) <= max_diff 35 | 36 | 37 | def possibly_append_to_active_list(active_list, out, prev_pos, min_prev_dist, min_lines): 38 | if (len(out) == 0 or prev_pos - out[len(out) - 1]['horizontal_position'] >= min_prev_dist) and len(active_list) >= min_lines: 39 | temp = [] 40 | for line_seg in active_list: 41 | temp.append(line_seg) 42 | out.append({'lines': temp, 'horizontal_position': prev_pos}) 43 | 44 | def line_segments_were_adjacent(trajectory_seg_a, trajectory_seg_b): 45 | return trajectory_seg_a.trajectory_id == trajectory_seg_b.trajectory_id and \ 46 | abs(trajectory_seg_a.position_in_trajectory - trajectory_seg_b.position_in_trajectory) == 1 47 | 48 | def same_trajectory_line_segment_connects(seg, line_seg_endpoint_list): 49 | for other in line_seg_endpoint_list: 50 | if line_segments_were_adjacent(seg, other.line_segment): 51 | return True 52 | return False 53 | 54 | def remove_duplicate_points_from_adjacent_lines_of_same_trajectories(active_list, insert_list, delete_list): 55 | insertion_line_seg_set = set() 56 | for endpoint in insert_list: 57 | insertion_line_seg_set.add(endpoint.line_segment) 58 | 59 | deletion_keeper_list = [] 60 | for endpoint in delete_list: 61 | if (not endpoint.line_segment in insertion_line_seg_set) and \ 62 | same_trajectory_line_segment_connects(endpoint.line_segment, insert_list): 63 | active_list.remove_node(endpoint.list_node) 64 | else: 65 | deletion_keeper_list.append(endpoint) 66 | 67 | delete_list[:] = deletion_keeper_list 68 | 69 | def get_representative_trajectory_average_inputs(trajectory_line_segments, min_lines, min_prev_dist): 70 | cur_active = [False] * len(trajectory_line_segments) 71 | active_list = LinkedList() 72 | insert_list = [] 73 | delete_list = [] 74 | out = [] 75 | 76 | line_segment_endpoints = get_sorted_line_seg_endpoints(trajectory_line_segments) 77 | 78 | i = 0 79 | while i < len(line_segment_endpoints): 80 | insert_list[:] = [] 81 | delete_list[:] = [] 82 | prev_pos = line_segment_endpoints[i].horizontal_position 83 | 84 | while i < len(line_segment_endpoints) and numbers_within(line_segment_endpoints[i].horizontal_position, \ 85 | prev_pos, DECIMAL_MAX_DIFF_FOR_EQUALITY): 86 | if not cur_active[line_segment_endpoints[i].line_segment_id]: 87 | insert_list.append(line_segment_endpoints[i]) 88 | cur_active[line_segment_endpoints[i].line_segment_id] = True 89 | elif cur_active[line_segment_endpoints[i].line_segment_id]: 90 | delete_list.append(line_segment_endpoints[i]) 91 | cur_active[line_segment_endpoints[i].line_segment_id] = False 92 | i += 1 93 | 94 | for line_seg_endpoint in insert_list: 95 | active_list.add_last_node(line_seg_endpoint.list_node) 96 | possibly_append_to_active_list(active_list, out, prev_pos, min_prev_dist, min_lines) 97 | for line_seg in delete_list: 98 | active_list.remove_node(line_seg.list_node) 99 | 100 | return out 101 | -------------------------------------------------------------------------------- /clustering_scripts/representative_trajectory_average_inputs.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/representative_trajectory_average_inputs.pyc -------------------------------------------------------------------------------- /clustering_scripts/simulated_annealing.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Feb 13, 2016 3 | 4 | @author: Alex 5 | ''' 6 | ''' 7 | Created on Feb 13, 2016 8 | 9 | @author: Alex 10 | ''' 11 | import math 12 | from random import random 13 | 14 | class SimulatedAnnealingState: 15 | def __init__(self): 16 | pass 17 | 18 | def get_energy(self): 19 | raise NotImplementedError() 20 | 21 | def get_random_neighbor(self): 22 | raise NotImplementedError() 23 | 24 | def anneal_step(steps_per_temp, cur_step, \ 25 | max_temp, min_temp, prev_state, new_state, \ 26 | find_next_state_func): 27 | t_factor = -1 * math.log(max_temp / min_temp * 1.0) 28 | temp = max_temp * math.exp(t_factor * cur_step / steps_per_temp) 29 | energy_diff = new_state.get_energy() - prev_state.get_energy() 30 | rand_val = random() 31 | print rand_val 32 | print math.exp(-energy_diff / temp) 33 | print "----" 34 | 35 | if energy_diff > 0.0 and math.exp(-energy_diff / temp) < rand_val: 36 | cur_state = prev_state 37 | else: 38 | cur_state = new_state 39 | 40 | return find_next_state_func(steps_per_temp, cur_step + 1, \ 41 | max_temp, min_temp, cur_state) 42 | 43 | -------------------------------------------------------------------------------- /clustering_scripts/traclus_dbscan.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Dec 31, 2015 3 | 4 | @author: Alex 5 | ''' 6 | from distance_functions import perpendicular_distance, angular_distance, parrallel_distance 7 | from generic_dbscan import Cluster, ClusterCandidate, ClusterFactory, ClusterCandidateIndex 8 | 9 | class TrajectoryLineSegmentFactory(): 10 | def __init__(self): 11 | self.next_traj_line_seg_id = 0 12 | 13 | def new_trajectory_line_seg(self, line_segment, trajectory_id): 14 | if line_segment == None or trajectory_id == None or trajectory_id < 0: 15 | raise Exception("invalid arguments") 16 | next_id = self.next_traj_line_seg_id 17 | self.next_traj_line_seg_id += 1 18 | return TrajectoryLineSegment(line_segment=line_segment, 19 | trajectory_id=trajectory_id, 20 | id=next_id) 21 | 22 | class TrajectoryLineSegment(ClusterCandidate): 23 | def __init__(self, line_segment, trajectory_id, position_in_trajectory=None, 24 | id=None): 25 | ClusterCandidate.__init__(self) 26 | if line_segment == None or trajectory_id < 0: 27 | raise Exception 28 | 29 | self.line_segment = line_segment 30 | self.trajectory_id = trajectory_id 31 | self.position_in_trajectory = position_in_trajectory 32 | self.num_neighbors = -1 33 | self.id = id 34 | 35 | def get_num_neighbors(self): 36 | if self.num_neighbors == -1: 37 | raise Exception("haven't counted num neighbors yet") 38 | return self.num_neighbors 39 | 40 | def set_num_neighbors(self, num_neighbors): 41 | if self.num_neighbors != -1 and self.num_neighbors != num_neighbors: 42 | raise Exception("neighbors count should never be changing") 43 | self.num_neighbors = num_neighbors 44 | 45 | def distance_to_candidate(self, other_candidate): 46 | if other_candidate == None or other_candidate.line_segment == None or self.line_segment == None: 47 | raise Exception() 48 | return perpendicular_distance(self.line_segment, other_candidate.line_segment) + \ 49 | angular_distance(self.line_segment, other_candidate.line_segment) + \ 50 | parrallel_distance(self.line_segment, other_candidate.line_segment) 51 | 52 | class TrajectoryLineSegmentCandidateIndex(ClusterCandidateIndex): 53 | def __init__(self, candidates, epsilon): 54 | ClusterCandidateIndex.__init__(self, candidates, epsilon) 55 | 56 | def find_neighbors_of(self, cluster_candidate): 57 | neighbors = ClusterCandidateIndex.find_neighbors_of(self, cluster_candidate) 58 | cluster_candidate.set_num_neighbors(len(neighbors)) 59 | return neighbors 60 | 61 | class RtreeTrajectoryLineSegmentCandidateIndex(ClusterCandidateIndex): 62 | def __init__(self, candidates, epsilon): 63 | ClusterCandidateIndex.__init__(self, candidates, epsilon) 64 | self.candidates_by_ids = [None] * len(candidates) 65 | self.idx = index.Index() 66 | for cluster_candidate in candidates: 67 | if self.candidates_by_ids[cluster_candidate.id] != None: 68 | raise Exception("should have all unique ids") 69 | 70 | self.candidates_by_ids[cluster_candidate.id] = cluster_candidate 71 | line_seg = cluster_candidate.line_segment 72 | bounding_box = self.get_bounding_box_of_line_segment(line_seg) 73 | self.idx.insert(cluster_candidate.id, bounding_box, cluster_candidate) 74 | 75 | def find_neighbors_of(self, cluster_candidate): 76 | bounding_box = \ 77 | self.get_bounding_box_of_line_segment(cluster_candidate.line_segment) 78 | possible_neighbor_ids = [n for n in self.idx.intersection(bounding_box)] 79 | actual_neighbors = [] 80 | 81 | for id in possible_neighbor_ids: 82 | if id == None: 83 | raise Exception("ids on these need to be set") 84 | if id != cluster_candidate.id and \ 85 | cluster_candidate.distance_to_candidate(self.candidates_by_ids[id]) <= \ 86 | self.epsilon: 87 | actual_neighbors.append(self.candidates_by_ids[id]) 88 | 89 | cluster_candidate.set_num_neighbors(len(actual_neighbors)) 90 | return actual_neighbors 91 | 92 | def get_bounding_box_of_line_segment(self, line_seg): 93 | btm = min(line_seg.start.y, line_seg.end.y) - self.epsilon 94 | top = max(line_seg.start.y, line_seg.end.y) + self.epsilon 95 | left = min(line_seg.start.x, line_seg.end.x) - self.epsilon 96 | right = max(line_seg.start.x, line_seg.end.x) + self.epsilon 97 | return (left, btm, right, top) 98 | 99 | class TrajectoryCluster(Cluster): 100 | def __init__(self): 101 | Cluster.__init__(self) 102 | self.trajectories = set() 103 | self.trajectory_count = 0 104 | 105 | def add_member(self, item): 106 | Cluster.add_member(self, item) 107 | if not (item.trajectory_id in self.trajectories): 108 | self.trajectory_count += 1 109 | self.trajectories.add(item.trajectory_id) 110 | 111 | def num_trajectories_contained(self): 112 | return self.trajectory_count 113 | 114 | def get_trajectory_line_segments(self): 115 | return self.members 116 | 117 | class TrajectoryClusterFactory(ClusterFactory): 118 | def new_cluster(self): 119 | return TrajectoryCluster() 120 | 121 | # Use an r tree index for line segments during dbscan if it's available, 122 | # otherwise use the pure python n squared dbscan. 123 | BestAvailableClusterCandidateIndex = None 124 | import sys, os 125 | try: 126 | from rtree import index 127 | BestAvailableClusterCandidateIndex = RtreeTrajectoryLineSegmentCandidateIndex 128 | sys.stderr.write(str(os.path.realpath(__file__)) + ": rtree import succeeded." + \ 129 | " Using an r-tree for clustering") 130 | except ImportError: 131 | BestAvailableClusterCandidateIndex = TrajectoryLineSegmentCandidateIndex 132 | sys.stderr.write(str(os.path.realpath(__file__)) + ": rtree import failed." + \ 133 | " Using plain python quadratic clustering") 134 | 135 | 136 | -------------------------------------------------------------------------------- /clustering_scripts/traclus_dbscan.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/traclus_dbscan.pyc -------------------------------------------------------------------------------- /clustering_scripts/trajectory.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Dec 29, 2015 3 | 4 | @author: Alex 5 | ''' 6 | 7 | from geometry import LineSegment, Point 8 | from argparse import ArgumentError 9 | from distance_functions import perpendicular_distance 10 | from distance_functions import angular_distance 11 | import math 12 | 13 | class Trajectory(object): 14 | ''' 15 | classdocs 16 | ''' 17 | def __init__(self, id): 18 | self.points = [] 19 | self.id = id 20 | 21 | def check_indice_args(self, start, end): 22 | if start < 0 or start > start > len(self.points) - 2: 23 | raise ArgumentError("invalid start index") 24 | elif end <= start or end > len(self.points) - 1: 25 | raise ArgumentError("invalid end index") 26 | 27 | def model_cost(self, start, end): 28 | self.check_indice_args(start, end) 29 | return math.log(self.points[start].distance_to(self.points[end]), 2) 30 | 31 | def encoding_cost(self, start, end): 32 | self.check_indice_args(start, end) 33 | approximation_line = LineSegment(self.points[start], self.points[end]) 34 | 35 | total_perp = 0.0 36 | total_angular = 0.0 37 | for i in xrange(start, end): 38 | line_seg = LineSegment(self.points[i], self.points[i + 1]) 39 | total_perp += perpendicular_distance(approximation_line, line_seg) 40 | total_angular += angular_distance(approximation_line, line_seg) 41 | 42 | if total_perp < 1.0: 43 | total_perp = 1.0 44 | if total_angular < 1.0: 45 | total_angular = 1.0 46 | 47 | return math.log(total_perp, 2) + math.log(total_angular, 2) 48 | 49 | def get_partition(self): 50 | return range(0, len(self.points)) 51 | 52 | def __repr__(self): 53 | return str(self.points) 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /clustering_scripts/trajectory_partitioning.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on Jan 7, 2016 3 | 4 | @author: Alex 5 | ''' 6 | from geometry import LineSegment 7 | from distance_functions import perpendicular_distance, \ 8 | angular_distance 9 | import math 10 | from mutable_float import MutableFloat 11 | from representative_trajectory_average_inputs import DECIMAL_MAX_DIFF_FOR_EQUALITY 12 | 13 | """Added to offsets before taking the log of them. Helps to avoid 14 | taking the log of 0.0""" 15 | DISTANCE_OFFSET = 0.0000000001 16 | 17 | def call_partition_trajectory(trajectory_point_list): 18 | if len(trajectory_point_list) < 2: 19 | raise ValueError 20 | 21 | def encoding_cost_func(trajectory_line_segs, low, high, partition_line): 22 | return encoding_cost(trajectory_line_segs, low, high, 23 | partition_line=partition_line, 24 | angular_dist_func=angular_distance, 25 | perpendicular_dist_func=perpendicular_distance) 26 | 27 | def partition_cost_func(trajectory_line_segs, low, high): 28 | return partition_cost(trajectory_line_segs, low, high, 29 | model_cost_func=model_cost, 30 | encoding_cost_func=encoding_cost_func) 31 | 32 | trajectory_line_segs = map(lambda i: LineSegment(trajectory_point_list[i], 33 | trajectory_point_list[i + 1]), 34 | range(0, len(trajectory_point_list) - 1)) 35 | 36 | return partition_trajectory(trajectory_line_segs=trajectory_line_segs, 37 | partition_cost_func=partition_cost_func, 38 | no_partition_cost_func=no_partition_cost) 39 | 40 | def partition_trajectory(trajectory_line_segs, 41 | partition_cost_func, 42 | no_partition_cost_func): 43 | if len(trajectory_line_segs) < 1: 44 | raise ValueError 45 | low = 0 46 | partition_points = [0] 47 | last_pt = trajectory_line_segs[len(trajectory_line_segs) - 1].end 48 | trajectory_line_segs.append(LineSegment(last_pt, last_pt)) 49 | 50 | for high in range(2, len(trajectory_line_segs)): 51 | if trajectory_line_segs[high - 2].unit_vector\ 52 | .almost_equals(trajectory_line_segs[high - 1].unit_vector): 53 | continue 54 | elif trajectory_line_segs[high].start.almost_equals(trajectory_line_segs[low].start) or \ 55 | partition_cost_func(trajectory_line_segs, low, high) > \ 56 | no_partition_cost_func(trajectory_line_segs, low, high): 57 | partition_points.append(high - 1) 58 | low = high - 1 59 | 60 | partition_points.append(len(trajectory_line_segs) - 1) 61 | return partition_points 62 | 63 | def partition_cost(trajectory_line_segs, low, high, model_cost_func, encoding_cost_func): 64 | if low >= high: 65 | raise IndexError 66 | partition_line = LineSegment(trajectory_line_segs[low].start, 67 | trajectory_line_segs[high].start) 68 | model_cost = model_cost_func(partition_line) 69 | encoding_cost = encoding_cost_func(trajectory_line_segs, low, high, partition_line) 70 | return model_cost + encoding_cost 71 | 72 | def no_partition_cost(trajectory_line_segs, low, high): 73 | if low >= high: 74 | raise IndexError 75 | total = 0.0 76 | for line_seg in trajectory_line_segs[low:high]: 77 | total += math.log(line_seg.length, 2) 78 | return total 79 | 80 | def model_cost(partition_line): 81 | return math.log(partition_line.length, 2) 82 | 83 | def encoding_cost(trajectory_line_segs, low, high, 84 | partition_line, angular_dist_func, perpendicular_dist_func): 85 | total_angular = 0.0 86 | total_perp = 0.0 87 | for line_seg in trajectory_line_segs[low:high]: 88 | total_angular += angular_dist_func(partition_line, line_seg) 89 | total_perp += perpendicular_dist_func(partition_line, line_seg) 90 | 91 | return math.log(total_angular + DISTANCE_OFFSET, 2) + \ 92 | math.log(total_perp + DISTANCE_OFFSET, 2) 93 | 94 | 95 | 96 | def get_line_segment_from_points(point_a, point_b): 97 | return LineSegment(point_a, point_b) 98 | 99 | def get_trajectory_line_segment_iterator_adapter(iterator_getter, get_line_segment_from_points_func): 100 | def _func(list, low, high, get_line_segment_from_points_func=get_line_segment_from_points_func): 101 | iterator_getter(list, low, high, get_line_segment_from_points_func) 102 | return _func 103 | 104 | def get_trajectory_line_segment_iterator(list, low, high, get_line_segment_from_points_func): 105 | if high <= low: 106 | raise Exception("high must be greater than low index") 107 | 108 | line_segs = [] 109 | cur_pos = low 110 | 111 | while cur_pos < high: 112 | line_segs.append(get_line_segment_from_points_func(list[cur_pos], list[cur_pos + 1])) 113 | cur_pos += 1 114 | 115 | return line_segs -------------------------------------------------------------------------------- /clustering_scripts/trajectory_partitioning.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/clustering_scripts/trajectory_partitioning.pyc -------------------------------------------------------------------------------- /data2/22.txt: -------------------------------------------------------------------------------- 1 | 22,2008-02-08 00:52:42,117.14372,40.18417 2 | 22,2008-02-08 00:53:00,117.1437,40.18417 3 | -------------------------------------------------------------------------------- /data2/32.txt: -------------------------------------------------------------------------------- 1 | 32,2008-02-02 13:36:45,116.41797,39.96807 2 | 32,2008-02-02 13:42:45,116.39322,39.9674 3 | 32,2008-02-02 13:48:45,116.34513,39.96635 4 | 32,2008-02-02 13:54:45,116.30237,39.95867 5 | 32,2008-02-02 14:00:59,116.30403,39.92975 6 | 32,2008-02-02 14:06:59,116.30388,39.9153 7 | 32,2008-02-02 14:13:28,116.30398,39.91002 8 | 32,2008-02-02 14:20:25,116.30443,39.92193 9 | 32,2008-02-02 14:33:18,116.31665,39.9554 10 | 32,2008-02-02 14:39:18,116.31148,39.97465 11 | 32,2008-02-02 14:45:48,116.32088,39.98418 12 | 32,2008-02-02 15:09:59,116.4118,39.96762 13 | 32,2008-02-02 15:16:33,116.45272,39.953 14 | 32,2008-02-02 15:22:33,116.47097,39.96863 15 | 32,2008-02-02 16:18:08,116.49298,39.97058 16 | 32,2008-02-02 16:24:08,116.48667,39.96323 17 | 32,2008-02-02 16:30:08,116.46335,39.97188 18 | 32,2008-02-02 16:36:08,116.44962,39.96562 19 | 32,2008-02-02 16:36:25,116.44962,39.96562 20 | 32,2008-02-02 16:39:53,116.44962,39.96562 21 | 32,2008-02-02 16:45:53,116.45553,39.94668 22 | 32,2008-02-02 16:51:53,116.4554,39.92608 23 | 32,2008-02-02 16:57:53,116.46123,39.90698 24 | 32,2008-02-02 17:03:53,116.52353,39.9078 25 | 32,2008-02-02 17:09:53,116.5282,39.91538 26 | 32,2008-02-02 17:15:53,116.53722,39.917 27 | 32,2008-02-02 17:17:06,116.53553,39.92047 28 | 32,2008-02-02 17:24:36,116.53553,39.92047 29 | 32,2008-02-02 17:30:36,116.52703,39.9156 30 | 32,2008-02-02 17:36:44,116.52078,39.91598 31 | 32,2008-02-02 17:42:44,116.51313,39.9155 32 | 32,2008-02-02 17:48:44,116.48312,39.91417 33 | 32,2008-02-02 17:54:44,116.47123,39.90753 34 | 32,2008-02-02 18:00:58,116.45715,39.90703 35 | 32,2008-02-02 18:06:58,116.45108,39.90693 36 | 32,2008-02-02 18:18:58,116.40625,39.9068 37 | 32,2008-02-02 18:24:58,116.39523,39.90647 38 | 32,2008-02-02 18:31:51,116.3686,39.9058 39 | 32,2008-02-02 18:37:51,116.35017,39.90513 40 | 32,2008-02-02 18:43:51,116.32108,39.8959 41 | 32,2008-02-02 18:49:51,116.30715,39.89538 42 | 32,2008-02-02 19:02:54,116.33162,39.8959 43 | 32,2008-02-02 19:08:54,116.33575,39.89607 44 | 32,2008-02-02 19:14:54,116.3502,39.89835 45 | 32,2008-02-02 19:21:06,116.3508,39.9026 46 | 32,2008-02-02 19:28:18,116.37147,39.90575 47 | 32,2008-02-02 19:34:18,116.37647,39.90578 48 | 32,2008-02-02 19:40:22,116.37955,39.89877 49 | 32,2008-02-02 19:46:31,116.37202,39.89855 50 | 32,2008-02-02 19:54:13,116.364,39.89833 51 | 32,2008-02-02 20:00:13,116.33875,39.89662 52 | 32,2008-02-02 20:12:26,116.31748,39.89842 53 | 32,2008-02-02 20:18:49,116.32787,39.90598 54 | 32,2008-02-02 20:24:49,116.33112,39.91705 55 | 32,2008-02-02 20:37:50,116.33785,39.92982 56 | 32,2008-02-02 20:44:43,116.32915,39.95615 57 | 32,2008-02-02 20:51:32,116.33977,39.95717 58 | 32,2008-02-02 20:57:34,116.3463,39.93942 59 | 32,2008-02-02 21:09:34,116.30378,39.93945 60 | 32,2008-02-02 21:15:34,116.29533,39.93482 61 | 32,2008-02-02 21:21:34,116.30162,39.9417 62 | 32,2008-02-02 21:24:43,116.30162,39.9417 63 | 32,2008-02-02 21:26:07,116.30162,39.9417 64 | 32,2008-02-02 21:32:34,116.33928,39.93587 65 | 32,2008-02-02 21:38:34,116.35317,39.94325 66 | 32,2008-02-02 21:45:52,116.38907,39.9389 67 | 32,2008-02-02 21:51:52,116.40583,39.93942 68 | 32,2008-02-02 21:59:16,116.41895,39.9476 69 | 32,2008-02-02 22:05:16,116.43178,39.95822 70 | 32,2008-02-02 22:11:16,116.45828,39.9571 71 | 32,2008-02-02 22:17:16,116.48363,39.94185 72 | 32,2008-02-02 22:23:49,116.47312,39.92183 73 | 32,2008-02-02 22:29:49,116.47173,39.91415 74 | 32,2008-02-02 22:36:42,116.45628,39.91253 75 | 32,2008-02-02 22:42:42,116.45503,39.89335 76 | 32,2008-02-02 22:48:42,116.42165,39.85707 77 | 32,2008-02-02 22:54:42,116.41743,39.84945 78 | 32,2008-02-02 23:00:42,116.40802,39.85567 79 | 32,2008-02-02 23:06:42,116.41268,39.8719 80 | 32,2008-02-02 23:12:42,116.40867,39.87187 81 | 32,2008-02-02 23:18:42,116.4146,39.88305 82 | 32,2008-02-02 23:24:42,116.41218,39.9027 83 | 32,2008-02-02 23:30:42,116.41133,39.92197 84 | 32,2008-02-02 23:36:42,116.42833,39.92695 85 | 32,2008-02-02 23:48:56,116.41232,39.96797 86 | 32,2008-02-02 23:54:56,116.42867,39.96802 87 | 32,2008-02-03 00:00:56,116.46173,39.95543 88 | 32,2008-02-03 00:13:04,116.49487,39.9217 89 | 32,2008-02-03 00:19:04,116.53578,39.92227 90 | 32,2008-02-03 00:25:04,116.58477,39.92408 91 | 32,2008-02-03 00:37:24,116.65428,39.93755 92 | 32,2008-02-03 00:43:24,116.63533,39.92565 93 | 32,2008-02-03 00:49:24,116.57672,39.92363 94 | 32,2008-02-03 00:55:24,116.51578,39.92265 95 | 32,2008-02-03 01:01:24,116.50293,39.95475 96 | 32,2008-02-03 01:04:01,116.49775,39.96722 97 | 32,2008-02-03 01:08:11,116.49775,39.96722 98 | 32,2008-02-03 01:11:03,116.49775,39.96722 99 | 32,2008-02-03 09:16:07,116.49775,39.96722 100 | 32,2008-02-03 09:34:35,116.4964,39.96587 101 | 32,2008-02-03 09:42:00,116.4964,39.96587 102 | 32,2008-02-03 09:45:30,116.4964,39.96587 103 | 32,2008-02-03 09:57:30,116.46955,39.95505 104 | 32,2008-02-03 10:00:58,116.47058,39.9558 105 | 32,2008-02-03 10:07:17,116.45745,39.94857 106 | 32,2008-02-03 10:13:25,116.44123,39.96135 107 | 32,2008-02-03 10:19:25,116.44715,39.95732 108 | 32,2008-02-03 10:25:25,116.44873,39.94657 109 | 32,2008-02-03 10:31:25,116.4343,39.93995 110 | 32,2008-02-03 10:37:25,116.43307,39.93518 111 | 32,2008-02-03 10:43:25,116.43337,39.93997 112 | 32,2008-02-03 10:49:25,116.44988,39.95512 113 | 32,2008-02-03 10:55:25,116.4552,39.91643 114 | 32,2008-02-03 11:16:07,116.45107,39.86367 115 | 32,2008-02-03 11:22:07,116.34472,39.84977 116 | 32,2008-02-03 11:28:07,116.30553,39.8745 117 | 32,2008-02-03 11:34:10,116.3169,39.8956 118 | 32,2008-02-03 11:40:10,116.33513,39.89602 119 | 32,2008-02-03 11:46:10,116.34662,39.8977 120 | 32,2008-02-03 11:52:10,116.34643,39.90267 121 | 32,2008-02-03 12:41:14,116.36578,39.8985 122 | 32,2008-02-03 12:53:56,116.41242,39.89193 123 | 32,2008-02-03 12:59:56,116.4345,39.8917 124 | 32,2008-02-03 13:06:22,116.45272,39.89177 125 | 32,2008-02-03 13:12:22,116.4537,39.89215 126 | 32,2008-02-03 13:14:03,116.45472,39.8921 127 | 32,2008-02-03 13:16:43,116.45472,39.8921 128 | 32,2008-02-03 13:16:43,116.45472,39.8921 129 | 32,2008-02-03 13:17:33,116.45472,39.8921 130 | 32,2008-02-03 13:23:33,116.47005,39.90698 131 | 32,2008-02-03 13:29:33,116.45222,39.90452 132 | 32,2008-02-03 13:35:33,116.4366,39.8696 133 | 32,2008-02-03 13:47:33,116.36817,39.86962 134 | 32,2008-02-03 13:52:39,116.36817,39.86962 135 | 32,2008-02-03 14:02:16,116.36817,39.86962 136 | 32,2008-02-03 14:09:18,116.36833,39.88707 137 | 32,2008-02-03 14:15:28,116.36813,39.9052 138 | 32,2008-02-03 14:21:28,116.37147,39.91595 139 | 32,2008-02-03 14:34:31,116.36745,39.94707 140 | 32,2008-02-03 14:40:48,116.36745,39.94707 141 | 32,2008-02-03 14:42:16,116.36745,39.94707 142 | 32,2008-02-03 14:48:16,116.35077,39.96635 143 | 32,2008-02-03 14:54:16,116.34477,39.93885 144 | 32,2008-02-03 14:59:51,116.32908,39.93427 145 | 32,2008-02-03 15:02:36,116.32908,39.93427 146 | 32,2008-02-03 15:08:37,116.35018,39.93897 147 | 32,2008-02-03 15:26:43,116.4354,39.96483 148 | 32,2008-02-03 15:32:43,116.47978,39.98458 149 | 32,2008-02-03 15:38:43,116.49352,39.97113 150 | 32,2008-02-03 15:42:05,116.49352,39.97113 151 | 32,2008-02-03 16:22:08,116.49352,39.97113 152 | 32,2008-02-03 16:28:21,116.48933,39.9617 153 | 32,2008-02-03 16:34:21,116.4836,39.93527 154 | 32,2008-02-03 16:40:21,116.48898,39.90783 155 | 32,2008-02-03 16:47:06,116.49537,39.91423 156 | 32,2008-02-03 16:53:06,116.48363,39.91278 157 | 32,2008-02-03 16:59:06,116.49422,39.90948 158 | 32,2008-02-03 17:05:36,116.51197,39.91527 159 | 32,2008-02-03 17:11:36,116.53808,39.91485 160 | 32,2008-02-03 17:17:36,116.54825,39.91482 161 | 32,2008-02-03 17:23:36,116.5288,39.9155 162 | 32,2008-02-03 17:29:59,116.52178,39.91597 163 | 32,2008-02-03 17:35:59,116.51138,39.93298 164 | 32,2008-02-03 17:43:04,116.50322,39.95425 165 | 32,2008-02-03 17:49:14,116.48748,39.96263 166 | 32,2008-02-03 17:55:14,116.48362,39.97867 167 | 32,2008-02-03 18:01:15,116.4658,39.99828 168 | 32,2008-02-03 18:07:34,116.44967,39.99823 169 | 32,2008-02-03 18:13:34,116.44033,39.99138 170 | 32,2008-02-03 18:19:34,116.41807,39.99528 171 | 32,2008-02-03 18:25:34,116.399,40.00128 172 | 32,2008-02-03 18:31:34,116.40143,39.99405 173 | 32,2008-02-03 18:44:15,116.41938,39.97203 174 | 32,2008-02-03 19:04:47,116.4419,39.96282 175 | 32,2008-02-03 19:04:59,116.4419,39.96282 176 | 32,2008-02-03 19:07:21,116.4419,39.96282 177 | 32,2008-02-03 19:13:21,116.44973,39.95535 178 | 32,2008-02-03 19:20:02,116.4559,39.94752 179 | 32,2008-02-03 19:26:04,116.46202,39.95343 180 | 32,2008-02-03 19:32:46,116.45422,39.95365 181 | 32,2008-02-03 19:39:00,116.44963,39.94968 182 | 32,2008-02-03 19:45:00,116.43978,39.95565 183 | 32,2008-02-03 19:51:00,116.45547,39.94948 184 | 32,2008-02-03 19:57:00,116.45547,39.92752 185 | 32,2008-02-03 19:57:00,116.45547,39.92752 186 | 32,2008-02-03 20:03:00,116.45553,39.9069 187 | 32,2008-02-03 20:10:43,116.45742,39.90733 188 | 32,2008-02-03 20:16:43,116.45168,39.91138 189 | 32,2008-02-03 20:23:19,116.44433,39.9205 190 | 32,2008-02-03 20:29:44,116.44418,39.93202 191 | 32,2008-02-03 20:35:44,116.40912,39.93208 192 | 32,2008-02-03 20:41:44,116.38257,39.93195 193 | 32,2008-02-03 20:53:49,116.34995,39.92197 194 | 32,2008-02-03 20:59:54,116.35062,39.90942 195 | 32,2008-02-03 21:05:54,116.33148,39.89615 196 | 32,2008-02-03 21:12:00,116.31372,39.8955 197 | 32,2008-02-03 21:20:06,116.31443,39.89502 198 | 32,2008-02-03 21:26:06,116.34088,39.8963 199 | 32,2008-02-03 21:32:06,116.35062,39.90915 200 | 32,2008-02-03 21:39:25,116.36682,39.91333 201 | 32,2008-02-03 21:47:08,116.36602,39.918 202 | 32,2008-02-03 21:48:34,116.36602,39.918 203 | 32,2008-02-03 21:49:30,116.36602,39.918 204 | 32,2008-02-03 21:55:40,116.33817,39.92382 205 | 32,2008-02-03 22:13:40,116.36813,39.88973 206 | 32,2008-02-03 22:19:40,116.36793,39.87635 207 | 32,2008-02-03 22:25:42,116.3577,39.87285 208 | 32,2008-02-03 22:31:42,116.36432,39.87707 209 | 32,2008-02-03 22:43:42,116.3679,39.90698 210 | 32,2008-02-03 22:49:42,116.36762,39.92112 211 | 32,2008-02-03 22:55:42,116.35513,39.9311 212 | 32,2008-02-03 23:01:42,116.30548,39.94043 213 | 32,2008-02-03 23:07:56,116.2842,39.94367 214 | 32,2008-02-03 23:13:56,116.30857,39.93892 215 | 32,2008-02-03 23:19:56,116.32862,39.9509 216 | 32,2008-02-03 23:25:56,116.33592,39.96277 217 | 32,2008-02-03 23:31:56,116.3923,39.96718 218 | 32,2008-02-03 23:37:56,116.44872,39.9554 219 | 32,2008-02-03 23:44:38,116.48358,39.9792 220 | 32,2008-02-03 23:52:15,116.4976,39.96725 221 | 32,2008-02-03 23:54:14,116.4976,39.96725 222 | 32,2008-02-04 08:40:08,116.4976,39.96725 223 | 32,2008-02-04 08:57:22,116.49643,39.96585 224 | 32,2008-02-04 09:03:22,116.4839,39.96677 225 | 32,2008-02-04 09:09:22,116.4569,39.96533 226 | 32,2008-02-04 09:16:27,116.44997,39.96552 227 | 32,2008-02-04 09:20:27,116.44997,39.96552 228 | 32,2008-02-04 09:23:16,116.44997,39.96552 229 | 32,2008-02-04 09:23:16,116.44997,39.96552 230 | 32,2008-02-04 09:23:37,116.44997,39.96552 231 | 32,2008-02-04 09:30:32,116.4257,39.95812 232 | 32,2008-02-04 09:36:32,116.38922,39.94762 233 | 32,2008-02-04 09:42:32,116.36377,39.94687 234 | 32,2008-02-04 09:48:32,116.34955,39.93298 235 | 32,2008-02-04 09:54:32,116.34845,39.91708 236 | 32,2008-02-04 10:00:04,116.34942,39.93113 237 | 32,2008-02-04 10:06:04,116.35057,39.93657 238 | 32,2008-02-04 10:12:04,116.34477,39.94278 239 | 32,2008-02-04 10:18:04,116.33593,39.96313 240 | 32,2008-02-04 10:18:04,116.33593,39.96313 241 | 32,2008-02-04 10:24:04,116.3611,39.96655 242 | 32,2008-02-04 10:30:04,116.37273,39.97175 243 | 32,2008-02-04 10:36:04,116.36442,39.96093 244 | 32,2008-02-04 10:42:06,116.35517,39.94513 245 | 32,2008-02-04 10:48:06,116.34955,39.93215 246 | 32,2008-02-04 10:54:06,116.33677,39.92207 247 | 32,2008-02-04 11:00:06,116.33872,39.93607 248 | 32,2008-02-04 11:06:06,116.35193,39.9365 249 | 32,2008-02-04 11:07:07,116.34977,39.94037 250 | 32,2008-02-04 11:09:05,116.34977,39.94037 251 | 32,2008-02-04 11:15:05,116.36022,39.96617 252 | 32,2008-02-04 11:21:09,116.37465,39.97515 253 | 32,2008-02-04 11:27:09,116.39597,39.96488 254 | 32,2008-02-04 11:39:09,116.41225,39.95883 255 | 32,2008-02-04 11:45:09,116.43012,39.96782 256 | 32,2008-02-04 11:45:09,116.43012,39.96782 257 | 32,2008-02-04 11:51:09,116.45338,39.94253 258 | 32,2008-02-04 11:57:09,116.44407,39.93997 259 | 32,2008-02-04 12:03:29,116.42992,39.9393 260 | 32,2008-02-04 12:09:29,116.45543,39.93142 261 | 32,2008-02-04 12:16:41,116.45487,39.90963 262 | 32,2008-02-04 12:22:41,116.44422,39.9137 263 | 32,2008-02-04 12:28:41,116.44428,39.92342 264 | 32,2008-02-04 12:28:41,116.44428,39.92342 265 | 32,2008-02-04 12:34:41,116.45203,39.93225 266 | 32,2008-02-04 12:40:41,116.45572,39.94723 267 | 32,2008-02-04 12:54:14,116.45753,39.96205 268 | 32,2008-02-04 12:56:22,116.45753,39.96205 269 | 32,2008-02-04 13:02:26,116.45753,39.96205 270 | 32,2008-02-04 13:02:26,116.45753,39.96205 271 | 32,2008-02-04 13:08:26,116.44382,39.95965 272 | 32,2008-02-04 13:14:26,116.44465,39.96812 273 | 32,2008-02-04 13:20:26,116.39278,39.9673 274 | 32,2008-02-04 13:26:26,116.34533,39.96645 275 | 32,2008-02-04 13:32:26,116.30328,39.95197 276 | 32,2008-02-04 13:38:26,116.30362,39.92198 277 | 32,2008-02-04 13:44:26,116.30403,39.90367 278 | 32,2008-02-04 13:50:29,116.30405,39.89565 279 | 32,2008-02-04 13:57:49,116.30628,39.89547 280 | 32,2008-02-04 14:03:49,116.30443,39.91332 281 | 32,2008-02-04 14:09:49,116.30428,39.94077 282 | 32,2008-02-04 14:15:49,116.31508,39.96558 283 | 32,2008-02-04 14:21:49,116.32128,39.975 284 | 32,2008-02-04 14:28:44,116.34693,39.97513 285 | 32,2008-02-04 14:35:05,116.3638,39.96728 286 | 32,2008-02-04 14:41:05,116.38785,39.96702 287 | 32,2008-02-04 14:47:05,116.40173,39.9539 288 | 32,2008-02-04 14:53:05,116.39513,39.95752 289 | 32,2008-02-04 14:59:05,116.41882,39.96783 290 | 32,2008-02-04 15:05:05,116.46127,39.9693 291 | 32,2008-02-04 15:11:05,116.48222,39.96992 292 | 32,2008-02-04 15:16:52,116.48222,39.96992 293 | 32,2008-02-04 18:43:10,116.48222,39.96992 294 | 32,2008-02-04 18:49:10,116.49715,39.96393 295 | 32,2008-02-04 18:55:10,116.48597,39.96377 296 | 32,2008-02-04 19:02:15,116.47632,39.98297 297 | 32,2008-02-04 19:08:15,116.47132,40.00372 298 | 32,2008-02-04 19:14:15,116.46857,39.9883 299 | 32,2008-02-04 19:20:15,116.47527,39.96208 300 | 32,2008-02-04 19:26:15,116.48212,39.9325 301 | 32,2008-02-04 19:32:27,116.46938,39.92978 302 | 32,2008-02-04 19:38:27,116.4626,39.92848 303 | 32,2008-02-04 19:44:47,116.47208,39.9324 304 | 32,2008-02-04 19:51:16,116.49912,39.93573 305 | 32,2008-02-04 19:57:16,116.51003,39.9327 306 | 32,2008-02-04 20:04:30,116.51143,39.92232 307 | 32,2008-02-04 20:10:30,116.50282,39.907 308 | 32,2008-02-04 20:16:48,116.47202,39.90972 309 | 32,2008-02-04 20:22:56,116.47173,39.90833 310 | 32,2008-02-04 20:29:37,116.47213,39.90712 311 | 32,2008-02-04 20:35:37,116.48027,39.85555 312 | 32,2008-02-04 20:41:37,116.50498,39.8146 313 | 32,2008-02-04 20:48:24,116.48375,39.81602 314 | 32,2008-02-04 20:54:24,116.48123,39.85985 315 | 32,2008-02-04 21:00:24,116.5103,39.85862 316 | 32,2008-02-04 21:12:24,116.47152,39.88912 317 | 32,2008-02-04 21:18:43,116.47412,39.90703 318 | 32,2008-02-04 21:24:43,116.44853,39.91207 319 | 32,2008-02-04 21:30:43,116.42772,39.93725 320 | 32,2008-02-04 21:42:43,116.3612,39.95113 321 | 32,2008-02-04 21:48:43,116.35532,39.95468 322 | 32,2008-02-04 21:48:48,116.35532,39.95468 323 | 32,2008-02-04 21:56:05,116.37765,39.96667 324 | 32,2008-02-04 22:08:11,116.4485,39.95603 325 | 32,2008-02-04 22:14:11,116.46957,39.96737 326 | 32,2008-02-04 22:19:09,116.46957,39.96737 327 | 32,2008-02-04 22:20:23,116.46957,39.96737 328 | 32,2008-02-04 22:27:02,116.48355,39.98645 329 | 32,2008-02-04 22:33:02,116.43988,39.94903 330 | 32,2008-02-04 22:39:02,116.42957,39.90403 331 | 32,2008-02-04 22:45:20,116.39933,39.89807 332 | 32,2008-02-04 22:57:39,116.40263,39.93153 333 | 32,2008-02-04 23:03:50,116.41273,39.95242 334 | 32,2008-02-04 23:09:51,116.43293,39.95827 335 | 32,2008-02-04 23:15:51,116.46115,39.95997 336 | 32,2008-02-04 23:21:51,116.48602,39.97907 337 | 32,2008-02-04 23:27:51,116.48638,39.9752 338 | 32,2008-02-04 23:29:02,116.4935,39.97535 339 | 32,2008-02-04 23:29:06,116.4935,39.97535 340 | 32,2008-02-04 23:29:38,116.4935,39.97535 341 | 32,2008-02-04 23:31:11,116.4935,39.97535 342 | 32,2008-02-04 23:37:20,116.49263,39.96267 343 | 32,2008-02-04 23:43:21,116.49263,39.96267 344 | 32,2008-02-04 23:52:43,116.49263,39.96267 345 | 32,2008-02-04 23:53:58,116.49263,39.96267 346 | 32,2008-02-04 23:55:54,116.49263,39.96267 347 | 32,2008-02-04 23:58:50,116.49263,39.96267 348 | 32,2008-02-05 00:04:10,116.49263,39.96267 349 | 32,2008-02-05 09:25:08,116.49263,39.96267 350 | 32,2008-02-05 09:46:55,116.49645,39.96585 351 | 32,2008-02-05 09:52:55,116.48422,39.97087 352 | 32,2008-02-05 09:58:55,116.46358,39.96223 353 | 32,2008-02-05 09:58:55,116.46358,39.96223 354 | 32,2008-02-05 09:58:55,116.46358,39.96223 355 | 32,2008-02-05 10:00:00,116.46043,39.95923 356 | 32,2008-02-05 10:06:47,116.4447,39.94668 357 | 32,2008-02-05 10:14:07,116.43393,39.94385 358 | 32,2008-02-05 10:20:07,116.43467,39.95832 359 | 32,2008-02-05 10:24:47,116.43467,39.95832 360 | 32,2008-02-05 10:34:11,116.43467,39.95832 361 | 32,2008-02-05 10:35:05,116.43467,39.95832 362 | 32,2008-02-05 10:40:48,116.43467,39.95832 363 | 32,2008-02-05 10:41:04,116.43467,39.95832 364 | 32,2008-02-05 10:44:27,116.43467,39.95832 365 | 32,2008-02-05 10:56:27,116.43467,39.95832 366 | 32,2008-02-05 10:57:47,116.43467,39.95832 367 | 32,2008-02-05 11:03:47,116.45553,39.94893 368 | 32,2008-02-05 11:09:47,116.45388,39.93098 369 | 32,2008-02-05 11:15:47,116.45575,39.94782 370 | 32,2008-02-05 11:22:08,116.44285,39.95337 371 | 32,2008-02-05 11:28:08,116.44802,39.96652 372 | 32,2008-02-05 11:31:16,116.44802,39.96652 373 | 32,2008-02-05 11:40:51,116.44802,39.96652 374 | 32,2008-02-05 11:43:06,116.44802,39.96652 375 | 32,2008-02-05 11:51:33,116.44802,39.96652 376 | 32,2008-02-05 11:52:59,116.44802,39.96652 377 | 32,2008-02-05 12:05:31,116.43758,39.935 378 | 32,2008-02-05 12:11:31,116.43623,39.92557 379 | 32,2008-02-05 12:17:31,116.43492,39.92233 380 | 32,2008-02-05 12:23:39,116.4383,39.93902 381 | 32,2008-02-05 12:29:52,116.43335,39.95313 382 | 32,2008-02-05 12:31:05,116.43335,39.95313 383 | 32,2008-02-05 12:32:55,116.43335,39.95313 384 | 32,2008-02-05 12:38:55,116.43607,39.95827 385 | 32,2008-02-05 12:43:38,116.43607,39.95827 386 | 32,2008-02-05 12:43:48,116.43607,39.95827 387 | 32,2008-02-05 12:43:55,116.43607,39.95827 388 | 32,2008-02-05 12:44:12,116.43607,39.95827 389 | 32,2008-02-05 12:52:18,116.43607,39.95827 390 | 32,2008-02-05 12:52:33,116.43607,39.95827 391 | 32,2008-02-05 12:59:06,116.43607,39.95827 392 | 32,2008-02-05 12:59:30,116.43607,39.95827 393 | 32,2008-02-05 13:02:15,116.43607,39.95827 394 | 32,2008-02-05 13:02:17,116.43607,39.95827 395 | 32,2008-02-05 13:05:33,116.43607,39.95827 396 | 32,2008-02-05 13:05:37,116.43607,39.95827 397 | 32,2008-02-05 13:05:40,116.43607,39.95827 398 | 32,2008-02-05 13:05:47,116.43607,39.95827 399 | 32,2008-02-05 13:06:02,116.43607,39.95827 400 | 32,2008-02-05 13:12:46,116.43607,39.95827 401 | 32,2008-02-05 13:13:08,116.43607,39.95827 402 | 32,2008-02-05 13:21:52,116.43607,39.95827 403 | 32,2008-02-05 13:21:55,116.43607,39.95827 404 | 32,2008-02-05 13:25:40,116.43607,39.95827 405 | 32,2008-02-05 13:25:58,116.43607,39.95827 406 | 32,2008-02-05 13:28:45,116.43607,39.95827 407 | 32,2008-02-05 13:35:06,116.44122,39.96207 408 | 32,2008-02-05 13:41:06,116.44468,39.95835 409 | 32,2008-02-05 13:47:37,116.4765,39.98288 410 | 32,2008-02-05 13:53:37,116.48383,39.98952 411 | 32,2008-02-05 14:00:34,116.51687,40.02338 412 | 32,2008-02-05 14:06:34,116.54458,40.0596 413 | 32,2008-02-05 14:18:48,116.60575,40.1165 414 | 32,2008-02-05 14:24:59,116.6627,40.11505 415 | 32,2008-02-05 14:24:59,116.6627,40.11505 416 | 32,2008-02-05 14:30:59,116.73972,40.12568 417 | 32,2008-02-05 14:37:30,116.81362,40.14837 418 | 32,2008-02-05 14:43:30,116.88838,40.15258 419 | 32,2008-02-05 14:49:30,116.97562,40.14455 420 | 32,2008-02-05 14:55:30,117.05912,40.1444 421 | 32,2008-02-05 15:01:30,117.10092,40.14652 422 | 32,2008-02-05 15:04:03,117.10092,40.14652 423 | 32,2008-02-05 15:35:32,117.10092,40.14652 424 | 32,2008-02-05 15:45:42,117.10092,40.14652 425 | 32,2008-02-05 16:41:05,117.10092,40.14652 426 | 32,2008-02-05 16:43:21,117.1171,40.16087 427 | 32,2008-02-05 17:05:10,117.1171,40.16087 428 | 32,2008-02-05 17:07:25,117.11415,40.15615 429 | 32,2008-02-05 17:16:15,117.1009,40.14522 430 | 32,2008-02-05 17:22:22,117.10488,40.14423 431 | 32,2008-02-05 17:23:45,117.10488,40.14423 432 | 32,2008-02-05 17:23:45,117.10488,40.14423 433 | 32,2008-02-05 17:27:13,117.10488,40.14423 434 | 32,2008-02-05 17:33:13,117.09877,40.14738 435 | 32,2008-02-05 17:35:01,117.09877,40.14738 436 | 32,2008-02-05 17:35:43,117.09877,40.14738 437 | 32,2008-02-05 17:36:11,117.09877,40.14738 438 | 32,2008-02-05 19:06:52,117.09947,40.14738 439 | 32,2008-02-05 22:59:40,117.09967,40.14663 440 | 32,2008-02-06 01:56:04,117.09938,40.14768 441 | 32,2008-02-06 01:56:04,117.09938,40.14768 442 | 32,2008-02-06 03:39:31,117.08162,40.08752 443 | 32,2008-02-06 03:45:31,117.03167,39.99043 444 | 32,2008-02-06 03:51:31,116.9679,39.91017 445 | 32,2008-02-06 03:57:31,116.9679,39.91017 446 | 32,2008-02-06 04:07:02,116.9679,39.91017 447 | 32,2008-02-06 06:02:47,117.09947,40.14743 448 | 32,2008-02-06 06:34:43,117.09935,40.14737 449 | 32,2008-02-06 10:39:01,117.09935,40.14737 450 | 32,2008-02-06 10:45:01,117.10468,40.14525 451 | 32,2008-02-06 10:45:52,117.10468,40.14525 452 | 32,2008-02-06 10:53:14,117.10468,40.14525 453 | 32,2008-02-06 10:59:22,117.1048,40.14525 454 | 32,2008-02-06 11:03:54,117.1048,40.14525 455 | 32,2008-02-06 11:22:46,117.1048,40.14525 456 | 32,2008-02-06 11:35:31,117.10085,40.14628 457 | 32,2008-02-06 11:38:45,117.10085,40.14628 458 | 32,2008-02-06 14:42:22,117.11708,40.14078 459 | 32,2008-02-06 14:43:35,117.11778,40.1389 460 | 32,2008-02-06 15:30:21,117.11778,40.1389 461 | 32,2008-02-06 15:31:15,117.11778,40.1389 462 | 32,2008-02-06 16:21:26,117.11778,40.1389 463 | 32,2008-02-06 16:23:00,117.11778,40.1389 464 | 32,2008-02-06 16:46:36,117.11778,40.1389 465 | 32,2008-02-06 16:52:38,117.09968,40.1479 466 | 32,2008-02-06 17:21:23,117.09968,40.1479 467 | 32,2008-02-06 17:27:23,117.11638,40.13872 468 | 32,2008-02-06 17:27:26,117.11643,40.13867 469 | 32,2008-02-06 17:48:51,117.11643,40.13867 470 | 32,2008-02-06 17:54:51,117.10915,40.1442 471 | 32,2008-02-06 18:01:45,117.09957,40.14752 472 | 32,2008-02-06 18:03:07,117.09957,40.14752 473 | 32,2008-02-06 18:03:48,117.09957,40.14752 474 | 32,2008-02-06 18:04:52,117.09957,40.14752 475 | 32,2008-02-06 18:04:57,117.09957,40.14752 476 | 32,2008-02-06 18:09:57,117.09957,40.14752 477 | 32,2008-02-06 18:15:57,117.09895,40.1391 478 | 32,2008-02-06 18:20:04,117.09895,40.1391 479 | 32,2008-02-06 19:20:56,117.09895,40.1391 480 | 32,2008-02-06 19:26:56,117.0965,40.14858 481 | 32,2008-02-06 19:32:56,117.13205,40.15367 482 | 32,2008-02-06 19:37:55,117.13205,40.15367 483 | 32,2008-02-06 19:42:42,117.13205,40.15367 484 | 32,2008-02-06 19:47:19,117.13205,40.15367 485 | 32,2008-02-06 20:38:31,117.13205,40.15367 486 | 32,2008-02-06 20:44:31,117.12662,40.15225 487 | 32,2008-02-06 20:50:31,117.13962,40.17102 488 | 32,2008-02-06 20:56:31,117.15918,40.18867 489 | 32,2008-02-06 20:57:26,117.15918,40.18867 490 | 32,2008-02-06 21:28:28,117.15918,40.18867 491 | 32,2008-02-06 21:34:28,117.15075,40.17545 492 | 32,2008-02-06 21:40:28,117.12988,40.15133 493 | 32,2008-02-06 21:46:28,117.10398,40.14887 494 | 32,2008-02-06 21:48:14,117.10398,40.14887 495 | 32,2008-02-06 23:57:46,117.09933,40.1476 496 | 32,2008-02-07 11:05:29,117.09943,40.14745 497 | 32,2008-02-07 11:09:05,117.09943,40.14745 498 | 32,2008-02-07 11:26:46,117.09943,40.14745 499 | 32,2008-02-07 11:26:46,117.09943,40.14745 500 | 32,2008-02-07 11:26:56,117.09943,40.14745 501 | 32,2008-02-07 11:33:07,117.11607,40.1442 502 | 32,2008-02-07 11:40:05,117.11607,40.1442 503 | 32,2008-02-07 11:41:28,117.11607,40.1442 504 | 32,2008-02-07 11:41:44,117.11607,40.1442 505 | 32,2008-02-07 21:03:55,117.11607,40.1442 506 | 32,2008-02-07 21:04:48,117.11607,40.1442 507 | 32,2008-02-07 21:20:06,117.11607,40.1442 508 | 32,2008-02-07 21:26:06,117.10542,40.14885 509 | 32,2008-02-07 21:26:06,117.10542,40.14885 510 | 32,2008-02-07 21:29:03,117.10542,40.14885 511 | 32,2008-02-07 22:50:34,117.0993,40.14747 512 | 32,2008-02-08 00:00:56,117.09938,40.14743 513 | 32,2008-02-08 00:25:10,117.09922,40.14752 514 | 32,2008-02-08 07:23:31,117.09918,40.14737 515 | 32,2008-02-08 07:35:00,117.09867,40.14895 516 | 32,2008-02-08 07:35:00,117.09867,40.14895 517 | 32,2008-02-08 08:53:41,117.09923,40.1474 518 | 32,2008-02-08 09:09:18,117.10035,40.14777 519 | 32,2008-02-08 09:37:54,117.09965,40.14752 520 | 32,2008-02-08 10:26:18,117.09965,40.14752 521 | 32,2008-02-08 10:29:27,117.09965,40.14752 522 | 32,2008-02-08 10:29:31,117.09965,40.14752 523 | 32,2008-02-08 10:35:31,117.10533,40.14872 524 | 32,2008-02-08 10:41:31,117.13573,40.1648 525 | 32,2008-02-08 10:47:31,117.1581,40.18862 526 | 32,2008-02-08 10:48:41,117.15975,40.18917 527 | 32,2008-02-08 11:53:38,117.15975,40.18917 528 | 32,2008-02-08 11:59:58,117.15728,40.19032 529 | 32,2008-02-08 12:06:06,117.16738,40.19833 530 | 32,2008-02-08 12:06:32,117.16742,40.19827 531 | 32,2008-02-08 12:15:09,117.16742,40.19827 532 | 32,2008-02-08 12:18:42,117.16742,40.19827 533 | 32,2008-02-08 12:49:16,117.16742,40.19827 534 | 32,2008-02-08 12:49:16,117.16742,40.19827 535 | 32,2008-02-08 12:56:27,117.16752,40.1985 536 | 32,2008-02-08 13:02:54,117.16752,40.1985 537 | 32,2008-02-08 13:04:05,117.16752,40.1985 538 | 32,2008-02-08 13:10:05,117.16368,40.19035 539 | 32,2008-02-08 13:12:59,117.16368,40.19035 540 | 32,2008-02-08 13:16:02,117.16368,40.19035 541 | 32,2008-02-08 13:16:36,117.16368,40.19035 542 | 32,2008-02-08 13:17:16,117.16368,40.19035 543 | 32,2008-02-08 13:17:18,117.16368,40.19035 544 | 32,2008-02-08 13:30:35,117.16368,40.19035 545 | 32,2008-02-08 13:36:35,117.15333,40.1884 546 | 32,2008-02-08 13:42:35,117.13692,40.15703 547 | 32,2008-02-08 13:48:35,117.1108,40.14425 548 | 32,2008-02-08 13:54:25,117.1108,40.14425 549 | 32,2008-02-08 13:54:29,117.1108,40.14425 550 | 32,2008-02-08 13:54:33,117.1108,40.14425 551 | -------------------------------------------------------------------------------- /data2/36.txt: -------------------------------------------------------------------------------- 1 | 36,2008-02-02 15:48:29,116.45249,39.92149 2 | 36,2008-02-02 15:58:29,116.45247,39.92149 3 | 36,2008-02-02 16:08:29,116.45246,39.92149 4 | 36,2008-02-02 16:18:29,116.44638,39.92184 5 | 36,2008-02-02 16:28:29,116.43779,39.93228 6 | 36,2008-02-02 16:38:29,116.47159,39.93214 7 | 36,2008-02-02 16:48:29,116.49999,39.93557 8 | 36,2008-02-02 16:58:29,116.45488,39.97561 9 | 36,2008-02-02 17:18:29,116.40149,39.99205 10 | 36,2008-02-02 17:28:29,116.40401,39.96711 11 | 36,2008-02-02 17:38:29,116.45558,39.9454 12 | 36,2008-02-02 17:48:29,116.44856,39.91407 13 | 36,2008-02-02 17:58:29,116.44748,39.91522 14 | 36,2008-02-02 18:08:29,116.47188,39.91366 15 | 36,2008-02-02 18:18:29,116.48306,39.95431 16 | 36,2008-02-02 18:28:29,116.49048,39.9608 17 | 36,2008-02-02 18:38:29,116.45715,39.94839 18 | 36,2008-02-02 18:48:28,116.44206,39.94776 19 | 36,2008-02-02 18:58:28,116.46259,39.98455 20 | 36,2008-02-02 19:08:28,116.46598,39.97378 21 | 36,2008-02-02 19:18:28,116.47139,39.96435 22 | 36,2008-02-02 19:28:28,116.483,39.91625 23 | 36,2008-02-02 19:28:28,116.483,39.91625 24 | 36,2008-02-02 19:38:28,116.46478,39.90684 25 | 36,2008-02-02 19:48:28,116.45199,39.90871 26 | 36,2008-02-02 19:58:28,116.49341,39.90673 27 | 36,2008-02-02 20:08:28,116.52319,39.95792 28 | 36,2008-02-02 20:18:28,116.57563,40.04374 29 | 36,2008-02-02 20:28:28,116.5845,40.07685 30 | 36,2008-02-02 20:38:28,116.58871,40.04803 31 | 36,2008-02-02 20:48:28,116.57227,40.04186 32 | 36,2008-02-02 20:58:28,116.44913,39.95818 33 | 36,2008-02-02 21:08:28,116.43775,39.96328 34 | 36,2008-02-02 21:30:55,116.4897,39.90638 35 | 36,2008-02-03 01:00:22,116.69544,39.85161 36 | 36,2008-02-03 01:10:22,116.69545,39.85161 37 | 36,2008-02-03 01:20:22,116.69546,39.85159 38 | 36,2008-02-03 01:30:22,116.69548,39.85157 39 | 36,2008-02-03 01:40:22,116.69549,39.85154 40 | 36,2008-02-03 01:50:22,116.6955,39.85152 41 | 36,2008-02-03 02:20:22,116.69551,39.85161 42 | 36,2008-02-03 02:30:22,116.69554,39.85164 43 | 36,2008-02-03 02:40:22,116.69553,39.85165 44 | 36,2008-02-03 03:56:56,116.69543,39.85159 45 | 36,2008-02-03 04:20:21,116.69543,39.85149 46 | 36,2008-02-03 04:30:21,116.69541,39.85152 47 | 36,2008-02-03 04:40:21,116.69539,39.8516 48 | 36,2008-02-03 04:50:21,116.69542,39.85181 49 | 36,2008-02-03 05:00:21,116.69544,39.85176 50 | 36,2008-02-03 05:10:21,116.69543,39.85149 51 | 36,2008-02-03 05:20:21,116.69545,39.85151 52 | 36,2008-02-03 05:30:21,116.69534,39.85173 53 | 36,2008-02-03 05:40:21,116.69528,39.85178 54 | 36,2008-02-03 06:00:21,116.69492,39.85191 55 | 36,2008-02-03 06:10:21,116.695,39.85188 56 | 36,2008-02-03 06:20:21,116.69516,39.85185 57 | 36,2008-02-03 06:30:21,116.69521,39.85188 58 | 36,2008-02-03 06:40:21,116.69546,39.85157 59 | 36,2008-02-03 06:40:21,116.69546,39.85157 60 | 36,2008-02-03 06:50:21,116.69532,39.85173 61 | 36,2008-02-03 07:00:21,116.69534,39.85174 62 | 36,2008-02-03 07:10:21,116.69536,39.85172 63 | 36,2008-02-03 07:20:21,116.69537,39.85168 64 | 36,2008-02-03 07:30:21,116.69538,39.85166 65 | 36,2008-02-03 07:50:21,116.69551,39.85157 66 | 36,2008-02-03 08:10:21,116.69544,39.85185 67 | 36,2008-02-03 08:20:21,116.69541,39.85169 68 | 36,2008-02-03 08:30:21,116.6954,39.85175 69 | 36,2008-02-03 08:40:21,116.69539,39.85176 70 | 36,2008-02-03 08:50:20,116.6954,39.85177 71 | 36,2008-02-03 09:00:20,116.6956,39.85128 72 | 36,2008-02-03 09:10:20,116.6955,39.8516 73 | 36,2008-02-03 09:30:20,116.69547,39.85142 74 | 36,2008-02-03 09:40:20,116.69544,39.85138 75 | 36,2008-02-03 09:50:20,116.69541,39.85159 76 | 36,2008-02-03 10:10:20,116.69538,39.85166 77 | 36,2008-02-03 10:20:20,116.69543,39.85171 78 | 36,2008-02-03 10:30:20,116.69476,39.85175 79 | 36,2008-02-03 10:50:20,116.68486,39.87038 80 | 36,2008-02-03 11:00:20,116.63866,39.89374 81 | 36,2008-02-03 11:10:20,116.63323,39.90082 82 | 36,2008-02-03 11:20:20,116.5267,39.9084 83 | 36,2008-02-03 11:30:24,116.43664,39.89779 84 | 36,2008-02-03 11:40:20,116.39175,39.87033 85 | 36,2008-02-03 11:50:20,116.33947,39.89666 86 | 36,2008-02-03 12:00:20,116.317,39.90615 87 | 36,2008-02-03 12:10:11,116.69538,39.85168 88 | 36,2008-02-03 12:40:20,116.36028,39.89395 89 | 36,2008-02-03 12:50:20,116.34277,39.89044 90 | 36,2008-02-03 13:00:20,116.33937,39.91166 91 | 36,2008-02-03 13:10:20,116.35007,39.90864 92 | 36,2008-02-03 13:20:19,116.38878,39.90605 93 | 36,2008-02-03 13:30:19,116.4055,39.90861 94 | 36,2008-02-03 13:40:19,116.42083,39.90621 95 | 36,2008-02-03 13:50:19,116.42501,39.92291 96 | 36,2008-02-03 14:00:19,116.42905,39.90367 97 | 36,2008-02-03 14:10:19,116.45564,39.88356 98 | 36,2008-02-03 14:30:19,116.46077,39.89921 99 | 36,2008-02-03 14:40:19,116.44939,39.92204 100 | 36,2008-02-03 14:50:19,116.45228,39.92149 101 | 36,2008-02-03 15:00:19,116.45223,39.92141 102 | 36,2008-02-03 15:10:19,116.45224,39.92141 103 | 36,2008-02-03 15:20:19,116.45219,39.92145 104 | 36,2008-02-03 15:30:19,116.4522,39.92147 105 | 36,2008-02-03 15:40:19,116.4522,39.92147 106 | 36,2008-02-03 15:50:19,116.45221,39.92146 107 | 36,2008-02-03 16:00:19,116.45222,39.92146 108 | 36,2008-02-03 16:00:19,116.45222,39.92146 109 | 36,2008-02-03 16:10:19,116.45223,39.92145 110 | 36,2008-02-03 16:20:19,116.45197,39.91891 111 | 36,2008-02-03 16:20:19,116.45197,39.91891 112 | 36,2008-02-03 16:30:19,116.42967,39.92328 113 | 36,2008-02-03 16:40:19,116.38529,39.92171 114 | 36,2008-02-03 16:50:19,116.35548,39.92231 115 | 36,2008-02-03 17:00:19,116.2932,39.92277 116 | 36,2008-02-03 17:10:19,116.29832,39.92215 117 | 36,2008-02-03 17:20:19,116.2679,39.91226 118 | 36,2008-02-03 17:30:19,116.26842,39.9059 119 | 36,2008-02-03 17:40:18,116.27695,39.90627 120 | 36,2008-02-03 17:50:18,116.29001,39.92322 121 | 36,2008-02-03 18:00:18,116.31083,39.92239 122 | 36,2008-02-03 18:10:18,116.34325,39.9221 123 | 36,2008-02-03 18:20:18,116.35016,39.90031 124 | 36,2008-02-03 18:30:18,116.35648,39.88798 125 | 36,2008-02-03 18:40:18,116.34542,39.86717 126 | 36,2008-02-03 18:50:18,116.30742,39.86369 127 | 36,2008-02-03 19:00:18,116.34933,39.86768 128 | 36,2008-02-03 19:10:18,116.34062,39.8966 129 | 36,2008-02-03 19:20:18,116.32064,39.89586 130 | 36,2008-02-03 19:30:18,116.31496,39.9053 131 | 36,2008-02-03 19:40:18,116.30416,39.93247 132 | 36,2008-02-03 19:50:18,116.30737,39.98383 133 | 36,2008-02-03 20:00:18,116.33853,39.9918 134 | 36,2008-02-03 20:10:18,116.35776,39.96625 135 | 36,2008-02-03 20:20:18,116.34731,39.96057 136 | 36,2008-02-03 20:30:18,116.34304,39.93867 137 | 36,2008-02-03 20:40:18,116.34977,39.94035 138 | 36,2008-02-03 20:50:18,116.41023,39.94772 139 | 36,2008-02-03 21:00:18,116.42856,39.91712 140 | 36,2008-02-03 21:10:18,116.41893,39.87005 141 | 36,2008-02-03 21:10:18,116.41893,39.87005 142 | 36,2008-02-03 21:20:18,116.42222,39.84705 143 | 36,2008-02-03 21:40:18,116.52906,39.86832 144 | 36,2008-02-03 22:00:18,116.69258,39.85973 145 | 36,2008-02-03 22:10:18,116.69531,39.85171 146 | 36,2008-02-03 22:20:17,116.69538,39.8517 147 | 36,2008-02-03 22:30:17,116.6954,39.85174 148 | 36,2008-02-03 22:40:17,116.69583,39.85567 149 | 36,2008-02-03 22:50:17,116.6953,39.85174 150 | 36,2008-02-03 23:00:17,116.69548,39.8517 151 | 36,2008-02-03 23:10:17,116.69541,39.85175 152 | 36,2008-02-03 23:30:17,116.69536,39.85171 153 | 36,2008-02-03 23:40:17,116.69538,39.85171 154 | 36,2008-02-03 23:50:17,116.69538,39.8517 155 | 36,2008-02-04 00:00:17,116.6953,39.85159 156 | 36,2008-02-04 00:31:45,116.6953,39.85159 157 | 36,2008-02-04 00:40:17,116.6953,39.8516 158 | 36,2008-02-04 00:50:17,116.69532,39.85161 159 | 36,2008-02-04 01:00:16,116.69532,39.85162 160 | 36,2008-02-04 01:32:43,116.69543,39.85188 161 | 36,2008-02-04 01:40:17,116.69538,39.85182 162 | 36,2008-02-04 01:50:17,116.6954,39.85184 163 | 36,2008-02-04 02:00:17,116.69547,39.85184 164 | 36,2008-02-04 02:00:17,116.69547,39.85184 165 | 36,2008-02-04 02:10:17,116.69545,39.85182 166 | 36,2008-02-04 02:20:17,116.69546,39.8518 167 | 36,2008-02-04 02:30:17,116.69548,39.85179 168 | 36,2008-02-04 02:40:17,116.69548,39.85177 169 | 36,2008-02-04 02:50:16,116.69579,39.85209 170 | 36,2008-02-04 03:00:16,116.6954,39.85158 171 | 36,2008-02-04 03:10:16,116.69542,39.85158 172 | 36,2008-02-04 03:20:16,116.69539,39.85162 173 | 36,2008-02-04 03:30:16,116.69539,39.85162 174 | 36,2008-02-04 03:40:16,116.69539,39.85162 175 | 36,2008-02-04 03:50:16,116.69539,39.85162 176 | 36,2008-02-04 04:00:16,116.69533,39.85163 177 | 36,2008-02-04 04:10:16,116.69532,39.8518 178 | 36,2008-02-04 04:20:16,116.69533,39.85162 179 | 36,2008-02-04 04:30:16,116.69531,39.85169 180 | 36,2008-02-04 04:40:16,116.69529,39.85175 181 | 36,2008-02-04 04:50:16,116.69549,39.8516 182 | 36,2008-02-04 05:00:16,116.69539,39.85179 183 | 36,2008-02-04 05:10:16,116.69527,39.85209 184 | 36,2008-02-04 05:20:16,116.69526,39.85228 185 | 36,2008-02-04 05:30:16,116.69511,39.85181 186 | 36,2008-02-04 05:40:16,116.69514,39.8518 187 | 36,2008-02-04 05:50:16,116.6951,39.85176 188 | 36,2008-02-04 06:00:16,116.6951,39.85178 189 | 36,2008-02-04 06:10:16,116.69511,39.85179 190 | 36,2008-02-04 06:20:16,116.69513,39.8519 191 | 36,2008-02-04 06:30:16,116.69517,39.85196 192 | 36,2008-02-04 06:40:16,116.69528,39.85172 193 | 36,2008-02-04 06:50:16,116.69533,39.85171 194 | 36,2008-02-04 06:50:16,116.69533,39.85171 195 | 36,2008-02-04 07:00:16,116.69531,39.85173 196 | 36,2008-02-04 07:10:16,116.6953,39.85177 197 | 36,2008-02-04 07:20:15,116.6953,39.85177 198 | 36,2008-02-04 07:30:15,116.69531,39.85178 199 | 36,2008-02-04 07:40:15,116.69531,39.85176 200 | 36,2008-02-04 07:50:15,116.6953,39.85175 201 | 36,2008-02-04 08:00:16,116.69531,39.85174 202 | 36,2008-02-04 08:10:15,116.69546,39.85115 203 | 36,2008-02-04 08:20:15,116.69527,39.85171 204 | 36,2008-02-04 08:30:15,116.69535,39.85176 205 | 36,2008-02-04 08:40:15,116.69533,39.8516 206 | 36,2008-02-04 08:50:15,116.6952,39.85184 207 | 36,2008-02-04 09:00:15,116.69526,39.85178 208 | 36,2008-02-04 09:10:15,116.69524,39.85192 209 | 36,2008-02-04 09:20:15,116.68358,39.87023 210 | 36,2008-02-04 09:30:15,116.65276,39.90045 211 | 36,2008-02-04 09:40:15,116.65275,39.90058 212 | 36,2008-02-04 09:50:15,116.65246,39.9003 213 | 36,2008-02-04 10:00:15,116.6636,39.89833 214 | 36,2008-02-04 10:10:15,116.68936,39.86643 215 | 36,2008-02-04 10:20:15,116.69368,39.85158 216 | 36,2008-02-04 11:04:02,116.69342,39.85237 217 | 36,2008-02-04 11:10:15,116.68162,39.87086 218 | 36,2008-02-04 11:20:15,116.65104,39.88971 219 | 36,2008-02-04 11:30:15,116.61669,39.90556 220 | 36,2008-02-04 11:40:15,116.56597,39.90884 221 | 36,2008-02-04 11:40:15,116.56597,39.90884 222 | 36,2008-02-04 15:13:55,116.30845,39.86716 223 | 36,2008-02-04 15:23:55,116.30569,39.87421 224 | 36,2008-02-04 15:33:55,116.30713,39.86429 225 | 36,2008-02-04 15:43:55,116.37859,39.86919 226 | 36,2008-02-04 16:03:54,116.45441,39.9194 227 | 36,2008-02-04 16:13:55,116.45236,39.92141 228 | 36,2008-02-04 16:23:55,116.45236,39.92139 229 | 36,2008-02-04 16:33:55,116.45236,39.92134 230 | 36,2008-02-04 16:43:55,116.45235,39.92133 231 | 36,2008-02-04 16:53:55,116.45662,39.92063 232 | 36,2008-02-04 17:03:55,116.41497,39.89189 233 | 36,2008-02-04 17:13:55,116.37311,39.88817 234 | 36,2008-02-04 17:23:55,116.36786,39.88455 235 | 36,2008-02-04 17:33:55,116.38446,39.86989 236 | 36,2008-02-04 17:43:55,116.41283,39.89109 237 | 36,2008-02-04 17:53:55,116.4156,39.90121 238 | 36,2008-02-04 18:03:55,116.40644,39.90676 239 | 36,2008-02-04 18:13:55,116.38879,39.90628 240 | 36,2008-02-04 18:43:54,116.34639,39.90513 241 | 36,2008-02-04 18:53:54,116.35715,39.88929 242 | 36,2008-02-04 19:03:54,116.36706,39.88779 243 | 36,2008-02-04 19:13:54,116.39411,39.89886 244 | 36,2008-02-04 19:23:54,116.41158,39.89952 245 | 36,2008-02-04 19:33:54,116.41079,39.89987 246 | 36,2008-02-04 19:33:54,116.41079,39.89987 247 | 36,2008-02-04 19:43:54,116.43036,39.89867 248 | 36,2008-02-04 19:53:54,116.43665,39.89901 249 | 36,2008-02-04 20:03:54,116.48364,39.95157 250 | 36,2008-02-04 20:39:57,116.58864,40.04808 251 | 36,2008-02-04 20:43:54,116.57456,40.03975 252 | 36,2008-02-04 21:03:54,116.58314,39.93808 253 | 36,2008-02-04 21:13:54,116.59489,39.90847 254 | 36,2008-02-04 21:23:54,116.64614,39.89092 255 | 36,2008-02-04 21:33:54,116.67647,39.88703 256 | 36,2008-02-04 21:43:54,116.69067,39.8636 257 | 36,2008-02-04 23:35:45,116.69536,39.85166 258 | 36,2008-02-04 23:43:53,116.6953,39.85154 259 | 36,2008-02-05 00:02:47,116.69533,39.85161 260 | 36,2008-02-05 00:03:53,116.69533,39.85161 261 | 36,2008-02-05 00:13:53,116.69535,39.85163 262 | 36,2008-02-05 00:23:53,116.69535,39.85164 263 | 36,2008-02-05 00:23:53,116.69535,39.85164 264 | 36,2008-02-05 00:33:53,116.69535,39.85164 265 | 36,2008-02-05 00:53:53,116.69536,39.85165 266 | 36,2008-02-05 02:33:53,116.69503,39.85139 267 | 36,2008-02-05 03:43:21,116.69538,39.85168 268 | 36,2008-02-05 03:43:52,116.69539,39.85166 269 | 36,2008-02-05 03:53:52,116.6954,39.85162 270 | 36,2008-02-05 05:32:16,116.69534,39.85177 271 | 36,2008-02-05 05:33:52,116.69534,39.85177 272 | 36,2008-02-05 05:43:52,116.69531,39.85177 273 | 36,2008-02-05 05:53:52,116.69507,39.85188 274 | 36,2008-02-05 06:03:52,116.69514,39.85183 275 | 36,2008-02-05 08:31:51,116.69525,39.85182 276 | 36,2008-02-05 08:33:51,116.69526,39.85182 277 | 36,2008-02-05 08:43:51,116.69528,39.85179 278 | 36,2008-02-05 08:53:51,116.69522,39.8517 279 | 36,2008-02-05 09:13:51,116.66938,39.87753 280 | 36,2008-02-05 09:23:51,116.6529,39.90068 281 | 36,2008-02-05 09:33:51,116.65288,39.90067 282 | 36,2008-02-05 09:43:51,116.65289,39.90067 283 | 36,2008-02-05 09:53:51,116.65293,39.90077 284 | 36,2008-02-05 10:03:51,116.65289,39.90075 285 | 36,2008-02-05 10:13:51,116.65288,39.90072 286 | 36,2008-02-05 10:23:51,116.65288,39.90066 287 | 36,2008-02-05 10:53:51,116.65271,39.90026 288 | 36,2008-02-05 11:03:51,116.65291,39.90064 289 | 36,2008-02-05 11:13:51,116.65292,39.90059 290 | 36,2008-02-05 11:23:51,116.65309,39.90075 291 | 36,2008-02-05 11:33:51,116.66576,39.88773 292 | 36,2008-02-05 11:43:51,116.69419,39.85232 293 | 36,2008-02-05 11:53:51,116.69536,39.85156 294 | 36,2008-02-05 12:03:51,116.69536,39.85155 295 | 36,2008-02-05 12:13:51,116.69533,39.85139 296 | 36,2008-02-05 12:23:51,116.6954,39.85146 297 | 36,2008-02-05 12:33:51,116.69542,39.85148 298 | 36,2008-02-05 12:33:51,116.69542,39.85148 299 | 36,2008-02-05 12:43:50,116.69508,39.85228 300 | 36,2008-02-05 12:53:50,116.66277,39.88299 301 | 36,2008-02-05 13:03:50,116.6523,39.89959 302 | 36,2008-02-05 13:13:50,116.63967,39.90582 303 | 36,2008-02-05 13:23:50,116.63015,39.90487 304 | 36,2008-02-05 13:33:50,116.61675,39.9056 305 | 36,2008-02-05 13:43:50,116.5707,39.9114 306 | 36,2008-02-05 13:53:50,116.45552,39.92226 307 | 36,2008-02-05 14:03:50,116.43447,39.96095 308 | 36,2008-02-05 14:13:50,116.42325,39.96817 309 | 36,2008-02-05 14:33:50,116.3094,39.89557 310 | 36,2008-02-05 14:53:50,116.34722,39.88533 311 | 36,2008-02-05 15:03:50,116.36799,39.87015 312 | 36,2008-02-05 15:13:50,116.38052,39.85524 313 | 36,2008-02-05 15:23:50,116.38001,39.84791 314 | 36,2008-02-05 15:44:51,116.4262,39.85662 315 | 36,2008-02-05 15:54:51,116.45353,39.86529 316 | 36,2008-02-05 16:04:51,116.45571,39.90544 317 | 36,2008-02-05 16:14:51,116.45218,39.92149 318 | 36,2008-02-05 16:24:51,116.45217,39.92138 319 | 36,2008-02-05 16:34:51,116.45218,39.92129 320 | 36,2008-02-05 16:44:51,116.45219,39.92129 321 | 36,2008-02-05 16:54:51,116.4522,39.9214 322 | 36,2008-02-05 16:54:51,116.4522,39.9214 323 | 36,2008-02-05 17:04:51,116.44047,39.91305 324 | 36,2008-02-05 17:14:51,116.44785,39.89598 325 | 36,2008-02-05 17:24:51,116.42381,39.90691 326 | 36,2008-02-05 17:34:51,116.45511,39.903 327 | 36,2008-02-05 20:54:37,116.52236,39.91582 328 | 36,2008-02-05 21:04:37,116.5705,39.91378 329 | 36,2008-02-05 21:14:37,116.59377,39.91324 330 | 36,2008-02-05 21:24:37,116.63765,39.89398 331 | 36,2008-02-05 21:34:37,116.66921,39.8775 332 | 36,2008-02-05 22:39:29,116.69555,39.8519 333 | 36,2008-02-05 22:44:37,116.69522,39.8519 334 | 36,2008-02-05 23:05:47,116.69536,39.85178 335 | 36,2008-02-05 23:14:37,116.69537,39.85174 336 | 36,2008-02-06 00:04:21,116.69533,39.8517 337 | 36,2008-02-06 00:04:36,116.69533,39.8517 338 | 36,2008-02-06 00:15:15,116.69533,39.85168 339 | 36,2008-02-06 00:24:36,116.69532,39.85168 340 | 36,2008-02-06 00:34:36,116.69532,39.85167 341 | 36,2008-02-06 00:34:36,116.69532,39.85167 342 | 36,2008-02-06 01:16:30,116.6953,39.85165 343 | 36,2008-02-06 01:24:36,116.69526,39.85141 344 | 36,2008-02-06 01:34:36,116.69526,39.85177 345 | 36,2008-02-06 02:17:24,116.69525,39.8516 346 | 36,2008-02-06 03:35:41,116.69531,39.85161 347 | 36,2008-02-06 03:44:36,116.69544,39.85189 348 | 36,2008-02-06 03:54:36,116.69532,39.8517 349 | 36,2008-02-06 04:04:36,116.69532,39.85173 350 | 36,2008-02-06 10:31:00,116.69319,39.85205 351 | 36,2008-02-06 10:33:08,116.69456,39.8557 352 | 36,2008-02-06 10:43:08,116.6449,39.88248 353 | 36,2008-02-06 10:53:08,116.64701,39.88547 354 | 36,2008-02-06 11:03:08,116.61369,39.90566 355 | 36,2008-02-06 11:13:08,116.54443,39.90851 356 | 36,2008-02-06 11:23:08,116.54319,39.90864 357 | 36,2008-02-06 14:40:03,116.42566,39.84729 358 | 36,2008-02-06 14:50:03,116.43176,39.86462 359 | 36,2008-02-06 15:00:03,116.46694,39.86996 360 | 36,2008-02-06 15:10:03,116.49218,39.87743 361 | 36,2008-02-06 15:20:03,116.42236,39.90705 362 | 36,2008-02-06 15:30:03,116.38938,39.92187 363 | 36,2008-02-06 15:40:02,116.43873,39.92196 364 | 36,2008-02-06 15:50:02,116.45242,39.9214 365 | 36,2008-02-06 16:00:02,116.45416,39.92177 366 | 36,2008-02-06 16:10:02,116.50102,39.91459 367 | 36,2008-02-06 19:29:14,116.37888,39.89798 368 | 36,2008-02-06 19:39:14,116.40995,39.90392 369 | 36,2008-02-06 19:49:13,116.41858,39.88258 370 | 36,2008-02-06 19:49:13,116.41858,39.88258 371 | 36,2008-02-06 19:59:13,116.4123,39.8919 372 | 36,2008-02-06 20:09:13,116.39169,39.88981 373 | 36,2008-02-06 20:19:13,116.4492,39.89196 374 | 36,2008-02-06 20:29:13,116.49495,39.92177 375 | 36,2008-02-06 20:39:13,116.53842,39.91518 376 | 36,2008-02-06 20:49:13,116.5749,39.91261 377 | 36,2008-02-06 20:59:13,116.61383,39.91244 378 | 36,2008-02-06 21:09:13,116.64421,39.90932 379 | 36,2008-02-06 21:19:13,116.65498,39.88876 380 | 36,2008-02-06 21:29:13,116.69317,39.85218 381 | 36,2008-02-06 21:49:13,116.6953,39.85165 382 | 36,2008-02-06 23:08:56,116.69544,39.85179 383 | 36,2008-02-06 23:09:13,116.69544,39.8518 384 | 36,2008-02-06 23:44:01,116.69542,39.85157 385 | 36,2008-02-06 23:49:13,116.69528,39.85147 386 | 36,2008-02-07 01:21:33,116.69539,39.85165 387 | 36,2008-02-07 01:29:12,116.69535,39.8517 388 | 36,2008-02-07 02:53:03,116.69546,39.8517 389 | 36,2008-02-07 02:59:12,116.69545,39.8517 390 | 36,2008-02-07 03:09:12,116.69544,39.8517 391 | 36,2008-02-07 03:19:12,116.69542,39.85169 392 | 36,2008-02-07 03:56:46,116.69535,39.85155 393 | 36,2008-02-07 03:59:12,116.69536,39.85155 394 | 36,2008-02-07 04:09:12,116.69538,39.85156 395 | 36,2008-02-07 04:19:12,116.69539,39.85158 396 | 36,2008-02-07 05:45:22,116.69508,39.85195 397 | 36,2008-02-07 05:49:11,116.6951,39.85194 398 | 36,2008-02-07 05:59:11,116.69486,39.8519 399 | 36,2008-02-07 06:09:11,116.6951,39.85202 400 | 36,2008-02-07 11:10:55,116.69541,39.85161 401 | 36,2008-02-07 11:14:47,116.69542,39.8516 402 | 36,2008-02-07 11:24:47,116.69544,39.8516 403 | 36,2008-02-07 11:44:46,116.61256,39.90541 404 | 36,2008-02-07 11:54:46,116.51217,39.90652 405 | 36,2008-02-07 15:09:47,116.42226,39.89917 406 | 36,2008-02-07 15:19:46,116.42273,39.90673 407 | 36,2008-02-07 15:29:46,116.43308,39.89209 408 | 36,2008-02-07 15:39:46,116.44654,39.86103 409 | 36,2008-02-07 15:49:46,116.44656,39.86103 410 | 36,2008-02-07 15:59:46,116.44657,39.86102 411 | 36,2008-02-07 16:09:46,116.44658,39.86102 412 | 36,2008-02-07 16:19:46,116.45324,39.86397 413 | 36,2008-02-07 16:29:46,116.46586,39.89185 414 | 36,2008-02-07 16:39:46,116.4561,39.88336 415 | 36,2008-02-07 16:49:46,116.44954,39.87467 416 | 36,2008-02-07 16:59:46,116.38074,39.85282 417 | 36,2008-02-07 17:09:46,116.45174,39.86995 418 | 36,2008-02-07 17:19:46,116.45009,39.87619 419 | 36,2008-02-07 17:29:46,116.45511,39.87131 420 | 36,2008-02-07 17:39:46,116.47145,39.90648 421 | 36,2008-02-07 21:00:31,116.68544,39.86993 422 | 36,2008-02-07 21:10:30,116.6954,39.85178 423 | 36,2008-02-07 22:54:21,116.69544,39.85149 424 | 36,2008-02-07 23:00:30,116.69544,39.8515 425 | 36,2008-02-08 00:04:48,116.69531,39.85157 426 | 36,2008-02-08 00:10:29,116.69532,39.85158 427 | 36,2008-02-08 00:10:29,116.69532,39.85158 428 | 36,2008-02-08 01:11:33,116.69535,39.85179 429 | 36,2008-02-08 01:20:29,116.69528,39.85183 430 | 36,2008-02-08 02:56:08,116.69552,39.85177 431 | 36,2008-02-08 03:00:29,116.69551,39.85177 432 | 36,2008-02-08 03:10:29,116.69549,39.85176 433 | 36,2008-02-08 04:21:48,116.69539,39.85194 434 | 36,2008-02-08 04:21:48,116.69539,39.85194 435 | 36,2008-02-08 04:30:28,116.69537,39.85122 436 | 36,2008-02-08 04:40:28,116.69571,39.85187 437 | 36,2008-02-08 04:50:28,116.6956,39.85212 438 | 36,2008-02-08 06:17:24,116.69549,39.85159 439 | 36,2008-02-08 06:20:28,116.6956,39.85129 440 | 36,2008-02-08 06:30:28,116.6954,39.85181 441 | 36,2008-02-08 06:40:28,116.69539,39.85175 442 | 36,2008-02-08 06:50:28,116.69541,39.85172 443 | 36,2008-02-08 07:00:28,116.69542,39.85168 444 | 36,2008-02-08 11:34:09,116.69365,39.85182 445 | 36,2008-02-08 11:37:18,116.69284,39.85963 446 | 36,2008-02-08 11:47:18,116.64503,39.89151 447 | 36,2008-02-08 11:57:18,116.62029,39.90579 448 | 36,2008-02-08 12:06:25,116.61994,39.90585 449 | 36,2008-02-08 12:07:19,116.53804,39.90827 450 | 36,2008-02-08 15:22:58,116.4154,39.8682 451 | 36,2008-02-08 15:32:58,116.41311,39.89162 452 | 36,2008-02-08 15:42:58,116.3802,39.88843 453 | 36,2008-02-08 15:52:58,116.34825,39.88814 454 | 36,2008-02-08 15:52:58,116.34825,39.88814 455 | 36,2008-02-08 16:02:58,116.30448,39.92853 456 | 36,2008-02-08 16:12:58,116.27811,39.95968 457 | 36,2008-02-08 16:22:58,116.30442,39.96161 458 | 36,2008-02-08 16:32:58,116.34307,39.9661 459 | 36,2008-02-08 16:42:58,116.34704,39.99125 460 | 36,2008-02-08 16:52:58,116.32846,39.99134 461 | 36,2008-02-08 17:02:58,116.29969,39.98107 462 | 36,2008-02-08 17:12:58,116.34611,39.96635 463 | 36,2008-02-08 17:22:58,116.37287,39.96824 464 | 36,2008-02-08 17:32:58,116.37288,39.96824 465 | -------------------------------------------------------------------------------- /data2/37.txt: -------------------------------------------------------------------------------- 1 | 37,2008-02-03 02:58:32,116.4972,39.95165 2 | 37,2008-02-03 03:04:32,116.48377,39.97255 3 | 37,2008-02-03 03:10:32,115.8803,39.8576 4 | 37,2008-02-03 03:18:06,116.50205,39.99727 5 | 37,2008-02-03 05:46:31,116.50258,39.99685 6 | 37,2008-02-03 05:56:29,116.5021,39.99692 7 | 37,2008-02-03 06:21:18,116.50217,39.99687 8 | 37,2008-02-03 10:10:39,116.50227,39.997 9 | 37,2008-02-03 10:16:46,116.50223,39.99697 10 | 37,2008-02-03 10:23:07,116.50218,39.99697 11 | 37,2008-02-03 10:39:32,116.46693,40.05162 12 | 37,2008-02-03 10:51:32,116.46693,40.05162 13 | 37,2008-02-03 10:57:32,116.46693,40.05162 14 | 37,2008-02-03 11:03:32,116.46693,40.05162 15 | 37,2008-02-03 11:16:02,116.46693,40.05162 16 | 37,2008-02-03 11:22:02,116.46693,40.05162 17 | 37,2008-02-03 11:36:28,116.50033,39.97052 18 | 37,2008-02-03 11:42:28,116.50062,39.97078 19 | 37,2008-02-03 11:48:28,116.47632,39.96837 20 | 37,2008-02-03 11:56:06,116.48355,39.92923 21 | 37,2008-02-03 12:02:06,116.46118,39.90593 22 | 37,2008-02-03 12:09:36,116.4673,39.90807 23 | 37,2008-02-03 12:32:06,116.46542,39.9086 24 | 37,2008-02-03 12:38:06,116.44732,39.90707 25 | 37,2008-02-03 12:44:06,116.41952,39.90715 26 | 37,2008-02-03 12:50:06,116.39453,39.90648 27 | 37,2008-02-03 13:03:00,116.37377,39.9262 28 | 37,2008-02-03 13:09:00,116.36702,39.93187 29 | 37,2008-02-03 13:15:00,116.36702,39.93187 30 | 37,2008-02-03 13:21:00,116.36702,39.93187 31 | 37,2008-02-03 13:27:00,116.36702,39.93187 32 | 37,2008-02-03 13:33:04,116.31737,39.95497 33 | 37,2008-02-03 14:43:29,116.4147,39.90067 34 | 37,2008-02-03 14:49:29,116.39627,39.89938 35 | 37,2008-02-03 14:55:37,116.3891,39.89893 36 | 37,2008-02-03 15:14:04,116.42188,39.9057 37 | 37,2008-02-03 15:26:04,116.45628,39.9059 38 | 37,2008-02-03 15:32:04,116.20937,39.94265 39 | 37,2008-02-03 15:38:04,116.08045,39.94382 40 | 37,2008-02-03 15:44:04,116.08045,39.94382 41 | 37,2008-02-03 15:50:04,116.08045,39.94382 42 | 37,2008-02-03 15:56:04,115.876,40.02363 43 | 37,2008-02-03 16:02:04,115.876,40.02363 44 | 37,2008-02-03 16:08:04,116.08935,39.72735 45 | 37,2008-02-03 16:19:25,116.50228,39.99747 46 | 37,2008-02-03 16:25:25,116.48628,39.98977 47 | 37,2008-02-03 17:52:00,116.31073,39.90482 48 | 37,2008-02-03 17:59:26,116.30672,39.90693 49 | 37,2008-02-03 18:05:26,116.30443,39.92107 50 | 37,2008-02-03 18:15:56,116.3067,39.93957 51 | 37,2008-02-03 18:21:56,116.34678,39.93868 52 | 37,2008-02-03 18:27:56,116.3498,39.93978 53 | 37,2008-02-03 18:38:50,116.33588,39.94665 54 | 37,2008-02-03 18:44:50,116.32862,39.96102 55 | 37,2008-02-03 18:50:50,116.34767,39.96632 56 | 37,2008-02-03 18:56:50,116.38782,39.96702 57 | 37,2008-02-03 19:08:50,116.40133,39.97795 58 | 37,2008-02-03 19:20:50,116.38038,40.0046 59 | 37,2008-02-03 19:26:50,116.38163,39.97588 60 | 37,2008-02-03 19:32:50,116.38883,39.95652 61 | 37,2008-02-03 19:38:50,116.40323,39.94757 62 | 37,2008-02-03 19:44:50,116.4275,39.93468 63 | 37,2008-02-03 19:52:09,116.44288,39.93215 64 | 37,2008-02-03 19:58:09,116.44417,39.93725 65 | 37,2008-02-03 20:04:09,116.44427,39.94197 66 | 37,2008-02-03 20:10:09,116.44935,39.94697 67 | 37,2008-02-03 20:16:09,116.46243,39.9459 68 | 37,2008-02-03 20:22:39,116.4644,39.94287 69 | 37,2008-02-03 20:28:48,116.46523,39.94243 70 | 37,2008-02-03 20:34:48,116.46505,39.94358 71 | 37,2008-02-03 20:40:48,116.46137,39.95487 72 | 37,2008-02-03 20:47:08,116.45885,39.94898 73 | 37,2008-02-03 20:53:08,116.4561,39.94808 74 | 37,2008-02-03 20:59:08,116.45332,39.93312 75 | 37,2008-02-03 21:05:08,116.44513,39.93247 76 | 37,2008-02-03 21:11:08,116.43983,39.94923 77 | 37,2008-02-03 21:17:08,116.43642,39.95847 78 | 37,2008-02-03 21:23:08,116.4554,39.94875 79 | 37,2008-02-03 21:29:28,116.45652,39.94808 80 | 37,2008-02-03 21:35:28,116.46765,39.9659 81 | 37,2008-02-03 21:41:28,116.89048,40.19728 82 | 37,2008-02-03 21:47:28,116.95928,40.23453 83 | 37,2008-02-03 21:53:28,116.95928,40.23453 84 | 37,2008-02-03 21:59:28,116.95928,40.23453 85 | 37,2008-02-03 22:05:28,116.95928,40.23453 86 | 37,2008-02-03 22:11:28,116.95928,40.23453 87 | 37,2008-02-03 22:38:54,116.48942,39.97062 88 | 37,2008-02-03 22:44:54,116.48295,39.9612 89 | 37,2008-02-03 22:50:54,116.49075,39.95452 90 | 37,2008-02-03 22:56:54,116.47462,39.9541 91 | 37,2008-02-03 23:02:54,116.05975,41.31433 92 | 37,2008-02-03 23:08:54,116.05932,41.49725 93 | 37,2008-02-03 23:14:54,116.05932,41.49725 94 | 37,2008-02-03 23:20:54,115.26935,41.71935 95 | 37,2008-02-03 23:26:54,115.26935,41.71935 96 | 37,2008-02-03 23:32:54,115.26935,41.71935 97 | 37,2008-02-03 23:38:54,115.26935,41.71935 98 | 37,2008-02-03 23:44:54,115.26935,41.71935 99 | 37,2008-02-03 23:44:54,115.26935,41.71935 100 | 37,2008-02-03 23:57:03,111.38733,39.0336 101 | 37,2008-02-04 00:03:03,111.38733,39.0336 102 | 37,2008-02-04 00:09:03,111.38733,39.0336 103 | 37,2008-02-04 00:09:03,111.38733,39.0336 104 | 37,2008-02-04 00:15:14,116.42427,39.86705 105 | 37,2008-02-04 00:21:35,116.4147,39.88188 106 | 37,2008-02-04 00:28:31,116.41233,39.89928 107 | 37,2008-02-04 00:28:31,116.41233,39.89928 108 | 37,2008-02-04 00:34:31,116.40012,39.89943 109 | 37,2008-02-04 00:40:31,116.36878,39.90593 110 | 37,2008-02-04 00:47:00,116.31558,39.90615 111 | 37,2008-02-04 00:53:00,116.09217,39.77852 112 | 37,2008-02-04 00:59:00,115.82247,39.55643 113 | 37,2008-02-04 01:05:00,115.80677,39.48942 114 | 37,2008-02-04 01:11:00,115.85933,39.51397 115 | 37,2008-02-04 01:17:00,116.36592,39.89818 116 | 37,2008-02-04 01:23:00,116.36693,39.92953 117 | 37,2008-02-04 01:29:01,116.3993,39.93203 118 | 37,2008-02-04 01:35:01,116.41977,39.93963 119 | 37,2008-02-04 01:41:01,116.45595,39.94157 120 | 37,2008-02-04 01:41:01,116.45595,39.94157 121 | 37,2008-02-04 01:47:01,116.47938,39.98695 122 | 37,2008-02-04 01:55:32,116.4765,39.96933 123 | 37,2008-02-04 01:55:32,116.4765,39.96933 124 | 37,2008-02-04 02:01:32,116.4765,39.96933 125 | 37,2008-02-04 02:19:32,116.4765,39.96933 126 | 37,2008-02-04 02:26:02,116.4765,39.96933 127 | 37,2008-02-04 06:46:44,116.50162,39.99753 128 | 37,2008-02-04 07:42:31,116.50162,39.99742 129 | 37,2008-02-04 07:53:39,116.49932,39.99532 130 | 37,2008-02-04 08:54:19,116.50187,39.99742 131 | 37,2008-02-04 11:02:05,116.50215,39.99713 132 | 37,2008-02-04 11:08:05,116.5091,39.97472 133 | 37,2008-02-04 11:24:48,116.50072,39.97067 134 | 37,2008-02-04 11:46:33,116.46595,39.97727 135 | 37,2008-02-04 11:52:33,116.46595,39.97727 136 | 37,2008-02-04 11:58:33,116.46595,39.97727 137 | 37,2008-02-04 12:04:33,116.46595,39.97727 138 | 37,2008-02-04 12:04:33,116.46595,39.97727 139 | 37,2008-02-04 12:10:33,116.46595,39.97727 140 | 37,2008-02-04 12:23:02,116.46595,39.97727 141 | 37,2008-02-04 12:29:02,116.46595,39.97727 142 | 37,2008-02-04 12:35:02,116.46595,39.97727 143 | 37,2008-02-04 12:41:02,116.46595,39.97727 144 | 37,2008-02-04 12:47:02,116.46595,39.97727 145 | 37,2008-02-04 13:18:02,116.46595,39.97727 146 | 37,2008-02-04 13:24:02,116.46595,39.97727 147 | 37,2008-02-04 13:30:02,116.46595,39.97727 148 | 37,2008-02-04 13:36:02,116.46595,39.97727 149 | 37,2008-02-04 13:56:02,116.46595,39.97727 150 | 37,2008-02-04 14:02:02,116.46595,39.97727 151 | 37,2008-02-04 14:08:02,116.46595,39.97727 152 | 37,2008-02-04 14:14:02,116.46595,39.97727 153 | 37,2008-02-04 14:20:02,116.46595,39.97727 154 | 37,2008-02-04 14:30:02,116.46595,39.97727 155 | 37,2008-02-04 14:36:02,116.46595,39.97727 156 | 37,2008-02-04 14:42:02,116.46595,39.97727 157 | 37,2008-02-04 14:48:02,116.46595,39.97727 158 | 37,2008-02-04 14:54:02,116.46595,39.97727 159 | 37,2008-02-04 15:10:33,116.46595,39.97727 160 | 37,2008-02-04 15:16:33,116.46595,39.97727 161 | 37,2008-02-04 15:22:33,116.46595,39.97727 162 | 37,2008-02-04 15:22:33,116.46595,39.97727 163 | 37,2008-02-04 15:54:03,116.46595,39.97727 164 | 37,2008-02-04 16:00:03,116.46595,39.97727 165 | 37,2008-02-04 16:06:03,116.46595,39.97727 166 | 37,2008-02-04 16:06:03,116.46595,39.97727 167 | 37,2008-02-04 16:12:03,116.46595,39.97727 168 | 37,2008-02-04 16:18:03,116.46595,39.97727 169 | 37,2008-02-04 16:26:32,116.46595,39.97727 170 | 37,2008-02-04 16:32:32,116.46595,39.97727 171 | 37,2008-02-04 16:38:49,116.45548,39.93285 172 | 37,2008-02-04 16:44:49,116.47297,39.92413 173 | 37,2008-02-04 16:44:49,116.47297,39.92413 174 | 37,2008-02-04 16:50:49,116.47262,39.92092 175 | 37,2008-02-04 16:55:06,116.47262,39.92092 176 | 37,2008-02-04 16:55:10,116.47262,39.92092 177 | 37,2008-02-04 17:10:45,116.46758,39.90992 178 | 37,2008-02-04 17:30:41,116.46607,39.91012 179 | 37,2008-02-04 17:36:44,116.45043,39.90688 180 | 37,2008-02-04 17:42:59,116.4227,39.90685 181 | 37,2008-02-04 17:48:59,116.39833,39.90655 182 | 37,2008-02-04 18:01:16,116.37013,39.90785 183 | 37,2008-02-04 18:07:16,116.36782,39.90442 184 | 37,2008-02-04 18:14:28,116.36798,39.90052 185 | 37,2008-02-04 18:22:25,116.36798,39.89907 186 | 37,2008-02-04 18:30:03,116.3681,39.88872 187 | 37,2008-02-04 18:36:03,116.36805,39.86898 188 | 37,2008-02-04 18:36:03,116.36805,39.86898 189 | 37,2008-02-04 18:42:03,116.39347,39.85588 190 | 37,2008-02-04 18:53:56,116.4062,39.84823 191 | 37,2008-02-04 19:00:28,116.40813,39.85388 192 | 37,2008-02-04 19:06:28,116.41587,39.85745 193 | 37,2008-02-04 19:13:03,116.42658,39.86445 194 | 37,2008-02-04 19:20:37,116.43233,39.86452 195 | 37,2008-02-04 19:26:37,116.43863,39.87317 196 | 37,2008-02-04 19:43:56,116.44583,39.88025 197 | 37,2008-02-04 19:51:48,116.46068,39.87483 198 | 37,2008-02-04 19:57:49,116.46665,39.86668 199 | 37,2008-02-04 20:03:49,116.4544,39.8692 200 | 37,2008-02-04 20:09:49,116.42035,39.85695 201 | 37,2008-02-04 20:15:49,116.40783,39.85255 202 | 37,2008-02-04 20:23:47,116.40445,39.8525 203 | 37,2008-02-04 20:29:47,116.44542,39.8592 204 | 37,2008-02-04 20:35:47,116.45577,39.88302 205 | 37,2008-02-04 20:41:47,116.48758,39.87472 206 | 37,2008-02-04 20:47:47,116.48587,39.8746 207 | 37,2008-02-04 20:53:47,116.48587,39.8746 208 | 37,2008-02-04 20:59:47,116.48587,39.8746 209 | 37,2008-02-04 21:11:47,116.545,39.91182 210 | 37,2008-02-04 21:39:11,116.52395,39.91588 211 | 37,2008-02-04 21:51:11,116.80132,40.11568 212 | 37,2008-02-04 22:09:11,116.49845,39.93037 213 | 37,2008-02-04 22:15:11,116.4813,39.93247 214 | 37,2008-02-04 22:21:11,116.45612,39.93257 215 | 37,2008-02-04 22:27:11,116.43303,39.96675 216 | 37,2008-02-04 22:33:11,116.42275,39.98782 217 | 37,2008-02-04 22:39:11,116.37933,39.99642 218 | 37,2008-02-04 22:53:38,116.37758,40.00043 219 | 37,2008-02-04 22:59:38,116.40162,40.00082 220 | 37,2008-02-04 23:08:04,116.40118,39.99207 221 | 37,2008-02-04 23:17:49,116.4012,39.99097 222 | 37,2008-02-04 23:23:49,118.45998,43.2686 223 | 37,2008-02-04 23:59:49,116.23572,39.94883 224 | 37,2008-02-05 00:05:49,116.2679,39.94563 225 | 37,2008-02-05 00:11:49,116.29492,39.95823 226 | 37,2008-02-05 00:18:32,116.3147,39.9653 227 | 37,2008-02-05 00:24:32,116.3475,39.98243 228 | 37,2008-02-05 00:30:32,116.34637,40.0059 229 | 37,2008-02-05 00:36:32,116.35057,40.0215 230 | 37,2008-02-05 00:42:32,115.79022,40.02797 231 | 37,2008-02-05 00:48:32,115.59227,40.02752 232 | 37,2008-02-05 00:54:32,116.3605,40.0051 233 | 37,2008-02-05 01:01:44,116.35255,40.02958 234 | 37,2008-02-05 01:07:44,116.34588,40.01307 235 | 37,2008-02-05 01:13:44,116.37992,40.0084 236 | 37,2008-02-05 01:19:49,116.40118,39.99083 237 | 37,2008-02-05 01:25:49,116.41057,39.98707 238 | 37,2008-02-05 01:31:49,116.41057,39.98707 239 | 37,2008-02-05 01:37:49,116.41057,39.98707 240 | 37,2008-02-05 01:43:49,116.41057,39.98707 241 | 37,2008-02-05 01:49:49,116.41057,39.98707 242 | 37,2008-02-05 01:55:49,116.41057,39.98707 243 | 37,2008-02-05 01:55:49,116.41057,39.98707 244 | 37,2008-02-05 03:58:44,116.50162,39.99772 245 | 37,2008-02-05 07:48:24,116.50298,40.0006 246 | 37,2008-02-05 10:04:02,116.50168,39.99777 247 | 37,2008-02-05 10:04:02,116.50168,39.99777 248 | 37,2008-02-05 10:59:27,116.50168,39.99755 249 | 37,2008-02-05 11:11:22,116.50193,39.99713 250 | 37,2008-02-05 11:17:22,116.50443,39.97182 251 | 37,2008-02-05 11:43:56,116.5002,39.97077 252 | 37,2008-02-05 11:49:56,116.48932,39.97068 253 | 37,2008-02-05 12:01:56,116.48278,39.9084 254 | 37,2008-02-05 12:07:56,116.45147,39.9029 255 | 37,2008-02-05 12:25:56,116.45587,39.90245 256 | 37,2008-02-05 12:31:56,116.48445,39.92132 257 | 37,2008-02-05 12:37:56,116.49988,39.93027 258 | 37,2008-02-05 12:43:56,116.49558,39.94 259 | 37,2008-02-05 12:50:13,116.49583,39.92715 260 | 37,2008-02-05 12:56:13,116.47257,39.92168 261 | 37,2008-02-05 13:24:07,116.44175,39.93992 262 | 37,2008-02-05 13:31:21,116.45492,39.94785 263 | 37,2008-02-05 13:40:36,116.45467,39.95093 264 | 37,2008-02-05 13:46:36,116.45522,39.93378 265 | 37,2008-02-05 13:52:51,116.47198,39.92723 266 | 37,2008-02-05 14:04:51,116.42982,39.96798 267 | 37,2008-02-05 14:10:51,116.42982,39.96798 268 | 37,2008-02-05 14:16:51,116.37323,39.95815 269 | 37,2008-02-05 14:31:24,116.37918,39.96085 270 | 37,2008-02-05 14:39:36,116.37987,39.96057 271 | 37,2008-02-05 14:45:55,116.38828,39.98093 272 | 37,2008-02-05 14:51:55,116.40162,40.00205 273 | 37,2008-02-05 14:57:55,116.3981,40.0039 274 | 37,2008-02-05 15:06:42,116.3982,40.00395 275 | 37,2008-02-05 15:12:48,116.40137,39.9937 276 | 37,2008-02-05 15:24:15,116.40018,39.99083 277 | 37,2008-02-05 15:30:15,116.41787,39.98833 278 | 37,2008-02-05 15:40:10,116.41432,39.99263 279 | 37,2008-02-05 15:46:10,116.41168,39.96938 280 | 37,2008-02-05 15:52:50,116.41215,39.95807 281 | 37,2008-02-05 15:52:50,116.41215,39.95807 282 | 37,2008-02-05 15:58:50,116.3738,39.94753 283 | 37,2008-02-05 16:04:50,116.34953,39.934 284 | 37,2008-02-05 16:10:55,116.35002,39.91808 285 | 37,2008-02-05 16:18:36,116.35067,39.91112 286 | 37,2008-02-05 16:24:38,116.34703,39.91243 287 | 37,2008-02-05 16:30:38,116.33162,39.92185 288 | 37,2008-02-05 16:30:38,116.33162,39.92185 289 | 37,2008-02-05 16:36:38,116.33133,39.9367 290 | 37,2008-02-05 16:42:38,116.36383,39.94745 291 | 37,2008-02-05 16:48:38,116.3641,39.96372 292 | 37,2008-02-05 16:54:38,116.36855,39.9672 293 | 37,2008-02-05 17:19:38,116.41998,39.91403 294 | 37,2008-02-05 17:25:38,116.41232,39.91403 295 | 37,2008-02-05 17:31:38,116.42822,39.92273 296 | 37,2008-02-05 17:37:38,116.42808,39.92737 297 | 37,2008-02-05 17:43:38,116.45498,39.95018 298 | 37,2008-02-05 17:49:38,116.45612,39.94808 299 | 37,2008-02-05 17:55:38,116.4783,39.96027 300 | 37,2008-02-05 18:01:38,116.4766,39.9681 301 | 37,2008-02-05 18:10:51,116.47542,39.96582 302 | 37,2008-02-05 18:17:43,116.47517,39.96577 303 | 37,2008-02-05 18:23:43,116.47238,39.97852 304 | 37,2008-02-05 19:16:02,116.44025,39.94885 305 | 37,2008-02-05 19:22:02,116.43705,39.94198 306 | 37,2008-02-05 19:50:55,116.45665,39.94818 307 | 37,2008-02-05 19:56:55,116.4836,39.94837 308 | 37,2008-02-05 20:02:55,116.48357,39.89007 309 | 37,2008-02-05 20:08:55,116.47148,39.88887 310 | 37,2008-02-05 20:14:55,116.47178,39.90277 311 | 37,2008-02-05 20:20:55,116.96643,42.46482 312 | 37,2008-02-05 20:26:55,116.35122,41.31805 313 | 37,2008-02-05 20:32:55,116.12833,40.53605 314 | 37,2008-02-05 20:38:55,116.11487,40.46983 315 | 37,2008-02-05 20:44:55,116.11487,40.46983 316 | 37,2008-02-05 20:50:55,116.11487,40.46983 317 | 37,2008-02-05 20:56:55,116.11487,40.46983 318 | 37,2008-02-05 21:02:55,116.11487,40.46983 319 | 37,2008-02-05 21:08:55,116.11487,40.46983 320 | 37,2008-02-05 21:14:55,116.11487,40.46983 321 | 37,2008-02-05 21:20:55,116.11487,40.46983 322 | 37,2008-02-05 21:26:55,116.11487,40.46983 323 | 37,2008-02-05 21:32:55,116.11487,40.46983 324 | 37,2008-02-05 21:44:32,116.11487,40.46983 325 | 37,2008-02-05 21:50:32,116.11487,40.46983 326 | 37,2008-02-05 21:56:32,116.11487,40.46983 327 | 37,2008-02-05 22:02:32,116.11487,40.46983 328 | 37,2008-02-05 22:08:32,116.11487,40.46983 329 | 37,2008-02-05 22:14:33,116.11487,40.46983 330 | 37,2008-02-05 22:20:33,116.11487,40.46983 331 | 37,2008-02-05 22:26:33,116.11487,40.46983 332 | 37,2008-02-05 22:32:33,116.11487,40.46983 333 | 37,2008-02-05 22:38:33,116.11487,40.46983 334 | 37,2008-02-05 23:08:33,116.11487,40.46983 335 | 37,2008-02-05 23:14:33,116.11487,40.46983 336 | 37,2008-02-05 23:20:33,116.11487,40.46983 337 | 37,2008-02-05 23:26:33,116.11487,40.46983 338 | 37,2008-02-05 23:32:33,116.11487,40.46983 339 | 37,2008-02-05 23:38:33,116.11487,40.46983 340 | 37,2008-02-05 23:51:48,116.44433,39.9146 341 | 37,2008-02-05 23:57:48,116.45118,39.922 342 | 37,2008-02-06 00:03:48,116.45952,39.94908 343 | 37,2008-02-06 00:09:48,116.48432,39.9648 344 | 37,2008-02-06 00:09:48,116.48432,39.9648 345 | 37,2008-02-06 00:15:54,116.49872,39.97158 346 | 37,2008-02-06 00:21:54,116.4709,39.97273 347 | 37,2008-02-06 00:33:58,116.48367,39.93663 348 | 37,2008-02-06 00:33:58,116.48367,39.93663 349 | 37,2008-02-06 00:45:58,116.51262,39.87193 350 | 37,2008-02-06 00:51:58,116.52833,39.88073 351 | 37,2008-02-06 00:57:58,116.54212,39.878 352 | 37,2008-02-06 01:03:58,116.54212,39.878 353 | 37,2008-02-06 13:54:33,116.4834,39.98615 354 | 37,2008-02-06 14:08:46,116.47067,39.96845 355 | 37,2008-02-06 14:14:46,116.45102,39.95095 356 | 37,2008-02-06 14:40:29,116.45043,39.95047 357 | 37,2008-02-06 14:46:29,116.4756,39.9703 358 | 37,2008-02-06 14:58:29,116.46193,39.9956 359 | 37,2008-02-06 16:23:57,116.48162,39.98782 360 | 37,2008-02-06 16:32:50,116.48257,39.98855 361 | 37,2008-02-06 16:38:50,116.51053,40.0141 362 | 37,2008-02-06 16:44:50,116.53463,40.05302 363 | 37,2008-02-06 16:50:50,116.55562,40.10287 364 | 37,2008-02-06 16:57:00,116.60558,40.11632 365 | 37,2008-02-06 17:15:10,116.82248,40.14897 366 | 37,2008-02-06 17:33:10,117.06665,40.13743 367 | 37,2008-02-06 17:39:10,117.09035,40.14385 368 | 37,2008-02-06 17:45:10,117.12155,40.15685 369 | 37,2008-02-06 17:51:10,117.1501,40.18027 370 | 37,2008-02-06 20:16:08,117.14433,40.18112 371 | 37,2008-02-06 20:33:28,117.14437,40.18105 372 | 37,2008-02-06 22:44:15,117.1442,40.18098 373 | 37,2008-02-06 23:01:30,117.14415,40.181 374 | 37,2008-02-06 23:52:47,117.20023,40.22728 375 | 37,2008-02-07 00:12:51,117.1441,40.18113 376 | 37,2008-02-07 01:56:32,117.145,40.18023 377 | 37,2008-02-07 01:56:32,117.145,40.18023 378 | 37,2008-02-07 03:09:12,117.10898,40.17112 379 | 37,2008-02-07 07:05:08,117.14427,40.18107 380 | 37,2008-02-07 16:49:39,117.14397,40.18102 381 | 37,2008-02-07 20:29:54,117.1445,40.18107 382 | 37,2008-02-07 21:17:03,117.14422,40.18115 383 | 37,2008-02-07 22:23:02,117.14425,40.18103 384 | 37,2008-02-07 22:58:39,117.1461,40.18128 385 | 37,2008-02-07 23:18:12,117.14445,40.18102 386 | 37,2008-02-08 00:07:22,117.1444,40.18115 387 | 37,2008-02-08 00:32:02,117.14415,40.18085 388 | 37,2008-02-08 00:38:02,117.14365,40.1791 389 | 37,2008-02-08 00:44:02,117.1418,40.17585 390 | 37,2008-02-08 00:51:42,117.14408,40.18087 391 | 37,2008-02-08 00:57:42,117.1422,40.17832 392 | 37,2008-02-08 01:04:22,117.14407,40.18117 393 | 37,2008-02-08 01:11:09,117.14412,40.18097 394 | 37,2008-02-08 01:47:26,117.14428,40.18103 395 | 37,2008-02-08 01:53:26,117.14392,40.18288 396 | 37,2008-02-08 01:59:26,117.14758,40.19312 397 | 37,2008-02-08 02:23:26,121.32198,42.65197 398 | 37,2008-02-08 02:47:26,121.94853,41.28022 399 | 37,2008-02-08 02:53:26,121.65883,40.85175 400 | 37,2008-02-08 02:59:26,120.94987,41.01968 401 | 37,2008-02-08 03:05:26,121.26997,40.58587 402 | 37,2008-02-08 03:11:26,121.83808,40.22915 403 | 37,2008-02-08 03:17:26,121.42138,40.06363 404 | 37,2008-02-08 03:23:26,122.35623,39.82913 405 | 37,2008-02-08 03:49:03,122.36122,39.82773 406 | 37,2008-02-08 03:55:03,122.36122,39.82773 407 | 37,2008-02-08 04:01:03,122.36122,39.82773 408 | 37,2008-02-08 04:07:03,122.36122,39.82773 409 | 37,2008-02-08 04:07:03,122.36122,39.82773 410 | 37,2008-02-08 04:13:03,122.36122,39.82773 411 | 37,2008-02-08 04:26:03,122.36122,39.82773 412 | 37,2008-02-08 04:32:03,122.36122,39.82773 413 | 37,2008-02-08 04:38:03,122.36122,39.82773 414 | 37,2008-02-08 04:50:03,122.36122,39.82773 415 | 37,2008-02-08 04:59:03,122.36122,39.82773 416 | 37,2008-02-08 05:05:03,122.36122,39.82773 417 | 37,2008-02-08 05:11:03,122.36122,39.82773 418 | 37,2008-02-08 05:17:03,122.36122,39.82773 419 | 37,2008-02-08 05:23:03,122.36122,39.82773 420 | 37,2008-02-08 05:51:33,122.36122,39.82773 421 | 37,2008-02-08 05:57:33,122.36122,39.82773 422 | 37,2008-02-08 06:03:33,122.36122,39.82773 423 | 37,2008-02-08 06:23:18,117.1443,40.18112 424 | 37,2008-02-08 07:01:18,117.14422,40.18113 425 | 37,2008-02-08 07:01:18,117.14422,40.18113 426 | 37,2008-02-08 07:26:39,117.14425,40.18115 427 | -------------------------------------------------------------------------------- /data2/40.txt: -------------------------------------------------------------------------------- 1 | 40,2008-02-03 18:06:41,116.42195,39.83889 2 | 40,2008-02-03 18:06:41,116.42195,39.83889 3 | 40,2008-02-04 18:00:55,116.35201,39.84454 4 | 40,2008-02-05 18:11:46,116.4324,39.85744 5 | 40,2008-02-06 18:10:37,116.93691,40.14637 6 | 40,2008-02-07 18:11:03,116.9475,40.14692 7 | 40,2008-02-08 11:52:13,116.98681,40.11028 8 | -------------------------------------------------------------------------------- /data2/43.txt: -------------------------------------------------------------------------------- 1 | 43,2008-02-03 18:10:22,116.43886,39.93526 2 | 43,2008-02-04 18:10:45,116.46635,39.93258 3 | 43,2008-02-05 18:00:20,116.57829,40.04595 4 | 43,2008-02-06 18:00:59,116.53548,40.02166 5 | 43,2008-02-07 18:01:24,116.95158,40.14628 6 | -------------------------------------------------------------------------------- /data2/45.txt: -------------------------------------------------------------------------------- 1 | 45,2008-02-05 04:14:18,116.945,40.1456 2 | 45,2008-02-07 04:11:10,116.90536,40.13959 3 | 45,2008-02-08 04:06:16,116.945,40.14556 4 | -------------------------------------------------------------------------------- /data2/47.txt: -------------------------------------------------------------------------------- 1 | 47,2008-02-03 16:04:40,116.3152,39.96538 2 | 47,2008-02-04 03:43:43,116.82003,40.16303 3 | 47,2008-02-04 05:33:59,116.81998,40.16298 4 | 47,2008-02-04 06:04:08,116.81998,40.16298 5 | 47,2008-02-04 16:05:20,116.3194,39.93843 6 | 47,2008-02-05 16:06:13,116.4576,39.89925 7 | 47,2008-02-06 16:07:32,116.29815,39.95944 8 | 47,2008-02-08 16:05:29,116.28254,39.977 9 | -------------------------------------------------------------------------------- /data2/50.txt: -------------------------------------------------------------------------------- 1 | 50,2008-02-02 13:37:38,116.47246,39.95341 2 | 50,2008-02-02 13:39:51,116.4664,39.9476 3 | 50,2008-02-02 13:42:39,116.46851,39.93762 4 | 50,2008-02-02 13:44:52,116.46851,39.93762 5 | 50,2008-02-02 13:44:52,116.46851,39.93762 6 | 50,2008-02-02 13:47:41,116.46851,39.93762 7 | 50,2008-02-02 13:49:54,116.46851,39.93762 8 | 50,2008-02-02 13:52:43,116.46802,39.9439 9 | 50,2008-02-02 13:54:56,116.45593,39.94353 10 | 50,2008-02-02 13:54:56,116.45593,39.94353 11 | 50,2008-02-02 13:57:44,116.44582,39.93993 12 | 50,2008-02-02 14:02:45,116.42864,39.93963 13 | 50,2008-02-02 14:04:58,116.42783,39.94162 14 | 50,2008-02-02 14:07:47,116.43477,39.94741 15 | 50,2008-02-02 14:12:48,116.44786,39.95708 16 | 50,2008-02-02 14:15:01,116.44358,39.95976 17 | 50,2008-02-02 14:17:50,116.44135,39.96124 18 | 50,2008-02-02 14:20:03,116.44034,39.96198 19 | 50,2008-02-02 14:22:52,116.44034,39.96198 20 | 50,2008-02-02 14:25:05,116.44034,39.96198 21 | 50,2008-02-02 14:27:53,116.44034,39.96198 22 | 50,2008-02-02 14:30:06,116.44034,39.96198 23 | 50,2008-02-02 14:32:55,116.44034,39.96198 24 | 50,2008-02-02 14:35:08,116.43435,39.96562 25 | 50,2008-02-02 14:37:57,116.40457,39.9677 26 | 50,2008-02-02 14:40:10,116.37711,39.96695 27 | 50,2008-02-02 14:42:58,116.37306,39.95354 28 | 50,2008-02-02 14:45:11,116.373,39.95051 29 | 50,2008-02-02 14:48:00,116.36683,39.94746 30 | 50,2008-02-02 14:50:13,116.36632,39.94742 31 | 50,2008-02-02 14:53:02,116.3661,39.94284 32 | 50,2008-02-02 14:55:15,116.37195,39.94116 33 | 50,2008-02-02 14:58:03,116.36512,39.93924 34 | 50,2008-02-02 15:03:05,116.35293,39.93348 35 | 50,2008-02-02 15:05:18,116.35033,39.9311 36 | 50,2008-02-02 15:08:07,116.34644,39.93118 37 | 50,2008-02-02 15:10:20,116.34644,39.93118 38 | 50,2008-02-02 15:13:08,116.34336,39.93205 39 | 50,2008-02-02 15:15:21,116.33807,39.93509 40 | 50,2008-02-02 15:18:10,116.34954,39.93939 41 | 50,2008-02-02 15:23:12,116.39481,39.94755 42 | 50,2008-02-02 15:25:25,116.40192,39.95418 43 | 50,2008-02-02 15:28:13,116.40392,39.9607 44 | 50,2008-02-02 15:30:26,116.40925,39.96365 45 | 50,2008-02-02 15:35:28,116.41113,39.98148 46 | 50,2008-02-02 15:38:17,116.41541,39.98589 47 | 50,2008-02-02 15:40:30,116.41442,39.98775 48 | 50,2008-02-02 15:43:18,116.40171,39.9872 49 | 50,2008-02-02 15:45:31,116.3882,39.98707 50 | 50,2008-02-02 15:48:20,116.38147,39.97893 51 | 50,2008-02-02 15:50:33,116.37964,39.97551 52 | 50,2008-02-02 15:50:33,116.37964,39.97551 53 | 50,2008-02-02 15:53:22,116.37308,39.97874 54 | 50,2008-02-02 15:55:35,116.364,39.9806 55 | 50,2008-02-02 15:58:23,116.36379,39.97158 56 | 50,2008-02-02 16:00:36,116.36349,39.96666 57 | 50,2008-02-02 16:00:36,116.36349,39.96666 58 | 50,2008-02-02 16:03:25,116.36349,39.96666 59 | 50,2008-02-02 16:05:38,116.36349,39.96666 60 | 50,2008-02-02 16:08:27,116.34799,39.9664 61 | 50,2008-02-02 16:10:40,116.33725,39.96641 62 | 50,2008-02-02 16:13:28,116.32531,39.96623 63 | 50,2008-02-02 16:15:41,116.32052,39.96603 64 | 50,2008-02-02 16:18:30,116.31611,39.96266 65 | 50,2008-02-02 16:20:43,116.317,39.95593 66 | 50,2008-02-02 16:23:32,116.30397,39.9557 67 | 50,2008-02-02 16:25:45,116.30316,39.95115 68 | 50,2008-02-02 16:30:46,116.29849,39.94329 69 | 50,2008-02-02 16:33:35,116.28642,39.94664 70 | 50,2008-02-02 16:35:48,116.27482,39.94986 71 | 50,2008-02-02 16:38:37,116.26918,39.96218 72 | 50,2008-02-02 16:40:50,116.2692,39.95611 73 | 50,2008-02-02 16:43:38,116.26927,39.95186 74 | 50,2008-02-02 16:45:51,116.26868,39.94839 75 | 50,2008-02-02 16:48:40,116.26957,39.95759 76 | 50,2008-02-02 16:50:53,116.28318,39.97743 77 | 50,2008-02-02 16:53:42,116.29468,39.98405 78 | 50,2008-02-02 16:55:55,116.28933,39.99373 79 | 50,2008-02-02 16:58:43,116.27936,40.01681 80 | 50,2008-02-02 16:58:43,116.27936,40.01681 81 | 50,2008-02-02 17:00:56,116.28788,40.0228 82 | 50,2008-02-02 17:03:45,116.30664,40.02478 83 | 50,2008-02-02 17:05:58,116.30169,40.03203 84 | 50,2008-02-02 17:08:47,116.30128,40.03561 85 | 50,2008-02-02 17:11:00,116.30119,40.03913 86 | 50,2008-02-02 17:13:48,116.29694,40.03321 87 | 50,2008-02-02 17:16:01,116.29074,40.02378 88 | 50,2008-02-02 17:18:50,116.27694,40.02014 89 | 50,2008-02-02 17:21:03,116.28277,40.00219 90 | 50,2008-02-02 17:23:52,116.29444,39.97988 91 | 50,2008-02-02 17:26:05,116.30093,39.96736 92 | 50,2008-02-02 17:28:53,116.30118,39.96522 93 | 50,2008-02-02 17:31:06,116.30136,39.96392 94 | 50,2008-02-02 17:33:55,116.30172,39.96246 95 | 50,2008-02-02 17:36:08,116.30211,39.9609 96 | 50,2008-02-02 17:38:57,116.30217,39.959 97 | 50,2008-02-02 17:41:10,116.30313,39.95398 98 | 50,2008-02-02 17:43:58,116.3034,39.95117 99 | 50,2008-02-02 17:46:11,116.30371,39.94632 100 | 50,2008-02-02 17:49:00,116.30378,39.94352 101 | 50,2008-02-02 17:51:13,116.30382,39.94182 102 | 50,2008-02-02 17:54:02,116.30387,39.93916 103 | 50,2008-02-02 17:56:15,116.30395,39.93672 104 | 50,2008-02-02 17:59:03,116.30398,39.93372 105 | 50,2008-02-02 18:04:05,116.30425,39.92793 106 | 50,2008-02-02 18:06:17,116.30384,39.92375 107 | 50,2008-02-02 18:06:17,116.30384,39.92375 108 | 50,2008-02-02 18:09:06,116.30466,39.92018 109 | 50,2008-02-02 18:11:19,116.30878,39.91954 110 | 50,2008-02-02 18:14:07,116.30435,39.92104 111 | 50,2008-02-02 18:16:20,116.30427,39.92333 112 | 50,2008-02-02 18:19:09,116.29516,39.9256 113 | 50,2008-02-02 18:21:22,116.30381,39.92571 114 | 50,2008-02-02 18:24:10,116.30382,39.92444 115 | 50,2008-02-02 18:26:24,116.30305,39.92338 116 | 50,2008-02-02 18:29:12,116.303,39.92334 117 | 50,2008-02-02 18:31:25,116.303,39.92334 118 | 50,2008-02-02 18:34:14,116.303,39.92334 119 | 50,2008-02-02 18:39:15,116.29645,39.92274 120 | 50,2008-02-02 18:41:28,116.28264,39.92294 121 | 50,2008-02-02 18:44:17,116.27808,39.92107 122 | 50,2008-02-02 18:46:30,116.27735,39.91031 123 | 50,2008-02-02 18:49:19,116.26913,39.90655 124 | 50,2008-02-02 18:51:32,116.26915,39.91763 125 | 50,2008-02-02 18:54:20,116.26939,39.93585 126 | 50,2008-02-02 18:56:33,116.26873,39.93566 127 | 50,2008-02-02 18:59:22,116.26947,39.95868 128 | 50,2008-02-02 19:01:35,116.2601,39.96862 129 | 50,2008-02-02 19:04:24,116.25138,39.97206 130 | 50,2008-02-02 19:06:37,116.24814,39.97162 131 | 50,2008-02-02 19:09:25,116.2543,39.97209 132 | 50,2008-02-02 19:11:38,116.26233,39.96852 133 | 50,2008-02-02 19:14:27,116.27236,39.96508 134 | 50,2008-02-02 19:16:40,116.28142,39.9648 135 | 50,2008-02-02 19:19:29,116.28144,39.95957 136 | 50,2008-02-02 19:21:42,116.28179,39.95869 137 | 50,2008-02-02 19:24:30,116.28894,39.94651 138 | 50,2008-02-02 19:26:43,116.29014,39.92422 139 | 50,2008-02-02 19:29:32,116.28504,39.923 140 | 50,2008-02-02 19:31:45,116.27919,39.92322 141 | 50,2008-02-02 19:34:34,116.28044,39.92632 142 | 50,2008-02-02 19:36:47,116.28163,39.92301 143 | 50,2008-02-02 19:39:35,116.27852,39.92156 144 | 50,2008-02-02 19:41:48,116.27737,39.91252 145 | 50,2008-02-02 19:44:37,116.27739,39.90821 146 | 50,2008-02-02 19:46:50,116.2774,39.90718 147 | 50,2008-02-02 19:49:39,116.2864,39.90597 148 | 50,2008-02-02 19:51:52,116.28835,39.90598 149 | 50,2008-02-02 19:54:40,116.2891,39.90141 150 | 50,2008-02-02 19:56:53,116.28903,39.89733 151 | 50,2008-02-02 20:01:55,116.28895,39.89009 152 | 50,2008-02-02 20:04:44,116.28901,39.89112 153 | 50,2008-02-02 20:06:57,116.28899,39.89512 154 | 50,2008-02-02 20:09:45,116.27739,39.89766 155 | 50,2008-02-02 20:11:58,116.27527,39.8991 156 | 50,2008-02-02 20:11:58,116.27527,39.8991 157 | 50,2008-02-02 22:40:41,116.2768,39.89929 158 | 50,2008-02-02 22:40:54,116.2768,39.89929 159 | 50,2008-02-02 22:45:43,116.27735,39.90004 160 | 50,2008-02-02 22:45:55,116.27734,39.90008 161 | 50,2008-02-02 22:50:45,116.27744,39.91142 162 | 50,2008-02-02 22:50:57,116.27744,39.91142 163 | 50,2008-02-02 22:55:46,116.28261,39.91994 164 | 50,2008-02-02 22:55:59,116.28261,39.91994 165 | 50,2008-02-02 23:00:48,116.28618,39.92041 166 | 50,2008-02-02 23:01:00,116.28656,39.92039 167 | 50,2008-02-02 23:04:21,116.28785,39.92078 168 | 50,2008-02-03 00:41:46,116.27733,39.91777 169 | 50,2008-02-03 00:42:28,116.27734,39.91334 170 | 50,2008-02-03 00:46:47,116.27741,39.90165 171 | 50,2008-02-03 00:47:29,116.27734,39.899 172 | 50,2008-02-03 00:47:29,116.27734,39.899 173 | 50,2008-02-03 10:14:04,116.275,39.89945 174 | 50,2008-02-03 10:14:51,116.275,39.89945 175 | 50,2008-02-03 10:19:53,116.28657,39.90602 176 | 50,2008-02-03 10:24:07,116.30935,39.90615 177 | 50,2008-02-03 10:29:08,116.33538,39.90592 178 | 50,2008-02-03 10:29:56,116.33632,39.9059 179 | 50,2008-02-03 10:34:10,116.35818,39.90578 180 | 50,2008-02-03 10:39:12,116.39504,39.90631 181 | 50,2008-02-03 10:40:00,116.40025,39.90647 182 | 50,2008-02-03 10:45:01,116.41807,39.90555 183 | 50,2008-02-03 10:54:17,116.42841,39.92641 184 | 50,2008-02-03 10:55:05,116.42835,39.93073 185 | 50,2008-02-03 10:59:18,116.43453,39.92595 186 | 50,2008-02-03 11:00:06,116.43366,39.92286 187 | 50,2008-02-03 11:26:15,116.3336,39.91283 188 | 50,2008-02-03 11:30:40,116.3167,39.90656 189 | 50,2008-02-03 11:31:06,116.3156,39.90749 190 | 50,2008-02-03 11:35:42,116.32927,39.91144 191 | 50,2008-02-03 11:36:24,116.32965,39.91272 192 | 50,2008-02-03 11:41:10,116.33701,39.91276 193 | 50,2008-02-03 11:46:35,116.34662,39.91263 194 | 50,2008-02-03 11:50:47,116.35572,39.91275 195 | 50,2008-02-03 11:55:48,116.36537,39.90766 196 | 50,2008-02-03 11:56:15,116.36537,39.90765 197 | 50,2008-02-03 12:00:50,116.35049,39.90034 198 | 50,2008-02-03 12:05:52,116.34169,39.86174 199 | 50,2008-02-03 12:15:55,116.28253,39.82817 200 | 50,2008-02-03 12:16:21,116.28253,39.82817 201 | 50,2008-02-03 12:21:23,116.28251,39.83518 202 | 50,2008-02-03 12:26:25,116.28395,39.84185 203 | 50,2008-02-03 12:36:02,116.27102,39.85825 204 | 50,2008-02-03 12:36:28,116.26938,39.85814 205 | 50,2008-02-03 12:41:03,116.26907,39.85815 206 | 50,2008-02-03 12:46:31,116.27777,39.8439 207 | 50,2008-02-03 12:51:07,116.27807,39.84392 208 | 50,2008-02-03 12:51:33,116.27778,39.84729 209 | 50,2008-02-03 13:01:10,116.30718,39.86513 210 | 50,2008-02-03 13:01:36,116.30726,39.86718 211 | 50,2008-02-03 13:06:11,116.30545,39.87559 212 | 50,2008-02-03 13:06:37,116.30538,39.87603 213 | 50,2008-02-03 13:11:12,116.30439,39.89204 214 | 50,2008-02-03 13:12:03,116.30676,39.89546 215 | 50,2008-02-03 13:16:14,116.31382,39.89557 216 | 50,2008-02-03 13:16:40,116.31657,39.89567 217 | 50,2008-02-03 13:16:40,116.31657,39.89567 218 | 50,2008-02-03 13:21:16,116.31271,39.89604 219 | 50,2008-02-03 13:21:42,116.31079,39.89604 220 | 50,2008-02-03 13:26:17,116.3041,39.89284 221 | 50,2008-02-03 13:26:17,116.3041,39.89284 222 | 50,2008-02-03 13:26:44,116.30396,39.89053 223 | 50,2008-02-03 13:31:19,116.2947,39.88355 224 | 50,2008-02-03 13:49:45,116.29315,39.88357 225 | 50,2008-02-03 13:54:46,116.28906,39.88777 226 | 50,2008-02-03 13:59:48,116.33238,39.89609 227 | 50,2008-02-03 14:03:35,116.36617,39.89822 228 | 50,2008-02-03 14:04:50,116.36744,39.89825 229 | 50,2008-02-03 14:08:37,116.38551,39.89977 230 | 50,2008-02-03 14:09:51,116.38707,39.90604 231 | 50,2008-02-03 14:09:51,116.38707,39.90604 232 | 50,2008-02-03 14:13:38,116.39645,39.90643 233 | 50,2008-02-03 14:14:53,116.39943,39.90645 234 | 50,2008-02-03 14:19:55,116.42061,39.90503 235 | 50,2008-02-03 14:23:42,116.41967,39.90368 236 | 50,2008-02-03 14:24:56,116.41621,39.90202 237 | 50,2008-02-03 14:28:43,116.41204,39.90623 238 | 50,2008-02-03 14:29:58,116.41747,39.90679 239 | 50,2008-02-03 14:33:45,116.4293,39.91119 240 | 50,2008-02-03 14:35:00,116.42872,39.91931 241 | 50,2008-02-03 14:38:47,116.4287,39.92064 242 | 50,2008-02-03 14:38:47,116.4287,39.92064 243 | 50,2008-02-03 14:40:01,116.4287,39.92064 244 | 50,2008-02-03 14:43:48,116.42858,39.93239 245 | 50,2008-02-03 14:45:03,116.42144,39.93239 246 | 50,2008-02-03 14:50:05,116.41264,39.93239 247 | 50,2008-02-03 14:53:52,116.3969,39.93221 248 | 50,2008-02-03 14:55:06,116.39061,39.93217 249 | 50,2008-02-03 14:58:53,116.36792,39.9314 250 | 50,2008-02-03 15:00:08,116.35716,39.93114 251 | 50,2008-02-03 15:03:55,116.34907,39.95595 252 | 50,2008-02-03 15:05:10,116.35074,39.95659 253 | 50,2008-02-03 15:10:11,116.35515,39.95443 254 | 50,2008-02-03 15:13:58,116.35292,39.94772 255 | 50,2008-02-03 15:15:13,116.3503,39.94767 256 | 50,2008-02-03 15:20:15,116.35287,39.98028 257 | 50,2008-02-03 15:24:02,116.35915,39.98044 258 | 50,2008-02-03 15:25:16,116.35948,39.98007 259 | 50,2008-02-03 15:29:03,116.35216,39.98582 260 | 50,2008-02-03 15:30:18,116.33878,39.98542 261 | 50,2008-02-03 15:34:05,116.29249,39.9836 262 | 50,2008-02-03 15:35:20,116.28101,39.97555 263 | 50,2008-02-03 15:39:07,116.26797,39.94018 264 | 50,2008-02-03 15:40:21,116.26899,39.92784 265 | 50,2008-02-03 15:44:08,116.26524,39.89653 266 | 50,2008-02-03 15:45:23,116.25189,39.89588 267 | 50,2008-02-03 15:49:10,116.24472,39.88853 268 | 50,2008-02-03 15:50:25,116.24472,39.88853 269 | 50,2008-02-03 21:43:30,116.22983,39.89229 270 | 50,2008-02-03 21:44:17,116.23095,39.89558 271 | 50,2008-02-03 21:48:31,116.25258,39.89563 272 | 50,2008-02-03 21:49:19,116.25863,39.89603 273 | 50,2008-02-03 21:53:33,116.26841,39.89889 274 | 50,2008-02-03 21:54:21,116.26849,39.89894 275 | 50,2008-02-03 21:58:35,116.2696,39.89905 276 | 50,2008-02-03 21:59:22,116.27156,39.89906 277 | 50,2008-02-03 22:03:36,116.27525,39.89904 278 | 50,2008-02-03 22:04:24,116.27542,39.899 279 | 50,2008-02-03 22:08:38,116.27679,39.89905 280 | 50,2008-02-03 22:09:26,116.27648,39.89906 281 | 50,2008-02-03 22:13:40,116.27534,39.89912 282 | 50,2008-02-03 22:14:27,116.27531,39.89909 283 | 50,2008-02-03 22:15:54,116.27513,39.89902 284 | 50,2008-02-03 22:21:35,116.2756,39.89863 285 | 50,2008-02-03 22:21:35,116.2756,39.89863 286 | 50,2008-02-03 22:21:35,116.2756,39.89863 287 | 50,2008-02-03 22:21:35,116.2756,39.89863 288 | 50,2008-02-03 22:21:35,116.2756,39.89863 289 | 50,2008-02-03 22:21:35,116.2756,39.89863 290 | 50,2008-02-03 22:21:35,116.2756,39.89863 291 | 50,2008-02-03 22:21:35,116.2756,39.89863 292 | 50,2008-02-03 22:21:35,116.2756,39.89863 293 | 50,2008-02-03 22:21:35,116.2756,39.89863 294 | 50,2008-02-03 22:21:35,116.2756,39.89863 295 | 50,2008-02-03 22:21:35,116.2756,39.89863 296 | 50,2008-02-03 22:21:35,116.2756,39.89863 297 | 50,2008-02-03 22:21:35,116.2756,39.89863 298 | 50,2008-02-03 22:21:35,116.2756,39.89863 299 | 50,2008-02-03 22:21:35,116.2756,39.89863 300 | 50,2008-02-03 22:21:35,116.2756,39.89863 301 | 50,2008-02-03 22:21:35,116.2756,39.89863 302 | 50,2008-02-03 22:21:35,116.2756,39.89863 303 | 50,2008-02-03 22:21:35,116.2756,39.89863 304 | 50,2008-02-03 22:21:35,116.2756,39.89863 305 | 50,2008-02-03 22:21:35,116.2756,39.89863 306 | 50,2008-02-03 22:21:35,116.2756,39.89863 307 | 50,2008-02-04 09:10:37,116.26823,39.90547 308 | 50,2008-02-04 09:11:22,116.26825,39.90873 309 | 50,2008-02-04 09:15:38,116.26957,39.95093 310 | 50,2008-02-04 09:16:23,116.26935,39.95934 311 | 50,2008-02-04 09:20:40,116.29467,39.98401 312 | 50,2008-02-04 09:21:25,116.2939,39.98641 313 | 50,2008-02-04 09:25:42,116.27791,40.01846 314 | 50,2008-02-04 09:26:27,116.27934,40.02087 315 | 50,2008-02-04 09:30:43,116.30426,40.02463 316 | 50,2008-02-04 09:31:28,116.30723,40.02484 317 | 50,2008-02-04 09:35:45,116.31687,40.03477 318 | 50,2008-02-04 09:36:30,116.31725,40.03639 319 | 50,2008-02-04 09:40:47,116.3228,40.0448 320 | 50,2008-02-04 09:41:32,116.3203,40.0474 321 | 50,2008-02-04 09:45:48,116.31721,40.03688 322 | 50,2008-02-04 09:46:33,116.31565,40.03532 323 | 50,2008-02-04 09:50:50,116.30679,40.02831 324 | 50,2008-02-04 09:51:35,116.3073,40.02511 325 | 50,2008-02-04 09:55:52,116.28018,40.02135 326 | 50,2008-02-04 09:56:37,116.27742,40.02018 327 | 50,2008-02-04 10:00:53,116.28543,39.99859 328 | 50,2008-02-04 10:01:38,116.28921,39.9937 329 | 50,2008-02-04 10:05:55,116.26862,39.96444 330 | 50,2008-02-04 10:06:40,116.26959,39.95602 331 | 50,2008-02-04 10:10:56,116.26799,39.90997 332 | 50,2008-02-04 10:11:41,116.2678,39.90319 333 | 50,2008-02-04 10:15:57,116.24687,39.8953 334 | 50,2008-02-04 10:16:42,116.24675,39.88912 335 | 50,2008-02-04 10:20:59,116.23908,39.88883 336 | 50,2008-02-04 10:21:44,116.23908,39.88883 337 | 50,2008-02-04 10:26:01,116.23908,39.88883 338 | 50,2008-02-04 10:26:45,116.23908,39.88883 339 | 50,2008-02-04 10:31:02,116.23908,39.88883 340 | 50,2008-02-04 10:31:47,116.23908,39.88883 341 | 50,2008-02-04 10:35:30,116.23908,39.88883 342 | 50,2008-02-04 11:47:18,116.24679,39.87513 343 | 50,2008-02-04 11:47:44,116.24677,39.87135 344 | 50,2008-02-04 11:52:19,116.23776,39.85888 345 | 50,2008-02-04 11:52:46,116.24222,39.86067 346 | 50,2008-02-04 11:57:21,116.27743,39.8477 347 | 50,2008-02-04 11:57:47,116.27791,39.84331 348 | 50,2008-02-04 12:02:09,116.27945,39.82704 349 | 50,2008-02-04 12:11:38,116.27854,39.82681 350 | 50,2008-02-04 12:15:31,116.28045,39.83847 351 | 50,2008-02-04 12:16:39,116.27766,39.84821 352 | 50,2008-02-04 12:20:32,116.26828,39.88496 353 | 50,2008-02-04 12:21:41,116.26821,39.89457 354 | 50,2008-02-04 12:25:34,116.24683,39.88958 355 | 50,2008-02-04 12:26:43,116.24154,39.88839 356 | 50,2008-02-04 15:23:00,116.2353,39.8882 357 | 50,2008-02-04 15:50:06,116.24067,39.88844 358 | 50,2008-02-04 17:43:37,116.24671,39.88828 359 | 50,2008-02-04 17:43:50,116.2483,39.88829 360 | 50,2008-02-04 17:48:39,116.26924,39.88152 361 | 50,2008-02-04 17:48:52,116.27003,39.87939 362 | 50,2008-02-04 17:53:41,116.2817,39.83247 363 | 50,2008-02-04 17:57:08,116.27974,39.82711 364 | 50,2008-02-04 18:02:48,116.27985,39.82707 365 | 50,2008-02-04 18:12:00,116.28415,39.82981 366 | 50,2008-02-04 18:13:52,116.27898,39.84188 367 | 50,2008-02-04 18:17:02,116.27368,39.87067 368 | 50,2008-02-04 18:18:53,116.26807,39.88942 369 | 50,2008-02-04 18:22:04,116.24772,39.89589 370 | 50,2008-02-04 18:23:55,116.24686,39.89478 371 | 50,2008-02-04 18:26:55,116.23909,39.88882 372 | 50,2008-02-04 18:43:17,116.23552,39.8883 373 | 50,2008-02-04 18:46:06,116.24527,39.88813 374 | 50,2008-02-04 18:54:39,116.24153,39.88895 375 | 50,2008-02-04 19:01:11,116.23911,39.88879 376 | 50,2008-02-04 19:47:48,116.24636,39.88823 377 | 50,2008-02-04 19:48:36,116.24986,39.88826 378 | 50,2008-02-04 19:52:49,116.25862,39.89507 379 | 50,2008-02-04 19:53:37,116.25862,39.89684 380 | 50,2008-02-04 19:57:51,116.25866,39.90624 381 | 50,2008-02-04 19:58:39,116.2587,39.9083 382 | 50,2008-02-04 20:02:53,116.25912,39.90626 383 | 50,2008-02-04 20:03:41,116.25897,39.90626 384 | 50,2008-02-04 20:07:54,116.26769,39.89954 385 | 50,2008-02-04 20:12:56,116.27343,39.89913 386 | 50,2008-02-04 20:13:44,116.27354,39.8991 387 | 50,2008-02-04 20:17:58,116.27736,39.89877 388 | 50,2008-02-04 20:22:59,116.27738,39.89822 389 | 50,2008-02-04 20:23:47,116.27736,39.89852 390 | 50,2008-02-04 20:27:33,116.27538,39.8991 391 | 50,2008-02-04 21:29:26,116.26764,39.89893 392 | 50,2008-02-04 21:34:15,116.25137,39.89093 393 | 50,2008-02-04 21:34:28,116.25131,39.89006 394 | 50,2008-02-04 21:37:59,116.25011,39.88994 395 | 50,2008-02-04 22:25:04,116.25239,39.89203 396 | 50,2008-02-04 22:30:06,116.25875,39.89171 397 | 50,2008-02-04 22:33:39,116.25856,39.89264 398 | 50,2008-02-04 22:35:07,116.25868,39.8926 399 | 50,2008-02-04 23:42:07,116.26751,39.89905 400 | 50,2008-02-04 23:42:56,116.26767,39.89905 401 | 50,2008-02-04 23:47:05,116.27542,39.89889 402 | 50,2008-02-04 23:52:16,116.27517,39.89892 403 | 50,2008-02-04 23:52:16,116.27517,39.89892 404 | 50,2008-02-04 23:52:16,116.27517,39.89892 405 | 50,2008-02-04 23:52:16,116.27517,39.89892 406 | 50,2008-02-04 23:52:16,116.27517,39.89892 407 | 50,2008-02-04 23:52:16,116.27517,39.89892 408 | 50,2008-02-04 23:52:16,116.27517,39.89892 409 | 50,2008-02-04 23:52:16,116.27517,39.89892 410 | 50,2008-02-04 23:52:16,116.27517,39.89892 411 | 50,2008-02-04 23:52:16,116.27517,39.89892 412 | 50,2008-02-04 23:52:16,116.27517,39.89892 413 | 50,2008-02-04 23:52:16,116.27517,39.89892 414 | 50,2008-02-04 23:52:16,116.27517,39.89892 415 | 50,2008-02-04 23:52:16,116.27517,39.89892 416 | 50,2008-02-04 23:52:16,116.27517,39.89892 417 | 50,2008-02-04 23:52:16,116.27517,39.89892 418 | 50,2008-02-04 23:52:16,116.27517,39.89892 419 | 50,2008-02-04 23:52:16,116.27517,39.89892 420 | 50,2008-02-04 23:52:16,116.27517,39.89892 421 | 50,2008-02-04 23:52:16,116.27517,39.89892 422 | 50,2008-02-04 23:52:16,116.27517,39.89892 423 | 50,2008-02-04 23:52:16,116.27517,39.89892 424 | 50,2008-02-04 23:52:16,116.27517,39.89892 425 | 50,2008-02-05 10:23:56,116.27515,39.8992 426 | 50,2008-02-05 10:26:06,116.27515,39.8992 427 | 50,2008-02-05 10:28:57,116.27515,39.8992 428 | 50,2008-02-05 10:31:07,116.27515,39.8992 429 | 50,2008-02-05 10:33:59,116.27515,39.8992 430 | 50,2008-02-05 10:36:09,116.27669,39.89898 431 | 50,2008-02-05 10:39:01,116.27963,39.89901 432 | 50,2008-02-05 10:41:11,116.28494,39.89899 433 | 50,2008-02-05 10:44:02,116.28911,39.89959 434 | 50,2008-02-05 10:46:12,116.29336,39.90623 435 | 50,2008-02-05 10:49:04,116.30429,39.91806 436 | 50,2008-02-05 10:51:14,116.30427,39.93782 437 | 50,2008-02-05 10:54:06,116.31179,39.95185 438 | 50,2008-02-05 10:56:16,116.31554,39.95244 439 | 50,2008-02-05 11:01:17,116.31095,39.94876 440 | 50,2008-02-05 11:04:09,116.31098,39.95062 441 | 50,2008-02-05 11:06:19,116.31748,39.95187 442 | 50,2008-02-05 11:09:11,116.3175,39.95185 443 | 50,2008-02-05 11:11:21,116.3175,39.95185 444 | 50,2008-02-05 11:14:12,116.3175,39.95185 445 | 50,2008-02-05 11:16:22,116.3175,39.95185 446 | 50,2008-02-05 11:19:14,116.3175,39.95185 447 | 50,2008-02-05 11:21:24,116.3175,39.95185 448 | 50,2008-02-05 11:24:16,116.3175,39.95185 449 | 50,2008-02-05 11:26:26,116.3175,39.95185 450 | 50,2008-02-05 11:29:17,116.3175,39.95185 451 | 50,2008-02-05 11:31:27,116.3175,39.95185 452 | 50,2008-02-05 11:34:19,116.3175,39.95185 453 | 50,2008-02-05 11:36:29,116.3175,39.95185 454 | 50,2008-02-05 11:39:21,116.31914,39.94111 455 | 50,2008-02-05 11:41:31,116.30283,39.94151 456 | 50,2008-02-05 11:44:22,116.30405,39.92295 457 | 50,2008-02-05 11:46:32,116.30392,39.90894 458 | 50,2008-02-05 11:49:24,116.30394,39.90027 459 | 50,2008-02-05 11:51:34,116.29605,39.89689 460 | 50,2008-02-05 11:54:26,116.29659,39.90609 461 | 50,2008-02-05 11:56:36,116.30505,39.90489 462 | 50,2008-02-05 11:59:27,116.30397,39.90768 463 | 50,2008-02-05 11:59:27,116.30397,39.90768 464 | 50,2008-02-05 11:59:27,116.30397,39.90768 465 | 50,2008-02-05 12:01:37,116.29008,39.90634 466 | 50,2008-02-05 12:04:29,116.27759,39.90645 467 | 50,2008-02-05 12:06:39,116.26829,39.90675 468 | 50,2008-02-05 12:09:31,116.27467,39.91638 469 | 50,2008-02-05 12:11:41,116.27746,39.91748 470 | 50,2008-02-05 12:14:32,116.28208,39.91218 471 | 50,2008-02-05 12:14:32,116.28208,39.91218 472 | 50,2008-02-05 12:16:42,116.28616,39.91159 473 | 50,2008-02-05 12:19:34,116.29696,39.91173 474 | 50,2008-02-05 12:21:44,116.30323,39.91126 475 | 50,2008-02-05 12:24:36,116.30973,39.90989 476 | 50,2008-02-05 12:26:46,116.31062,39.90866 477 | 50,2008-02-05 12:29:37,116.29764,39.90623 478 | 50,2008-02-05 12:31:47,116.28059,39.90624 479 | 50,2008-02-05 12:34:39,116.2774,39.903 480 | 50,2008-02-05 12:36:49,116.27745,39.90195 481 | 50,2008-02-05 12:39:40,116.2774,39.90094 482 | 50,2008-02-05 12:41:50,116.2773,39.9056 483 | 50,2008-02-05 12:44:42,116.2887,39.90604 484 | 50,2008-02-05 12:46:51,116.29219,39.90605 485 | 50,2008-02-05 12:49:43,116.31444,39.90611 486 | 50,2008-02-05 12:51:53,116.3178,39.90614 487 | 50,2008-02-05 12:54:44,116.32298,39.89811 488 | 50,2008-02-05 12:56:54,116.32294,39.89891 489 | 50,2008-02-05 12:59:46,116.32385,39.90604 490 | 50,2008-02-05 13:01:56,116.34215,39.90601 491 | 50,2008-02-05 13:04:48,116.35596,39.90596 492 | 50,2008-02-05 13:06:58,116.36753,39.90586 493 | 50,2008-02-05 13:09:49,116.37867,39.90587 494 | 50,2008-02-05 13:11:59,116.37904,39.90588 495 | 50,2008-02-05 13:17:01,116.38504,39.90606 496 | 50,2008-02-05 13:19:53,116.39545,39.90644 497 | 50,2008-02-05 13:22:03,116.40986,39.90679 498 | 50,2008-02-05 13:22:03,116.40986,39.90679 499 | 50,2008-02-05 13:24:54,116.42161,39.90705 500 | 50,2008-02-05 13:27:04,116.43453,39.90718 501 | 50,2008-02-05 13:29:56,116.45575,39.90932 502 | 50,2008-02-05 13:32:06,116.45557,39.92887 503 | 50,2008-02-05 13:34:58,116.45572,39.95006 504 | 50,2008-02-05 13:37:08,116.45287,39.95263 505 | 50,2008-02-05 13:39:59,116.45331,39.95283 506 | 50,2008-02-05 13:42:09,116.45523,39.94786 507 | 50,2008-02-05 13:45:01,116.47248,39.95341 508 | 50,2008-02-05 13:47:11,116.47655,39.95561 509 | 50,2008-02-05 14:29:20,116.46893,39.95236 510 | 50,2008-02-05 14:29:35,116.46782,39.95205 511 | 50,2008-02-05 14:34:22,116.44444,39.94642 512 | 50,2008-02-05 14:34:37,116.44412,39.94594 513 | 50,2008-02-05 14:34:37,116.44412,39.94594 514 | 50,2008-02-05 14:39:24,116.43384,39.93998 515 | 50,2008-02-05 14:39:24,116.43384,39.93998 516 | 50,2008-02-05 14:39:38,116.43313,39.93998 517 | 50,2008-02-05 14:44:25,116.43916,39.94814 518 | 50,2008-02-05 14:49:27,116.45747,39.95643 519 | 50,2008-02-05 14:49:42,116.45865,39.95754 520 | 50,2008-02-05 14:54:29,116.45356,39.95327 521 | 50,2008-02-05 14:54:43,116.45268,39.95385 522 | 50,2008-02-05 14:59:30,116.44221,39.95755 523 | 50,2008-02-05 14:59:45,116.44221,39.95755 524 | 50,2008-02-05 15:04:32,116.44051,39.96196 525 | 50,2008-02-05 15:04:46,116.44052,39.96196 526 | 50,2008-02-05 15:09:34,116.44037,39.96205 527 | 50,2008-02-05 15:09:48,116.44037,39.96205 528 | 50,2008-02-05 15:14:35,116.44037,39.96205 529 | 50,2008-02-05 15:14:50,116.44037,39.96205 530 | 50,2008-02-05 15:19:37,116.44037,39.96205 531 | 50,2008-02-05 15:19:51,116.44037,39.96205 532 | 50,2008-02-05 15:24:39,116.44037,39.96205 533 | 50,2008-02-05 15:29:40,116.44037,39.96205 534 | 50,2008-02-05 15:29:55,116.44037,39.96205 535 | 50,2008-02-05 15:34:42,116.44037,39.96205 536 | 50,2008-02-05 15:34:56,116.44037,39.96205 537 | 50,2008-02-05 15:39:44,116.42337,39.9682 538 | 50,2008-02-05 15:39:58,116.41985,39.9681 539 | 50,2008-02-05 15:44:45,116.38614,39.96722 540 | 50,2008-02-05 15:45:00,116.3841,39.96714 541 | 50,2008-02-05 15:49:47,116.34058,39.96636 542 | 50,2008-02-05 15:50:01,116.3376,39.96634 543 | 50,2008-02-05 15:54:49,116.30366,39.94811 544 | 50,2008-02-05 15:55:03,116.30376,39.94667 545 | 50,2008-02-05 15:59:50,116.29588,39.9227 546 | 50,2008-02-05 16:00:05,116.29528,39.9227 547 | 50,2008-02-05 16:04:52,116.27699,39.91681 548 | 50,2008-02-05 16:05:06,116.27699,39.91681 549 | 50,2008-02-05 16:09:54,116.27324,39.9164 550 | 50,2008-02-05 16:10:08,116.27262,39.91644 551 | 50,2008-02-05 21:24:59,116.26615,39.89903 552 | 50,2008-02-05 21:29:48,116.27504,39.89891 553 | 50,2008-02-05 23:18:43,116.25847,39.8938 554 | 50,2008-02-05 23:43:49,116.2504,39.88926 555 | 50,2008-02-05 23:44:54,116.25038,39.88932 556 | 50,2008-02-06 00:37:23,116.25757,39.89144 557 | 50,2008-02-06 00:39:12,116.25865,39.89549 558 | 50,2008-02-06 00:42:25,116.27507,39.89894 559 | 50,2008-02-07 13:52:17,116.25856,39.89587 560 | 50,2008-02-07 14:06:38,116.25799,39.87099 561 | 50,2008-02-07 14:07:26,116.25131,39.87103 562 | 50,2008-02-07 14:11:39,116.24354,39.86447 563 | 50,2008-02-07 14:12:27,116.2431,39.86445 564 | 50,2008-02-07 14:16:41,116.24148,39.86153 565 | 50,2008-02-07 14:17:29,116.23617,39.85862 566 | 50,2008-02-07 14:21:43,116.26354,39.8698 567 | 50,2008-02-07 14:22:31,116.27086,39.87321 568 | 50,2008-02-07 14:26:44,116.26842,39.91177 569 | 50,2008-02-07 14:31:46,116.2822,39.91986 570 | 50,2008-02-07 14:32:34,116.28458,39.92012 571 | 50,2008-02-07 14:36:48,116.28777,39.92075 572 | 50,2008-02-07 14:42:42,116.28767,39.9207 573 | 50,2008-02-07 15:53:34,116.2773,39.91895 574 | 50,2008-02-07 15:56:41,116.27727,39.90435 575 | 50,2008-02-07 15:58:36,116.27642,39.89911 576 | 50,2008-02-07 16:00:38,116.27523,39.89905 577 | -------------------------------------------------------------------------------- /data2/67.txt: -------------------------------------------------------------------------------- 1 | 67,2008-02-08 00:01:00,116.39075,39.84218 2 | 67,2008-02-08 00:01:00,116.39075,39.84218 3 | 67,2008-02-08 00:01:00,116.39075,39.84218 4 | 67,2008-02-08 00:01:00,116.39075,39.84218 5 | -------------------------------------------------------------------------------- /data2/7.txt: -------------------------------------------------------------------------------- 1 | 7,2008-02-02 15:10:26,116.76038,39.79758 2 | 7,2008-02-02 15:15:49,116.7666,39.8027 3 | 7,2008-02-02 15:39:32,116.7666,39.8027 4 | 7,2008-02-02 15:45:26,116.7666,39.8027 5 | 7,2008-02-02 19:46:58,116.7666,39.8027 6 | 7,2008-02-02 19:52:58,116.7522,39.80078 7 | 7,2008-02-02 19:58:58,116.72105,39.81482 8 | 7,2008-02-03 07:12:58,116.70168,39.8301 9 | 7,2008-02-03 07:13:05,116.70168,39.8301 10 | 7,2008-02-03 07:35:05,116.6892,39.8266 11 | 7,2008-02-03 07:47:05,116.71878,39.82333 12 | 7,2008-02-03 07:53:05,116.73115,39.79662 13 | 7,2008-02-03 08:00:59,116.75817,39.79927 14 | 7,2008-02-03 09:04:03,116.75817,39.79927 15 | 7,2008-02-03 09:30:43,116.76477,39.79835 16 | 7,2008-02-03 09:34:10,116.76477,39.79835 17 | 7,2008-02-03 09:37:13,116.76477,39.79835 18 | 7,2008-02-03 09:44:20,116.76037,39.79757 19 | 7,2008-02-03 10:49:31,116.77232,39.81688 20 | 7,2008-02-03 10:55:31,116.7438,39.8528 21 | 7,2008-02-03 11:07:31,116.68455,39.90142 22 | 7,2008-02-03 11:19:31,116.65453,39.94552 23 | 7,2008-02-03 11:20:27,116.65453,39.94552 24 | 7,2008-02-03 12:02:07,116.65453,39.94552 25 | 7,2008-02-03 12:04:19,116.65453,39.94552 26 | 7,2008-02-03 12:50:41,116.65453,39.94552 27 | 7,2008-02-03 12:56:41,116.6511,39.94022 28 | 7,2008-02-03 13:02:41,116.65222,39.9213 29 | 7,2008-02-03 13:08:41,116.68425,39.90155 30 | 7,2008-02-03 13:15:07,116.72373,39.90177 31 | 7,2008-02-03 13:21:34,116.73787,39.85625 32 | 7,2008-02-03 13:27:34,116.77452,39.82308 33 | 7,2008-02-03 13:33:34,116.7591,39.79967 34 | 7,2008-02-03 13:35:38,116.7591,39.79967 35 | 7,2008-02-03 16:29:56,116.7591,39.79967 36 | 7,2008-02-03 16:29:56,116.7591,39.79967 37 | 7,2008-02-03 16:41:56,116.71917,39.82338 38 | 7,2008-02-03 16:43:15,116.72437,39.824 39 | 7,2008-02-03 17:12:46,116.72437,39.824 40 | 7,2008-02-03 17:18:46,116.71522,39.8281 41 | 7,2008-02-03 17:24:49,116.6965,39.83013 42 | 7,2008-02-03 17:28:12,116.6965,39.83013 43 | 7,2008-02-03 17:28:36,116.6965,39.83013 44 | 7,2008-02-03 17:28:50,116.69095,39.82763 45 | 7,2008-02-03 17:29:18,116.69095,39.82763 46 | 7,2008-02-03 17:30:01,116.69095,39.82763 47 | 7,2008-02-03 17:32:36,116.69095,39.82763 48 | 7,2008-02-03 17:36:12,116.69095,39.82763 49 | 7,2008-02-04 10:25:44,116.69095,39.82763 50 | 7,2008-02-04 10:36:52,116.69728,39.84532 51 | 7,2008-02-04 10:41:18,116.69728,39.84532 52 | 7,2008-02-04 10:45:03,116.69743,39.84415 53 | 7,2008-02-04 10:45:10,116.69743,39.84415 54 | 7,2008-02-04 11:05:57,116.69743,39.84415 55 | 7,2008-02-04 11:11:58,116.71253,39.8379 56 | 7,2008-02-04 11:15:22,116.72455,39.82417 57 | 7,2008-02-04 11:50:44,116.72455,39.82417 58 | 7,2008-02-04 12:02:44,116.75995,39.79675 59 | 7,2008-02-04 12:03:10,116.76038,39.79757 60 | 7,2008-02-04 12:11:41,116.76038,39.79757 61 | 7,2008-02-04 12:17:57,116.76318,39.80187 62 | 7,2008-02-04 12:20:15,116.76658,39.80268 63 | 7,2008-02-04 12:20:15,116.76658,39.80268 64 | 7,2008-02-04 12:20:17,116.38698,39.88598 65 | 7,2008-02-04 12:29:37,116.76658,39.80268 66 | 7,2008-02-04 12:35:51,116.76658,39.80268 67 | 7,2008-02-04 12:35:51,116.76658,39.80268 68 | 7,2008-02-04 13:14:31,116.76658,39.80268 69 | 7,2008-02-04 13:20:31,116.75932,39.80173 70 | 7,2008-02-04 13:25:00,116.75932,39.80173 71 | 7,2008-02-04 13:38:44,116.75932,39.80173 72 | 7,2008-02-04 13:45:11,116.76262,39.79978 73 | 7,2008-02-04 13:49:26,116.76262,39.79978 74 | 7,2008-02-04 16:45:57,116.76262,39.79978 75 | 7,2008-02-04 16:51:57,116.76193,39.80123 76 | 7,2008-02-04 16:57:57,116.78068,39.78832 77 | 7,2008-02-04 17:03:57,116.8042,39.76268 78 | 7,2008-02-04 17:06:24,116.79685,39.76283 79 | 7,2008-02-04 17:47:11,116.79685,39.76283 80 | 7,2008-02-04 17:53:12,116.79463,39.76562 81 | 7,2008-02-04 17:59:12,116.75015,39.77025 82 | 7,2008-02-04 18:05:12,116.72248,39.80933 83 | 7,2008-02-04 18:08:26,116.72512,39.82348 84 | 7,2008-02-04 18:59:20,116.72512,39.82348 85 | 7,2008-02-04 19:00:08,116.72512,39.82348 86 | 7,2008-02-04 19:00:08,116.72512,39.82348 87 | 7,2008-02-05 00:32:26,116.72512,39.82348 88 | 7,2008-02-05 00:38:26,116.70688,39.828 89 | 7,2008-02-05 00:38:26,116.70688,39.828 90 | 7,2008-02-05 00:44:26,116.69035,39.82678 91 | 7,2008-02-05 00:45:07,116.69035,39.82678 92 | 7,2008-02-05 10:02:29,116.69812,39.83917 93 | 7,2008-02-05 10:04:11,116.69812,39.83917 94 | 7,2008-02-05 10:04:13,116.69812,39.83917 95 | 7,2008-02-05 10:22:11,116.69452,39.85558 96 | 7,2008-02-05 10:25:35,116.69452,39.85558 97 | 7,2008-02-05 10:28:15,116.69452,39.85558 98 | 7,2008-02-05 10:34:15,116.65825,39.88672 99 | 7,2008-02-05 10:40:22,116.65188,39.90548 100 | 7,2008-02-05 10:46:31,116.63673,39.91505 101 | 7,2008-02-05 10:52:31,116.61143,39.90532 102 | 7,2008-02-05 10:55:05,116.59698,39.90833 103 | 7,2008-02-05 11:04:00,116.59698,39.90833 104 | 7,2008-02-05 11:10:00,116.57235,39.91355 105 | 7,2008-02-05 11:16:00,116.55247,39.91493 106 | 7,2008-02-05 11:22:00,116.52728,39.91555 107 | 7,2008-02-05 11:34:00,116.47502,39.9144 108 | 7,2008-02-05 11:40:00,116.4752,39.91405 109 | 7,2008-02-05 11:46:00,116.5118,39.9153 110 | 7,2008-02-05 11:51:12,116.53817,39.91497 111 | 7,2008-02-05 11:57:12,116.53692,39.91508 112 | 7,2008-02-05 12:03:12,116.52083,39.90848 113 | 7,2008-02-05 12:15:12,116.43408,39.88542 114 | 7,2008-02-05 12:21:12,116.43002,39.8776 115 | 7,2008-02-05 12:27:12,116.44763,39.88035 116 | 7,2008-02-05 12:33:52,116.44998,39.88208 117 | 7,2008-02-05 12:33:52,116.44998,39.88208 118 | 7,2008-02-05 12:40:00,116.45932,39.89198 119 | 7,2008-02-05 12:46:00,116.45562,39.8932 120 | 7,2008-02-05 12:52:00,116.46188,39.90663 121 | 7,2008-02-05 12:58:00,116.45602,39.91162 122 | 7,2008-02-05 12:58:00,116.45602,39.91162 123 | 7,2008-02-05 13:04:00,116.47162,39.91407 124 | 7,2008-02-05 13:06:24,116.47162,39.91407 125 | 7,2008-02-05 13:08:30,116.47162,39.91407 126 | 7,2008-02-05 13:15:32,116.45115,39.90662 127 | 7,2008-02-05 13:21:32,116.44395,39.91685 128 | 7,2008-02-05 13:27:32,116.44053,39.92202 129 | 7,2008-02-05 13:34:03,116.44195,39.92148 130 | 7,2008-02-05 13:40:03,116.4554,39.90363 131 | 7,2008-02-05 13:46:03,116.46077,39.88287 132 | 7,2008-02-05 13:52:03,116.46158,39.87498 133 | 7,2008-02-05 13:58:03,116.50512,39.86928 134 | 7,2008-02-05 14:04:15,116.56767,39.86417 135 | 7,2008-02-05 14:05:52,116.56767,39.86417 136 | 7,2008-02-05 14:28:28,116.56767,39.86417 137 | 7,2008-02-05 14:34:28,116.55713,39.86765 138 | 7,2008-02-05 14:34:28,116.55713,39.86765 139 | 7,2008-02-05 14:40:28,116.506,39.87025 140 | 7,2008-02-05 14:46:30,116.47538,39.8832 141 | 7,2008-02-05 14:52:36,116.45882,39.8922 142 | 7,2008-02-05 14:58:36,116.43792,39.89183 143 | 7,2008-02-05 15:16:36,116.33953,39.83978 144 | 7,2008-02-05 15:28:36,116.28372,39.83568 145 | 7,2008-02-05 15:34:59,116.27743,39.85502 146 | 7,2008-02-05 15:40:59,116.26813,39.89027 147 | 7,2008-02-05 15:47:19,116.28438,39.90598 148 | 7,2008-02-05 15:54:37,116.28892,39.88852 149 | 7,2008-02-05 16:00:37,116.28977,39.86723 150 | 7,2008-02-05 16:01:21,116.28977,39.86723 151 | 7,2008-02-05 16:10:48,116.28977,39.86723 152 | 7,2008-02-05 16:16:48,116.30455,39.88605 153 | 7,2008-02-05 16:23:38,116.3105,39.90607 154 | 7,2008-02-05 16:29:38,116.33538,39.91243 155 | 7,2008-02-05 16:35:38,116.34738,39.91577 156 | 7,2008-02-05 16:41:38,116.3439,39.92672 157 | 7,2008-02-05 16:47:38,116.33648,39.93622 158 | 7,2008-02-05 16:53:38,116.30267,39.9525 159 | 7,2008-02-05 16:59:38,116.29755,39.96577 160 | 7,2008-02-05 17:08:17,116.31392,39.96512 161 | 7,2008-02-05 17:14:52,116.31827,39.96558 162 | 7,2008-02-05 17:20:52,116.34317,39.96612 163 | 7,2008-02-05 17:26:52,116.34718,39.99068 164 | 7,2008-02-05 17:34:00,116.3632,39.9863 165 | 7,2008-02-05 17:40:00,116.35215,39.98027 166 | 7,2008-02-05 17:46:00,116.37137,39.97532 167 | 7,2008-02-05 17:52:00,116.37187,39.96655 168 | 7,2008-02-05 17:58:00,116.40138,39.96105 169 | 7,2008-02-05 18:04:00,116.43143,39.96742 170 | 7,2008-02-05 18:10:00,116.45237,39.94743 171 | 7,2008-02-05 18:16:00,116.4383,39.93878 172 | 7,2008-02-05 18:22:00,116.44427,39.94153 173 | 7,2008-02-05 18:29:06,116.45522,39.9495 174 | 7,2008-02-05 18:35:15,116.44915,39.93782 175 | 7,2008-02-05 18:36:46,116.44915,39.93782 176 | 7,2008-02-05 18:39:59,116.44915,39.93782 177 | 7,2008-02-05 18:46:21,116.45137,39.94247 178 | 7,2008-02-05 18:52:21,116.44912,39.93258 179 | 7,2008-02-05 18:58:21,116.44907,39.92637 180 | 7,2008-02-05 19:04:21,116.44398,39.93052 181 | 7,2008-02-05 19:10:21,116.4553,39.92947 182 | 7,2008-02-05 19:17:25,116.45533,39.91088 183 | 7,2008-02-05 19:23:25,116.4551,39.8955 184 | 7,2008-02-05 19:29:25,116.45472,39.88325 185 | 7,2008-02-05 19:29:25,116.45472,39.88325 186 | 7,2008-02-05 19:35:25,116.48895,39.87463 187 | 7,2008-02-05 19:41:25,116.48898,39.90658 188 | 7,2008-02-05 19:47:25,116.54788,39.90777 189 | 7,2008-02-05 19:59:25,116.61595,39.90512 190 | 7,2008-02-05 20:11:40,116.66917,39.87755 191 | 7,2008-02-05 20:18:24,116.6904,39.86453 192 | 7,2008-02-05 20:24:24,116.66492,39.88113 193 | 7,2008-02-05 20:30:24,116.6917,39.86145 194 | 7,2008-02-05 20:35:34,116.69613,39.82947 195 | 7,2008-02-05 20:38:19,116.69613,39.82947 196 | 7,2008-02-05 20:38:25,116.69613,39.82947 197 | 7,2008-02-05 20:39:12,116.69613,39.82947 198 | 7,2008-02-05 20:40:43,116.69613,39.82947 199 | 7,2008-02-05 20:43:51,116.69613,39.82947 200 | 7,2008-02-05 20:47:29,116.69613,39.82947 201 | 7,2008-02-06 11:21:24,116.69087,39.82775 202 | 7,2008-02-06 11:27:24,116.69008,39.86502 203 | 7,2008-02-06 11:33:28,116.65825,39.88678 204 | 7,2008-02-06 11:40:15,116.6518,39.9066 205 | 7,2008-02-06 11:46:18,116.63692,39.91207 206 | 7,2008-02-06 11:55:25,116.60827,39.91208 207 | 7,2008-02-06 11:55:25,116.60827,39.91208 208 | 7,2008-02-06 12:01:25,116.57515,39.91327 209 | 7,2008-02-06 12:13:25,116.53085,39.91537 210 | 7,2008-02-06 12:19:25,116.51248,39.91545 211 | 7,2008-02-06 12:25:25,116.47815,39.91433 212 | 7,2008-02-06 12:31:51,116.46085,39.92192 213 | 7,2008-02-06 12:39:04,116.44468,39.93997 214 | 7,2008-02-06 12:45:04,116.43668,39.94647 215 | 7,2008-02-06 12:51:04,116.4406,39.94938 216 | 7,2008-02-06 12:57:04,116.46247,39.94692 217 | 7,2008-02-06 13:03:04,116.45883,39.93245 218 | 7,2008-02-06 13:03:04,116.45883,39.93245 219 | 7,2008-02-06 13:09:04,116.44585,39.92562 220 | 7,2008-02-06 13:15:10,116.42832,39.9317 221 | 7,2008-02-06 13:21:10,116.42988,39.93978 222 | 7,2008-02-06 13:27:10,116.41042,39.94483 223 | 7,2008-02-06 13:33:10,116.35468,39.94378 224 | 7,2008-02-06 13:39:10,116.34962,39.9314 225 | 7,2008-02-06 13:52:02,116.31427,39.89487 226 | 7,2008-02-06 13:58:05,116.31105,39.90628 227 | 7,2008-02-06 14:04:05,116.3044,39.919 228 | 7,2008-02-06 14:10:05,116.31975,39.92993 229 | 7,2008-02-06 14:22:33,116.31903,39.96567 230 | 7,2008-02-06 14:28:33,116.32755,39.97428 231 | 7,2008-02-06 14:32:42,116.32755,39.97428 232 | 7,2008-02-06 14:33:13,116.32755,39.97428 233 | 7,2008-02-06 14:34:07,116.32755,39.97428 234 | 7,2008-02-06 14:37:22,116.32755,39.97428 235 | 7,2008-02-06 14:40:42,116.32755,39.97428 236 | 7,2008-02-06 14:43:46,116.32755,39.97428 237 | 7,2008-02-06 14:49:46,116.37448,39.96767 238 | 7,2008-02-06 15:01:46,116.40987,39.99233 239 | 7,2008-02-06 15:07:46,116.40125,39.98712 240 | 7,2008-02-06 15:18:45,116.41242,39.9835 241 | 7,2008-02-06 15:24:45,116.41202,39.96352 242 | 7,2008-02-06 15:30:45,116.41845,39.9481 243 | 7,2008-02-06 15:37:05,116.43428,39.92558 244 | 7,2008-02-06 15:41:45,116.44927,39.9287 245 | 7,2008-02-06 15:43:55,116.44927,39.9287 246 | 7,2008-02-06 15:50:03,116.4552,39.9232 247 | 7,2008-02-06 15:56:27,116.47187,39.92972 248 | 7,2008-02-06 16:05:12,116.49742,39.93225 249 | 7,2008-02-06 16:05:50,116.49742,39.93225 250 | 7,2008-02-06 16:11:19,116.49742,39.93225 251 | 7,2008-02-06 16:17:19,116.5072,39.92187 252 | 7,2008-02-06 16:23:19,116.5467,39.92263 253 | 7,2008-02-06 16:29:19,116.58495,39.91867 254 | 7,2008-02-06 16:35:19,116.5928,39.91105 255 | 7,2008-02-06 16:41:19,116.63145,39.90393 256 | 7,2008-02-06 16:47:19,116.61713,39.90565 257 | 7,2008-02-06 16:53:19,116.57933,39.91265 258 | 7,2008-02-06 16:59:21,116.5571,39.91513 259 | 7,2008-02-06 17:05:21,116.52287,39.92267 260 | 7,2008-02-06 17:10:21,116.52137,39.92293 261 | 7,2008-02-06 17:18:01,116.52137,39.92293 262 | 7,2008-02-06 17:18:50,116.52137,39.92293 263 | 7,2008-02-06 17:24:50,116.4809,39.92167 264 | 7,2008-02-06 17:30:50,116.46078,39.92837 265 | 7,2008-02-06 17:36:50,116.46078,39.92613 266 | 7,2008-02-06 17:42:50,116.44647,39.9399 267 | 7,2008-02-06 17:48:50,116.41792,39.94818 268 | 7,2008-02-06 17:54:50,116.34878,39.9408 269 | 7,2008-02-06 17:56:39,116.34878,39.9408 270 | 7,2008-02-06 18:06:39,116.33005,39.95083 271 | 7,2008-02-06 18:12:39,116.34927,39.96625 272 | 7,2008-02-06 18:18:39,116.3632,40.00097 273 | 7,2008-02-06 18:24:39,116.32015,40.05745 274 | 7,2008-02-06 18:44:50,116.34518,40.02308 275 | 7,2008-02-06 18:50:50,116.37468,39.97227 276 | 7,2008-02-06 18:56:50,116.40408,39.96742 277 | 7,2008-02-06 19:02:50,116.41235,39.95473 278 | 7,2008-02-06 19:08:50,116.37247,39.94752 279 | 7,2008-02-06 19:14:50,116.35033,39.90445 280 | 7,2008-02-06 19:21:38,116.36808,39.88822 281 | 7,2008-02-06 19:34:34,116.41913,39.89188 282 | 7,2008-02-06 19:34:34,116.41913,39.89188 283 | 7,2008-02-06 19:40:34,116.4407,39.8996 284 | 7,2008-02-06 19:46:34,116.45478,39.8725 285 | 7,2008-02-06 19:52:34,116.4644,39.85362 286 | 7,2008-02-06 20:04:34,116.55105,39.86737 287 | 7,2008-02-06 20:10:34,116.61098,39.85787 288 | 7,2008-02-06 20:22:34,116.68643,39.85817 289 | 7,2008-02-06 20:28:34,116.69142,39.8281 290 | 7,2008-02-06 20:29:44,116.69142,39.8281 291 | 7,2008-02-07 02:53:34,116.68918,39.8267 292 | 7,2008-02-07 11:45:39,116.68918,39.8267 293 | 7,2008-02-07 11:51:47,116.6975,39.83803 294 | 7,2008-02-07 11:57:47,116.68403,39.8702 295 | 7,2008-02-07 12:04:29,116.6505,39.88985 296 | 7,2008-02-07 12:10:29,116.61402,39.9057 297 | 7,2008-02-07 12:16:29,116.5795,39.91263 298 | 7,2008-02-07 12:22:29,116.556,39.915 299 | 7,2008-02-07 12:28:29,116.52238,39.91593 300 | 7,2008-02-07 12:32:54,116.52238,39.91593 301 | 7,2008-02-07 12:33:57,116.52238,39.91593 302 | 7,2008-02-07 12:41:25,116.48407,39.9322 303 | 7,2008-02-07 12:53:25,116.4491,39.93243 304 | 7,2008-02-07 12:59:34,116.44218,39.92563 305 | 7,2008-02-07 13:05:34,116.42502,39.90718 306 | 7,2008-02-07 13:11:34,116.38692,39.90618 307 | 7,2008-02-07 13:17:34,116.34438,39.90608 308 | 7,2008-02-07 13:17:34,116.34438,39.90608 309 | 7,2008-02-07 13:23:34,116.32282,39.89995 310 | 7,2008-02-07 13:29:34,116.31352,39.90632 311 | 7,2008-02-07 13:35:34,116.30427,39.93552 312 | 7,2008-02-07 13:41:34,116.2967,39.96183 313 | 7,2008-02-07 13:45:34,116.2967,39.96183 314 | 7,2008-02-07 13:48:40,116.2967,39.96183 315 | 7,2008-02-07 13:54:40,116.30267,39.96095 316 | 7,2008-02-07 14:00:40,116.37762,39.96677 317 | 7,2008-02-07 14:06:40,116.40072,39.94758 318 | 7,2008-02-07 14:12:40,116.42792,39.92815 319 | 7,2008-02-07 14:18:40,116.41865,39.90348 320 | 7,2008-02-07 14:24:40,116.4166,39.9136 321 | 7,2008-02-07 14:31:03,116.43413,39.9225 322 | 7,2008-02-07 14:36:30,116.43413,39.9225 323 | 7,2008-02-07 14:38:51,116.43413,39.9225 324 | 7,2008-02-07 14:44:51,116.42765,39.93755 325 | 7,2008-02-07 14:52:02,116.40202,39.94855 326 | 7,2008-02-07 14:58:02,116.40157,39.95972 327 | 7,2008-02-07 15:04:02,116.38375,39.9671 328 | 7,2008-02-07 15:10:02,116.30657,39.96283 329 | 7,2008-02-07 15:16:24,116.27887,39.95602 330 | 7,2008-02-07 15:22:24,116.2397,39.97195 331 | 7,2008-02-07 15:28:34,116.2156,39.99355 332 | 7,2008-02-07 15:34:34,116.24808,40.00435 333 | 7,2008-02-07 15:40:34,116.2621,40.0096 334 | 7,2008-02-07 15:46:34,116.27483,40.02133 335 | 7,2008-02-07 15:52:34,116.2405,40.00045 336 | 7,2008-02-07 15:52:34,116.2405,40.00045 337 | 7,2008-02-07 15:58:34,116.20148,39.99292 338 | 7,2008-02-07 16:04:34,116.19673,39.99122 339 | 7,2008-02-07 16:08:10,116.19673,39.99122 340 | 7,2008-02-07 16:08:38,116.19673,39.99122 341 | 7,2008-02-07 16:09:59,116.19673,39.99122 342 | 7,2008-02-07 16:14:11,116.19673,39.99122 343 | 7,2008-02-07 16:20:11,116.2348,39.97182 344 | 7,2008-02-07 16:26:11,116.26802,39.94638 345 | 7,2008-02-07 16:32:11,116.26908,39.92418 346 | 7,2008-02-07 16:38:11,116.30267,39.90603 347 | 7,2008-02-07 16:44:11,116.34925,39.90583 348 | 7,2008-02-07 16:50:11,116.3852,39.90603 349 | 7,2008-02-07 16:56:44,116.3852,39.90603 350 | 7,2008-02-07 16:57:50,116.3852,39.90603 351 | 7,2008-02-07 16:58:36,116.3852,39.90603 352 | 7,2008-02-07 17:05:15,116.3852,39.90603 353 | 7,2008-02-07 17:05:31,116.3852,39.90603 354 | 7,2008-02-07 17:06:28,116.3852,39.90603 355 | 7,2008-02-07 17:13:07,116.40578,39.89953 356 | 7,2008-02-07 17:19:07,116.40623,39.88832 357 | 7,2008-02-07 17:27:03,116.41463,39.8801 358 | 7,2008-02-07 17:31:30,116.41463,39.8801 359 | 7,2008-02-07 17:32:49,116.41463,39.8801 360 | 7,2008-02-07 17:38:49,116.4152,39.8671 361 | 7,2008-02-07 17:45:10,116.41758,39.86482 362 | 7,2008-02-07 17:51:56,116.4322,39.8645 363 | 7,2008-02-07 17:57:56,116.44953,39.89218 364 | 7,2008-02-07 18:03:56,116.45615,39.90717 365 | 7,2008-02-07 18:09:56,116.44417,39.91745 366 | 7,2008-02-07 18:16:23,116.44425,39.93953 367 | 7,2008-02-07 18:22:23,116.4492,39.9435 368 | 7,2008-02-07 18:22:23,116.4492,39.9435 369 | 7,2008-02-07 18:28:31,116.45435,39.9323 370 | 7,2008-02-07 18:34:31,116.46468,39.90725 371 | 7,2008-02-07 18:40:31,116.53468,39.90753 372 | 7,2008-02-07 18:46:32,116.56995,39.9087 373 | 7,2008-02-07 18:46:32,116.56995,39.9087 374 | 7,2008-02-07 18:52:32,116.60668,39.90385 375 | 7,2008-02-07 18:58:32,116.63615,39.8959 376 | 7,2008-02-07 19:05:07,116.66123,39.88397 377 | 7,2008-02-07 19:10:57,116.66123,39.88397 378 | 7,2008-02-07 19:11:06,116.66123,39.88397 379 | 7,2008-02-07 19:12:46,116.68928,39.86585 380 | 7,2008-02-07 19:17:18,116.68928,39.86585 381 | 7,2008-02-07 19:17:18,116.68928,39.86585 382 | 7,2008-02-07 19:17:18,116.68928,39.86585 383 | 7,2008-02-07 19:45:20,116.69327,39.85772 384 | 7,2008-02-07 19:51:20,116.71207,39.83773 385 | 7,2008-02-07 19:57:20,116.70708,39.82803 386 | 7,2008-02-07 20:03:05,116.70708,39.82803 387 | 7,2008-02-08 10:13:54,116.70708,39.82803 388 | 7,2008-02-08 10:22:22,116.69107,39.8267 389 | 7,2008-02-08 10:24:07,116.69107,39.8267 390 | 7,2008-02-08 11:02:42,116.69107,39.8267 391 | 7,2008-02-08 11:08:42,116.69708,39.84973 392 | 7,2008-02-08 11:12:31,116.6848,39.87032 393 | 7,2008-02-08 11:12:31,116.6848,39.87032 394 | 7,2008-02-08 11:15:04,116.6848,39.87032 395 | 7,2008-02-08 11:21:04,116.6598,39.88537 396 | 7,2008-02-08 11:27:04,116.63813,39.89363 397 | 7,2008-02-08 11:27:04,116.63813,39.89363 398 | 7,2008-02-08 11:33:04,116.60427,39.90723 399 | 7,2008-02-08 11:39:04,116.57875,39.9128 400 | 7,2008-02-08 11:45:04,116.5535,39.91488 401 | 7,2008-02-08 11:51:04,116.52473,39.91588 402 | 7,2008-02-08 11:57:04,116.48792,39.90693 403 | 7,2008-02-08 12:03:04,116.4718,39.90445 404 | 7,2008-02-08 12:09:04,116.48392,39.9244 405 | 7,2008-02-08 12:15:04,116.48727,39.96012 406 | 7,2008-02-08 12:21:04,116.49693,39.9706 407 | 7,2008-02-08 12:21:43,116.49693,39.9706 408 | 7,2008-02-08 12:56:12,116.49693,39.9706 409 | 7,2008-02-08 13:01:13,116.49693,39.9706 410 | 7,2008-02-08 13:23:13,116.49693,39.9706 411 | 7,2008-02-08 13:23:57,116.49693,39.9706 412 | 7,2008-02-08 13:27:00,116.49693,39.9706 413 | 7,2008-02-08 13:27:12,116.49693,39.9706 414 | 7,2008-02-08 13:28:31,116.49693,39.9706 415 | 7,2008-02-08 13:34:31,116.49293,39.95657 416 | 7,2008-02-08 13:40:31,116.48903,39.94448 417 | 7,2008-02-08 13:46:46,116.47305,39.93245 418 | 7,2008-02-08 13:52:46,116.47133,39.92978 419 | 7,2008-02-08 13:58:46,116.47162,39.90745 420 | 7,2008-02-08 14:04:46,116.46505,39.90765 421 | 7,2008-02-08 14:10:46,116.4548,39.89588 422 | 7,2008-02-08 14:16:46,116.42542,39.85723 423 | 7,2008-02-08 14:23:47,116.39665,39.85107 424 | 7,2008-02-08 14:35:59,116.37893,39.88798 425 | 7,2008-02-08 14:41:59,116.40615,39.89227 426 | 7,2008-02-08 14:47:59,116.4213,39.8923 427 | 7,2008-02-08 14:55:03,116.4546,39.89222 428 | 7,2008-02-08 15:01:03,116.4833,39.88748 429 | 7,2008-02-08 15:07:03,116.4839,39.9099 430 | 7,2008-02-08 15:13:27,116.51137,39.9299 431 | 7,2008-02-08 15:19:41,116.51083,39.93353 432 | 7,2008-02-08 15:25:41,116.48875,39.93292 433 | 7,2008-02-08 15:32:18,116.46662,39.93243 434 | 7,2008-02-08 15:38:18,116.4557,39.9444 435 | 7,2008-02-08 15:44:18,116.44922,39.94287 436 | 7,2008-02-08 15:50:18,116.44638,39.9257 437 | 7,2008-02-08 15:56:18,116.43827,39.93955 438 | 7,2008-02-08 16:02:18,116.43333,39.95362 439 | 7,2008-02-08 16:08:18,116.44068,39.96107 440 | 7,2008-02-08 16:14:18,116.46245,39.9477 441 | 7,2008-02-08 16:17:42,116.46245,39.9477 442 | 7,2008-02-08 16:21:07,116.46245,39.9477 443 | 7,2008-02-08 16:27:07,116.46483,39.95087 444 | 7,2008-02-08 16:33:07,116.45008,39.97893 445 | 7,2008-02-08 16:39:07,116.45667,39.99297 446 | 7,2008-02-08 16:45:07,116.46705,39.9972 447 | 7,2008-02-08 16:51:07,116.46743,39.9835 448 | 7,2008-02-08 16:57:26,116.46113,40.01277 449 | 7,2008-02-08 17:03:26,116.4118,40.02452 450 | 7,2008-02-08 17:09:26,116.41023,40.05595 451 | 7,2008-02-08 17:17:33,116.41302,40.05957 452 | 7,2008-02-08 17:24:20,116.40773,40.0565 453 | 7,2008-02-08 17:30:20,116.41087,40.01585 454 | 7,2008-02-08 17:37:58,116.40717,39.9979 455 | -------------------------------------------------------------------------------- /data2/8.txt: -------------------------------------------------------------------------------- 1 | 8,2008-02-04 07:01:13,116.36606,39.6841 2 | 8,2008-02-05 07:01:35,116.36606,39.68409 3 | 8,2008-02-06 07:02:00,116.36605,39.68409 4 | 8,2008-02-07 07:02:45,116.36611,39.68408 5 | 8,2008-02-08 07:00:37,116.36615,39.68413 6 | -------------------------------------------------------------------------------- /data_list_json_100.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alarivarmann/trajectory_clustering/508d78037c1e790bc2c9569250c455ec0d8ccab5/data_list_json_100.txt -------------------------------------------------------------------------------- /fractal_dimension.py: -------------------------------------------------------------------------------- 1 | test#!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Sun Aug 19 22:59:04 2018 5 | 6 | @author: alaridatascience 7 | """ 8 | 9 | # ----------------------------------------------------------------------------- 10 | # From https://en.wikipedia.org/wiki/Minkowski–Bouligand_dimension: 11 | # 12 | # In fractal geometry, the Minkowski–Bouligand dimension, also known as 13 | # Minkowski dimension or box-counting dimension, is a way of determining the 14 | # fractal dimension of a set S in a Euclidean space Rn, or more generally in a 15 | # metric space (X, d). 16 | # ----------------------------------------------------------------------------- 17 | import scipy.misc 18 | import numpy as np 19 | 20 | def plot_traj(data,par,noshow): 21 | ''' Plot trajectory in data frame format''' 22 | x = data['longitude'] 23 | y = data['latitude'] 24 | xmin,xmax = min(x),max(x) 25 | ymin,ymax = min(y),max(y) 26 | fig = plt.figure() 27 | xrange,yrange = xmax-xmin,ymax-ymin 28 | plt.axis([xmin-0.01*xrange, xmax+0.01*xrange, ymin-0.01*yrange, ymax+0.01*yrange]) 29 | if(par==1): 30 | plt.scatter(x,y) 31 | else: 32 | plt.plot(x,y) 33 | if(noshow==0): plt.show() 34 | return(fig) 35 | 36 | 37 | a = fractal_dimension(K, 0.5) 38 | p = plot_traj(taxi_999_traj,1) 39 | 40 | def hausdorff_fractal_dimension(traj, threshold=0.2): 41 | ''' Compute the fractal dimension of a trajectory''' 42 | 43 | def boxcount(traj, k): 44 | S = np.add.reduceat( 45 | np.add.reduceat(traj, np.arange(0, traj.shape[0], k), axis=0), 46 | np.arange(0, traj.shape[1], k), axis=1) 47 | 48 | # We count non-empty boxes 49 | return len(np.where((S > 0))[0] & (S < k*k)[0]) 50 | 51 | 52 | # Transform Z into a binary array 53 | traj = (traj < threshold) 54 | 55 | # Minimal dimension of image 56 | p =traj.shape[0] 57 | 58 | # Greatest power of 2 less than or equal to p 59 | n = 2**np.floor(np.log(p)/np.log(2)) 60 | 61 | # Extract the exponent 62 | n = int(np.log(n)/np.log(2)) 63 | 64 | # Build successive box sizes (from 2**n down to 2**1) 65 | sizes = 2**np.arange(n, 1, -1) 66 | 67 | # Actual box counting with decreasing size 68 | counts = [] 69 | for size in sizes: 70 | c = boxcount(Z, size) 71 | counts.append(c) 72 | 73 | co = np.asarray(counts) 74 | si = np.asarray(sizes) 75 | zerotest = co != 0 76 | co = np.extract(zerotest, co) 77 | si = np.extract(zerotest, si) 78 | 79 | # Fit the successive log(sizes) with log (counts) 80 | plt.scatter(np.log(si),np.log(co)) 81 | coeffs = np.polyfit(np.log(si), np.log(co), 1) 82 | 83 | return(-coeffs[0]) 84 | 85 | i = plot_traj(test_traj,1) 86 | 87 | frac_dims = [None]*len(trajectories_20) 88 | for idx,tr in enumerate(trajectories_20): 89 | if(idx==100): 90 | break 91 | p = plot_traj(tr,1) 92 | picname = 'out'+str(idx)+'.png' 93 | #p.savefig(picname) 94 | # I = plt.imread(picname)/sizes[0] 95 | # if(np.isnan(I).any()=='False'): 96 | 97 | 98 | 99 | #%% PLOTTING 100 | xs = np.log(sizes) 101 | ys = np.log(counts) 102 | A = np.vstack([xs, np.ones(len(xs))]).T 103 | m,b = np.linalg.lstsq(A, ys)[0] 104 | def line(x): return m*x+b 105 | ys = line(xs) 106 | plt.plot(xs,ys) -------------------------------------------------------------------------------- /parallel_clustering.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Aug 22 00:06:30 2018 4 | 5 | @author: alari 6 | """ 7 | '''TRACLUS description: 8 | 1. Phase -- partitioning and grouping. 9 | 10 | This is done using formal trajectory partitioning algorithm using the minimum description 11 | length(MDL) principle. 12 | 13 | 14 | 2. Phase -- use of a particular type of density-based line-segment clustering algorithm (DBSCAN) to cluster similar 15 | sub-trajectories to the same clusters. 16 | 17 | Experimental results demonstrate that TRACLUS correctly discovers common sub-trajectories from real trajectory data''' 18 | 19 | 20 | '''Difference from DBSCAN: Unlike DBSCAN, however, not all density-connected sets 21 | can become clusters. We need to consider the number of 22 | trajectories from which line segments have been extracted. 23 | This number of trajectories is typically smaller than that of 24 | line segments. 25 | 26 | For example, in the extreme, all the line seg- 27 | ments in a density-connected set could be those extracted 28 | from one trajectory. We prevent such clusters since they do 29 | not explain the behavior of a sufficient number of trajec- 30 | tories. ''' 31 | 32 | 33 | '''How the algorithm works''' 34 | 35 | '''Initially, all the line segments are assumed to be unclas- 36 | sified. As the algorithm progresses, they are classified as 37 | either a cluster or a noise. The algorithm consists of three 38 | steps. In the first step (lines 1∼12), the algorithm computes 39 | the ε-neighborhood of each unclassified line segment L. If 40 | L is determined as a core line segment (lines 7∼10), the al- 41 | gorithm performs the second step to expand a cluster (line 42 | 9). The cluster currently contains only N ε (L). In the sec- 43 | ond step (lines 17∼28), the algorithm computes the density- 44 | connected set of a core line segment. The procedure Exp- 45 | landCluster() computes the directly density-reachable line 46 | segments (lines 19∼21) and adds them to the current clus- 47 | ter (lines 22∼24). If a newly added line segment is unclas- 48 | sified, it is added to the queue Q for more expansion since 49 | it might be a core line segment (lines 25∼26); otherwise, it 50 | is not added to Q since we already know that it is not a 51 | core line segment. In the third step (lines 13∼16), the algo- 52 | rithm checks the trajectory cardinality of each cluster. If its 53 | trajectory cardinality is below the threshold, the algorithm 54 | filters out the corresponding cluster.''' 55 | 56 | from multiprocessing import Process 57 | from multiprocessing import Pool, cpu_count 58 | import multiprocessing as mp 59 | import os 60 | import auxiliary as a 61 | import json 62 | import codecs 63 | from main2 import doIt 64 | import pickle 65 | import numpy as np 66 | 67 | def info(title): 68 | print(title) 69 | print('module name:', __name__) 70 | print('parent process:', os.getppid()) 71 | print('process id:', os.getpid()) 72 | 73 | def writeDataList(data_list_json): 74 | data_json_100 = data_list_json[0:100] 75 | with open('data_list_json_100.txt', 'wb') as f: 76 | pickle.dump(data_json_100, f,protocol=2) 77 | return(data_json_100) 78 | 79 | def readDataList(jsonfile): 80 | with open(jsonfile, 'rb') as f: 81 | data_list_json = pickle.load(f) 82 | return(data_list_json) 83 | 84 | def saveFileInfo(ifexists,data_list_json,dataname,dumpneeded): 85 | if(ifexists==0): 86 | with open(dataname, 'rb') as f: 87 | data_list_json = pickle.load(f) 88 | 89 | settings = a.produceConfigs() # all clustering settings to test out 90 | maxidx = 20 91 | filenames =[0]*maxidx*len(settings) 92 | # outnames =[0]*maxidx*len(settings) 93 | #trajectory_list =[0]*maxidx*len(settings) 94 | #cluster_list =[0]*maxidx*len(settings) 95 | multiplier = np.floor(len(data_list_json)/maxidx) 96 | for idx in range(0,maxidx): # chuncking into files for testing 97 | # ,"trajectories":cc} 98 | sub_prepared = data_list_json[int(idx*multiplier):int((idx+1)*multiplier)] # subset the data 99 | 100 | for setidx,se in enumerate(settings): 101 | se['trajectories']=sub_prepared # add the file to the setting dictionary 102 | param_and_traj = se 103 | # filenames for clusteringa 104 | filename = 'input'+str(idx)+'setting'+str(setidx)+'.txt' 105 | filenames[idx] = filename 106 | # outnames[idx] = 'out'+str(idx)+'setting'+str(setidx)+'.txt' 107 | # trajectory_list[idx] = 'trajectories'+str(idx)+'setting'+str(setidx)+'.txt' 108 | # cluster_list[idx] = 'clusters'+str(idx)+'setting'+str(setidx)+'.txt' 109 | 110 | fullpath = 'testdata/'+ filename 111 | if (dumpneeded ==1): 112 | with open(fullpath, 'wb') as f: 113 | json.dump(param_and_traj, codecs.getwriter('utf-8')(f), ensure_ascii=False) 114 | filenames,outnames,trajectory_list,cluster_list = a.giveFilenames(settings) 115 | return(filenames,outnames,trajectory_list,cluster_list) 116 | 117 | def doClustering(filenames): 118 | 119 | # info('function doClustering') 120 | problemidx = [None]*20 121 | for idx in range(0,len(filenames)): 122 | # python main.py -i in[idx] -o out[idx] 123 | try: # -m timeit 124 | doIt(filenames[idx],outnames[idx],trajectory_list[idx],cluster_list[idx]) 125 | except: 126 | problemidx[idx]=idx 127 | continue 128 | idx+=1 129 | return(problemidx) 130 | 131 | if __name__ == "__main__": 132 | #doClustering() 133 | data_json_100 = readDataList('data_list_json_100.txt') 134 | filenames,outnames,trajectory_list,cluster_list = saveFileInfo(1,data_json_100,'test',0) # file list 135 | 136 | pool = Pool(processes=int(4)) 137 | problemidx = pool.map(doClustering, filenames,chunksize=5) 138 | print(problemidx) 139 | # ============================================================================= 140 | # with Pool(4) as p: 141 | # p.map(doClustering) 142 | # ============================================================================= 143 | # ============================================================================= 144 | # p = Process(target=doClustering) # , args=('filenames','outnames') 145 | # p.start() 146 | # p.join() 147 | # ============================================================================= 148 | 149 | 150 | 151 | # ============================================================================= 152 | # python main.py -i filenames[idx] -o outnames[idx] 153 | # 154 | # python main.py -i "input2.txt" -o "out2.txt" 155 | # ============================================================================= 156 | # -m timeit 157 | -------------------------------------------------------------------------------- /read_data_and_analysis_start.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Aug 22 10:26:52 2018 4 | 5 | @author: alari 6 | """ 7 | 8 | 9 | #%% READING IN DATA 10 | import pandas as pd 11 | import numpy as np 12 | import os 13 | # pip install traclus_impl 14 | # pip install Rtree 15 | import traclus_impl as ti 16 | 17 | import auxiliary as aux 18 | 19 | from datetime import datetime 20 | 21 | def get_files(direc): 22 | full_files = [] 23 | for root, dirs, files in os.walk(direc): 24 | for name in files: 25 | full_files.append(os.path.join(root, name)) 26 | 27 | return(full_files) 28 | 29 | 30 | # full_files = get_files('/data') 31 | test_files = get_files('data2') 32 | 33 | print("Reading in the .txt files...") 34 | # dtypes = [int,datetime.datetime,float,float] 35 | to_datetime = lambda d: datetime.strptime(d, '%Y-%m-%d %H:%M:%S') 36 | 37 | data_list = [] 38 | for index, file_path in enumerate(test_files): 39 | data_list.append(pd.read_csv(file_path, \ 40 | parse_dates = True,\ 41 | names = ['taxi_id', 'date_time', 'longitude', 'latitude'],\ 42 | # header=None, # infer_datetime_format=True, 43 | dtype={'taxi_id':'int','longitude':'float','latitude':'float'},\ 44 | converters={'date_time': to_datetime})) 45 | 46 | 47 | #%% FEATUREPROCESSING AS DESCRIBED in the auxiliary module -- PIPING AND QUICK FEATURE CLEANING 48 | ''' In the test files we have 65 taxi files''' 49 | 50 | data_list = aux.doPipeForEach(data_list) 51 | data_list_json_test = aux.produceFormat(data_list,0) 52 | 53 | test_data = pd.concat(data_list, ignore_index=True) 54 | 55 | 56 | #%% FROM NOW ON, WORK WITH THE SUBSAMPLED DATA due to computational limitations 57 | # Remove outliers from the subsample 58 | 59 | def countunique(feature): return(len(np.unique(feature))) 60 | print('We will analyze %d unique taxis'% countunique(test_data['taxi_id'])) # verify that it is the shape[0] of test data 61 | 62 | 63 | 64 | #%% FEATURE ENGINEERING AND PROCESSING 65 | 66 | tab = aux.doTimeDistCrosstab(test_data) 67 | # ============================================================================= 68 | # on main data 69 | # time_ind False True 70 | # dist_ind 71 | # False 17625145 32902 72 | # True 4815 122 73 | # ============================================================================= 74 | 75 | # ============================================================================= 76 | # Out[93]: on test data 77 | 78 | # time_ind False True 79 | # dist_ind 80 | # False 100650 186 81 | # True 2 0 82 | # ============================================================================= 83 | 'From the crosstable we see that there is a relatively large group with high times but low distances, before filtering' 84 | 'Lets see if this number coincides with the amount of taxis' 85 | 86 | # ============================================================================= 87 | # countunique(data['taxi_id']) 88 | # Out[402]: 10336 89 | # 90 | # ============================================================================= 91 | 92 | 'So most of the high times cannot be explained by the shifts between the taxi files. This means that we have identified a' 93 | 'probable traffic jam + parkers+waiters cluster' 94 | --------------------------------------------------------------------------------