анализ данных с использованием gps-координат

#python #jupyter-notebook #gps #data-analysis #analysis

Вопрос:

У меня есть такого рода данные, которые содержат метку времени, долготу,широту и идентификатор поездки,

могу ли я, вероятно, найти время ожидания в пересечении только по этим данным или мне нужно что-то другое? и какую информацию я могу получить из такого рода данных?

«метка времени»,»трипИд»,»долгота»,»широта» «2021-07-05 10:35:04″,»1866491″,»8.167035″,»53.160473» «2021-07-05 10:35:03″,»1866491″,»8.167023″,»53.160469» «2021-07-05 10:35:02″,»1866491″,»8.167007″,»53.160459» «2021-07-05 10:35:01″,»1866491″,»8.166987″,»53.160455» «2021-07-05 10:35:00″,»1866491″,»8.166956″,»53.160448» «2021-07-05 10:34:20″,»1866491″,»8.167286″,»53.15919» «2021-07-05 10:34:19″,»1866491″,»8.167328″,»53.15918» «2021-07-05 10:34:18″,»1866491″,»8.16735″,»53.159165» «2021-07-05 10:34:17″,»1866491″,»8.167371″,»53.159148» «2021-07-05 10:34:16″,»1866491″,»8.167388″,»53.159124» «2021-07-05 10:34:15″,»1866491″,»8.167399″,»53.159105» «2021-06-30 20:25:30″,»1862861″,»8.211288″,»53.150848» «2021-06-30 20:25:29″,»1862861″,»8.211264″,»53.150851» «2021-06-30 20:25:28″,»1862861″,»8.211269″,»53.150842» «2021-06-30 20:25:27″,»1862861″,»8.211273″,»53.150836» «2021-06-30 20:25:26″,»1862861″,»8.211279″,»53.150836» «2021-06-30 20:25:25″,»1862861″,»8.211259″,»53.150848» «2021-06-30 20:25:24″,»1862861″,»8.211263″,»53.15085» «2021-06-30 20:25:21″,»1862861″,»8.211455″,»53.150782» «2021-06-30 20:25:20″,»1862861″,»8.211453″,»53.150786» «2021-06-30 20:25:19″,»1862861″,»8.211449″,»53.150792»

Ответ №1:

Ответ на этот вопрос:

какую информацию я могу получить из такого рода данных

У вас есть a timestamp , a tripId и координата ( longitude и latitude ).

Таким образом, вы знаете, что человек или транспортное средство находились в указанном месте 8.166987 / 53.160455 во время его/ее поездки 1866491 по адресу 2021-07-05 10:35:01 . Кроме того, вы можете рассчитать продолжительность поездки.

Вы также можете создать линию, соединив все координаты поездки в последовательности отметки времени. А затем вы сможете узнать, в каком месте эти поездки пересекаются друг с другом.

Из линейных объектов вы можете рассчитать их длину (расстояние поездки). Вместе с продолжительностью поездки вы также можете рассчитать среднюю скорость ходьбы или движения.

(Однако в вашем примере данных нет поездок, пересекающихся друг с другом. Я не совсем понимаю, что вы имеете в виду под временем ожидания.)


Ниже приведен пример сценария, как преобразовать точки в линии и найти точки, в которых поездки пересекают путь друг друга:

 from itertools import combinations

import pandas as pd
import geopandas as gpd

from shapely.geometry import LineString

# Read CSV File
df = pd.read_csv("trips.csv")

# Create Points
points = gpd.GeoDataFrame(
    df,
    geometry=gpd.points_from_xy(df.longitude, df.latitude),
    crs="EPSG:4326"
)
points = points.drop(columns=["latitude", "longitude"])

# Make sure Points are ordered (important)
points = points.sort_values(["tripId", "timestamp"])

# Create Lines
tolist = lambda x: LineString(x.tolist())
lines = points.groupby(["tripId"], as_index=False)["geometry"].apply(tolist)
lines = gpd.GeoDataFrame(lines, geometry="geometry", crs="EPSG:4326")
 

