def test_clip_two_intersections_with_same_polygon(self): polygon = Polygon([(5, -5), (7, -5), (7, 12), (5, 12), (5, -5)]) df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(6, 0), 't': datetime(2018, 1, 1, 12, 6, 0)}, {'geometry': Point(10, 0), 't': datetime(2018, 1, 1, 12, 10, 0)}, {'geometry': Point(10, 10), 't': datetime(2018, 1, 1, 12, 30, 0)}, {'geometry': Point(0, 10), 't': datetime(2018, 1, 1, 13, 0, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) intersections = traj.clip(polygon) # spatial result = [] for x in intersections: result.append(x.to_linestring().wkt) expected_result = ["LINESTRING (5 0, 6 0, 7 0)", "LINESTRING (7 10, 5 10)"] self.assertEqual(expected_result, result) # temporal result = [] for x in intersections: result.append((x.get_start_time(), x.get_end_time())) expected_result = [(datetime(2018, 1, 1, 12, 5, 0), datetime(2018, 1, 1, 12, 7, 0)), (datetime(2018, 1, 1, 12, 39, 0), datetime(2018, 1, 1, 12, 45, 0))] self.assertEqual(expected_result, result) # ids result = [] for x in intersections: result.append(x.id) expected_result = ['1_0', '1_1'] self.assertEqual(expected_result, result)
def test_clip_pointbased(self): polygon = Polygon([(5.1, -5), (7.5, -5), (7.5, 12), (5.1, 12), (5.1, -5)]) df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(6, 0), 't': datetime(2018, 1, 1, 12, 6, 0)}, {'geometry': Point(6.5, 0), 't': datetime(2018, 1, 1, 12, 6, 30)}, {'geometry': Point(7, 0), 't': datetime(2018, 1, 1, 12, 7, 0)}, {'geometry': Point(10, 0), 't': datetime(2018, 1, 1, 12, 11, 0)}, {'geometry': Point(10, 10), 't': datetime(2018, 1, 1, 12, 30, 0)}, {'geometry': Point(5, 10), 't': datetime(2018, 1, 1, 12, 45, 0)}, {'geometry': Point(0, 10), 't': datetime(2018, 1, 1, 13, 0, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) intersections = traj.clip(polygon, pointbased=True) # spatial result = [] for x in intersections: result.append(x.to_linestring()) expected_result = [LineString([(6, 0), (6.5, 0), (7, 0)])] self.assertEqual(expected_result, result) # temporal result = [] for x in intersections: result.append((x.get_start_time(), x.get_end_time())) expected_result = [(datetime(2018, 1, 1, 12, 6, 0), datetime(2018, 1, 1, 12, 7, 0))] self.assertEqual(expected_result, result) # ids result = [] for x in intersections: result.append(x.id) expected_result = ['1_0'] self.assertEqual(expected_result, result)
def test_clip_with_no_intersection(self): polygon = Polygon([(105, -5), (107, -5), (107, 12), (105, 12), (105, -5)]) df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(6, 0), 't': datetime(2018, 1, 1, 12, 10, 0)}, {'geometry': Point(10, 0), 't': datetime(2018, 1, 1, 12, 15, 0)}, {'geometry': Point(10, 10), 't': datetime(2018, 1, 1, 12, 30, 0)}, {'geometry': Point(0, 10), 't': datetime(2018, 1, 1, 13, 0, 0)}]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) result = traj.clip(polygon) expected_result = [] self.assertEqual(expected_result, result)
def test_clip_with_numerical_time_issues(self): xmin, xmax, ymin, ymax = 116.36850352835575, 116.37029459899574, 39.904675309969896, 39.90772814977718 polygon = Polygon([(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin), (xmin, ymin)]) df = pd.DataFrame([ {'geometry': Point(116.36855, 39.904926), 't': datetime(2009, 3, 10, 11, 3, 35)}, {'geometry': Point(116.368612, 39.904877), 't': datetime(2009, 3, 10, 11, 3, 37)}, {'geometry': Point(116.368644, 39.90484), 't': datetime(2009, 3, 10, 11, 3, 39)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) intersection = traj.clip(polygon)[0] result = intersection.to_linestring().wkt expected_result = "LINESTRING (116.36855 39.904926, 116.368612 39.904877, 116.368644 39.90484)" self.assertEqual(expected_result, result)
def test_clip_pointbased_singlepoint(self): polygon = Polygon([(5.1, -5), (6.4, -5), (6.4, 12), (5.1, 12), (5.1, -5)]) df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(6, 0), 't': datetime(2018, 1, 1, 12, 6, 0)}, {'geometry': Point(6.5, 0), 't': datetime(2018, 1, 1, 12, 6, 30)}, {'geometry': Point(7, 0), 't': datetime(2018, 1, 1, 12, 7, 0)}, {'geometry': Point(10, 0), 't': datetime(2018, 1, 1, 12, 11, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) intersections = traj.clip(polygon, pointbased=True) result = intersections expected_result = [] self.assertEqual(expected_result, result)
def test_clip_interpolated_singlepoint(self): polygon = Polygon([(5.1, -5), (6.4, -5), (6.4, 12), (5.1, 12), (5.1, -5)]) df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(6, 0), 't': datetime(2018, 1, 1, 12, 6, 0)}, {'geometry': Point(6.5, 0), 't': datetime(2018, 1, 1, 12, 6, 30)}, {'geometry': Point(7, 0), 't': datetime(2018, 1, 1, 12, 7, 0)}, {'geometry': Point(10, 0), 't': datetime(2018, 1, 1, 12, 11, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) intersections = traj.clip(polygon, pointbased=False) result = [] for x in intersections: result.append(x.to_linestring()) expected_result = [LineString([(5.1, 0), (6.0, 0), (6.4, 0)])] self.assertEqual(expected_result, result)
def test_clip_with_milliseconds(self): polygon = Polygon([(5, -5), (7, -5), (8, 5), (5, 5), (5, -5)]) df = pd.DataFrame([ {'geometry': Point(0, 10), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(10, 10), 't': datetime(2018, 1, 1, 12, 10, 0)}, {'geometry': Point(10, 0), 't': datetime(2018, 1, 1, 12, 15, 0)}, {'geometry': Point(6, 0), 't': datetime(2018, 1, 1, 12, 30, 0)}, {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 13, 0, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) intersection = traj.clip(polygon)[0] # spatial result = intersection.to_linestring().wkt expected_result = "LINESTRING (7.5 0, 6 0, 5 0)" self.assertEqual(expected_result, result) # temporal self.assertAlmostEqual(datetime(2018, 1, 1, 12, 24, 22, 500000), intersection.get_start_time(), delta=timedelta(milliseconds=1)) self.assertEqual(datetime(2018, 1, 1, 12, 35, 0), intersection.get_end_time())
if __name__ == '__main__': xmin, xmax, ymin, ymax = 116.3685035, 116.3702945, 39.904675, 39.907728 polygon = Polygon([(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin), (xmin, ymin)]) t_start = datetime.now() df = read_file(os.path.join(script_path, 'demodata_geolife.gpkg')) df['t'] = pd.to_datetime(df['t']) df = df.set_index('t') print("Finished reading {} rows in {}".format(len(df), datetime.now() - t_start)) t_start = datetime.now() trajectories = [] for key, values in df.groupby(['trajectory_id']): trajectory = Trajectory(key, values) print(trajectory) trajectories.append(trajectory) print("Finished creating {} trajectories in {}".format( len(trajectories), datetime.now() - t_start)) t_start = datetime.now() intersections = [] for key, values in df.groupby(['trajectory_id']): traj = Trajectory(key, values) for intersection in traj.clip(polygon): intersections.append(intersection) print("Found {} intersections in {}".format(len(intersections), datetime.now() - t_start))