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_to_line_gdf(self): 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, 6), "t": datetime(2018, 1, 1, 12, 10, 0) }, ]).set_index("t") geo_df = GeoDataFrame(df, crs=CRS_METRIC) traj = Trajectory(geo_df, 1) line_gdf = traj.to_line_gdf() df2 = pd.DataFrame([ { "t": datetime(2018, 1, 1, 12, 6, 0), "prev_t": datetime(2018, 1, 1, 12, 0, 0), "geometry": LineString([(0, 0), (6, 0)]), }, { "t": datetime(2018, 1, 1, 12, 10, 0), "prev_t": datetime(2018, 1, 1, 12, 6, 0), "geometry": LineString([(6, 0), (6, 6)]), }, ]) expected_line_gdf = GeoDataFrame(df2, crs=CRS_METRIC) assert_frame_equal(line_gdf, expected_line_gdf)
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_get_linestring_between_interpolate_ValueError(self): # test for https://github.com/anitagraser/movingpandas/issues/118 # (not sure what causes this problem) 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, 6), "t": datetime(2018, 1, 1, 12, 10, 0) }, { "geometry": Point(9, 9), "t": datetime(2018, 1, 1, 12, 15, 0) }, ]).set_index("t") toy_traj = Trajectory(GeoDataFrame(df, crs=31256), 1) result = toy_traj.get_linestring_between( datetime(2018, 1, 1, 12, 6, 0), datetime(2018, 1, 1, 12, 11, 0), method="interpolated", ).wkt assert result == "LINESTRING (6 0, 6 6, 6.6 6.6)"
def test_get_bbox(self): df = pd.DataFrame([ {'geometry': Point(0, 1), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(6, 5), 't': datetime(2018, 1, 1, 12, 0, 1)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(4326)) traj = Trajectory(1, geo_df) result = traj.get_bbox() expected_result = (0, 1, 6, 5) # (minx, miny, maxx, maxy) self.assertEqual(expected_result, result)
def test_get_length_euclidiean(self): df = pd.DataFrame([ {'geometry': Point(0, 2), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(6, 0), 't': datetime(2018, 1, 1, 12, 0, 1)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) result = traj.get_length() expected_result = 6.3 self.assertAlmostEqual(expected_result, result, 1)
def test_get_interpolated_position_at_existing_timestamp(self): 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, 20, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) result = traj.get_position_at(datetime(2018, 1, 1, 12, 10, 0), method='interpolated') expected_result = Point(6, 0) self.assertEqual(expected_result, result)
def test_endlocation(self): 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)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) result = traj.get_end_location() expected_result = Point(10, 0) self.assertEqual(expected_result, result)
def test_add_meters_per_sec_latlon(self): df = pd.DataFrame([ {'geometry': Point(0, 1), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(6, 0), 't': datetime(2018, 1, 1, 12, 0, 1)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(4326)) traj = Trajectory(1, geo_df) traj.add_speed() result = traj.df[SPEED_COL_NAME].tolist()[0]/1000 expected_result = 676.3 self.assertAlmostEqual(expected_result, result, 1)
def test_nonchronological_input(self): df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 2, 0, 0, 0)}, {'geometry': Point(1, 1), 't': datetime(2018, 1, 3, 0, 0, 0)}, {'geometry': Point(2, 2), 't': datetime(2018, 1, 1, 0, 0, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) self.assertEqual(datetime(2018, 1, 1), traj.get_start_time()) self.assertEqual(datetime(2018, 1, 3), traj.get_end_time()) self.assertEqual(Point(2, 2), traj.get_start_location())
def test_add_heading_latlon(self): df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(10, 10), 't': datetime(2018, 1, 1, 12, 10, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(4326)) traj = Trajectory(1, geo_df) traj.add_direction() result = traj.df[DIRECTION_COL_NAME].tolist() expected_result = [44.561451413257714, 44.561451413257714] self.assertAlmostEqual(expected_result[0], result[0], 5)
def test_plot(self): from matplotlib.axes import Axes 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)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) result = traj.plot() self.assertIsInstance(result, Axes)
def test_linestring_wkt(self): 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)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) result = traj.to_linestring().wkt expected_result = "LINESTRING (0 0, 6 0, 10 0)" self.assertEqual(expected_result, result)
def test_linstring_m_wkt(self): df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(1970, 1, 1, 0, 0, 1)}, {'geometry': Point(6, 0), 't': datetime(1970, 1, 1, 0, 0, 2)}, {'geometry': Point(10, 0), 't': datetime(1970, 1, 1, 0, 0, 3)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) result = traj.to_linestringm_wkt() expected_result = "LINESTRING M (0.0 0.0 1.0, 6.0 0.0 2.0, 10.0 0.0 3.0)" self.assertEqual(expected_result, result)
def test_add_meters_per_sec(self): 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, 0, 1)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) traj.add_speed() result = traj.df[SPEED_COL_NAME].tolist() expected_result = [6.0, 6.0] self.assertEqual(expected_result, result)
def test_douglas_peucker(self): df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(1, 0.1), 't': datetime(2018, 1, 1, 12, 6, 0)}, {'geometry': Point(2, 0.2), 't': datetime(2018, 1, 1, 12, 10, 0)}, {'geometry': Point(3, 0), 't': datetime(2018, 1, 1, 12, 30, 0)}, {'geometry': Point(3, 3), '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.generalize(mode='douglas-peucker', tolerance=1) self.assertEqual('LINESTRING (0 0, 3 0, 3 3)', result.to_linestring().wkt)
def test_get_linestring_between(self): df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(10, 0), 't': datetime(2018, 1, 1, 12, 10, 0)}, {'geometry': Point(20, 0), 't': datetime(2018, 1, 1, 12, 20, 0)}, {'geometry': Point(30, 0), 't': datetime(2018, 1, 1, 12, 30, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) result = traj.get_linestring_between(datetime(2018, 1, 1, 12, 5, 0), datetime(2018, 1, 1, 12, 25, 0, 50)).wkt expected_result = "LINESTRING (10 0, 20 0)" self.assertEqual(result, expected_result)
def test_add_heading(self): 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(6, -6), 't': datetime(2018, 1, 1, 12, 20, 0)}, {'geometry': Point(-6, -6), 't': datetime(2018, 1, 1, 12, 30, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) traj.add_direction() result = traj.df[DIRECTION_COL_NAME].tolist() expected_result = [90.0, 90.0, 180.0, 270] self.assertEqual(expected_result, result)
def test_split_by_daybreak_same_day_of_year(self): df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(-6, 10), 't': datetime(2018, 1, 1, 12, 1, 0)}, {'geometry': Point(6, 6), 't': datetime(2019, 1, 1, 12, 0, 1)}, {'geometry': Point(6, 16), 't': datetime(2019, 1, 1, 12, 5, 1)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) split = traj.split_by_date() result = len(split) expected_result = 2 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_offset_minutes(self): df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0), 'value': 1}, {'geometry': Point(-6, 10), 't': datetime(2018, 1, 1, 12, 1, 0), 'value': 2}, {'geometry': Point(6, 6), 't': datetime(2018, 1, 1, 12, 2, 0), 'value': 3}, {'geometry': Point(6, 12), 't': datetime(2018, 1, 1, 12, 3, 0), 'value': 4}, {'geometry': Point(6, 18), 't': datetime(2018, 1, 1, 12, 4, 0), 'value': 5} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) traj.apply_offset_minutes('value', -2) self.assertEqual(5, traj.df.iloc[2].value) self.assertEqual(Point(6, 6), traj.df.iloc[2].geometry)
def test_get_position_with_invalid_method(self): 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, 20, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) try: result = traj.get_position_at(datetime(2018, 1, 1, 12, 10, 0), method='xxx') assert False except ValueError: assert True
def test_split_by_observation_gap_skip_single_points(self): df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(-6, 10), 't': datetime(2018, 1, 1, 12, 1, 0)}, {'geometry': Point(6, 6), 't': datetime(2018, 1, 1, 12, 5, 0)}, {'geometry': Point(6, 16), 't': datetime(2018, 1, 1, 12, 6, 30)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) split = traj.split_by_observation_gap(timedelta(seconds=61)) result = len(split) expected_result = 1 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_mcp_line(self): df = pd.DataFrame([ { "geometry": Point(0, 0), "t": datetime(1970, 1, 1, 0, 0, 0) }, { "geometry": Point(6, 0), "t": datetime(1970, 1, 1, 0, 6, 0) }, ]).set_index("t") geo_df = GeoDataFrame(df, crs=CRS_METRIC) traj = Trajectory(geo_df, 1) mcp = traj.get_mcp() assert mcp.wkt == "LINESTRING (0 0, 6 0)"
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_get_segment_between_new_timestamps(self): df = pd.DataFrame([ {'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0)}, {'geometry': Point(10, 0), 't': datetime(2018, 1, 1, 12, 10, 0)}, {'geometry': Point(20, 0), 't': datetime(2018, 1, 1, 12, 20, 0)}, {'geometry': Point(30, 0), 't': datetime(2018, 1, 1, 12, 30, 0)} ]).set_index('t') geo_df = GeoDataFrame(df, crs=from_epsg(31256)) traj = Trajectory(1, geo_df) result = traj.get_segment_between(datetime(2018, 1, 1, 12, 5, 0), datetime(2018, 1, 1, 12, 25, 0, 50)).df expected_result = pd.DataFrame([ {'geometry': Point(10, 0), 't': datetime(2018, 1, 1, 12, 10, 0)}, {'geometry': Point(20, 0), 't': datetime(2018, 1, 1, 12, 20, 0)} ]).set_index('t') pd.testing.assert_frame_equal(result, expected_result)
def test_sparse_trajectory(self): df = pd.DataFrame([{ 'id': 1, 'geometry': Point(0, 0), 't': datetime(2018, 1, 1, 12, 0, 0) }, { 'id': 1, 'geometry': Point(6, 0), 't': datetime(2018, 1, 1, 12, 6, 0) }, { 'id': 1, 'geometry': Point(6, 6), 't': datetime(2018, 1, 1, 14, 10, 0) }]).set_index('t') geo_df = GeoDataFrame(df, crs=CRS_METRIC) traj = Trajectory(geo_df, 'id') extractor = _PtsExtractor(traj, 5, 0, min_stop_duration=timedelta(hours=12)) actual = extractor.find_significant_points() expected = [Point(0, 0), Point(6, 0), Point(6, 6)] assert len(actual) == len(expected) for pt in expected: assert pt in actual
def test_sparse_trajectory(self): df = DataFrame([ { "id": 1, "geometry": Point(0, 0), "t": datetime(2018, 1, 1, 12, 0, 0) }, { "id": 1, "geometry": Point(6, 0), "t": datetime(2018, 1, 1, 12, 6, 0) }, { "id": 1, "geometry": Point(6, 6), "t": datetime(2018, 1, 1, 14, 9, 0) }, ]).set_index("t") geo_df = GeoDataFrame(df, crs=CRS_METRIC) traj = Trajectory(geo_df, "id") extractor = _PtsExtractor(traj, 5, 0, min_stop_duration=timedelta(hours=12)) actual = extractor.find_significant_points() expected = [Point(0, 0), Point(6, 0), Point(6, 6)] assert len(actual) == len(expected) for pt in expected: assert pt in actual
def test_intersection_with_one_intersection(self): feature = { 'geometry': {'type': 'Polygon', 'coordinates': [[(5, -5), (7, -5), (8, 5), (5, 5), (5, -5)]]}, 'properties': {'id': 1, 'name': 'foo'}} 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.intersection(feature) result = list(intersections[0].df.columns) expected_result = ['geometry', 'intersecting_id', 'intersecting_name'] self.assertCountEqual(expected_result, result)