Найдите точки, где пути поездок пересекаются друг с другом:

 # Get Intersection Points
template={"tripA":[], "tripB":[], "geometry":[]}
intersection_points = gpd.GeoDataFrame(template, geometry="geometry")
for index in combinations(lines.index, 2):
    
    combination = lines.loc[index,:]
    
    geometries = combination["geometry"].tolist()
    point = geometries[0].intersection(geometries[1])

    if point:  # LINESTRING EMPTY evaluates to false

        trips = combination["tripId"].tolist()
        row = pd.Series([trips[0], trips[1], point], index=intersection_points.columns)
        intersection_points = intersection_points.append(row, ignore_index=True)
 

Запись intersection_points в CSV-файл:

 intersection_points["longitude"] = intersection_points.geometry.x
intersection_points["latitude"] = intersection_points.geometry.y

columns = ["tripA", "tripB", "latitude", "longitude"]
intersection_points.to_csv("intersections.csv", columns=columns)
 

Запишите созданные линии и точки пересечения в файлы формы:

 # Write Shape Files
lines.to_file("trips.shp")
intersection_points.to_file("intersections.shp")
 

Примеры данных с двумя поездками, пересекающимися друг с другом (на основе примеров данных вопроса):

 "timestamp","tripId","longitude","latitude"
"2021-07-05 10:35:04","1866491","8.167035","53.160473"
"2021-07-05 10:35:03","1866491","8.167023","53.160469"
"2021-07-05 10:35:02","1866491","8.167007","53.160459"
"2021-07-05 10:35:01","1866491","8.166987","53.160455"
"2021-07-05 10:35:00","1866491","8.166956","53.160448"
"2021-07-05 10:34:20","1866491","8.167286","53.15919"
"2021-07-05 10:34:19","1866491","8.167328","53.15918"
"2021-07-05 10:34:18","1866491","8.16735","53.159165"
"2021-07-05 10:34:17","1866491","8.167371","53.159148"
"2021-07-05 10:34:16","1866491","8.167388","53.159124"
"2021-07-05 10:34:15","1866491","8.167399","53.159105"
"2021-06-30 20:25:30","1862861","8.211288","53.150848"
"2021-06-30 20:25:29","1862861","8.211264","53.150851"
"2021-06-30 20:25:28","1862861","8.211269","53.150842"
"2021-06-30 20:25:27","1862861","8.211273","53.150836"
"2021-06-30 20:25:26","1862861","8.211279","53.150836"
"2021-06-30 20:25:25","1862861","8.211259","53.150848"
"2021-06-30 20:25:24","1862861","8.211263","53.15085"
"2021-06-30 20:25:21","1862861","8.211455","53.150782"
"2021-06-30 20:25:19","1862861","8.211449","53.150792"
"2021-06-30 20:25:20","1862861","8.211453","53.150786"
"2021-06-30 20:25:18","1862861","8.166607","53.159654"
 

Комментарии:

1. Большое вам спасибо, сэр, за ваш ответ, который был полезен :У меня просто есть еще один вопрос, есть ли возможность рассчитать время ожидания на каждом перекрестке для каждого tripID ? Благодаря вашему коду у нас теперь есть также все пересечения, должны ли мы, вероятно, сравнивать только то, изменились ли долгота и широта или нет? если это не изменится, это означает, что пользователь ждет, а затем мы должны проверить, является ли это пересечением, если это так, то мы должны увидеть на «отметке времени», сколько времени это заняло.. или есть другой способ рассчитать время ожидания на перекрестках

2. Пожалуйста. Нет, я не вижу способа сократить время ожидания на перекрестке. Вам нужно будет знать, когда они прибыли на перекресток и когда они уехали. У вас нет этой информации. По крайней мере, не с приведенными примерами данных. Извините.