Если я правильно понимаю, вы хотите присвоить номер зоны начальной точке и конечной точке каждой машины. Поскольку в данных о границах имеется информация о многоугольнике формы городских зон (из нескольких столбцов), я предлагаю вам использовать эту информацию для пространственного соединения начальных / конечных точек, чтобы увидеть, в какой зоне автомобиль начинает / заканчивает поездку. Вот мое предложение более подробно:
Я предполагаю, что вы уже прочитали данные в border
и data
и что они правильно отформатированы (т.е. каждая ячейка в столбце multi
из border
содержит Shapley.Multipolygon
). Я также предполагаю, что ваши зоны не пересекаются, то есть не перекрываются.
A GeoDataFrame
нуждается в столбце геометрии, поскольку он может распознавать только столбец с таким именем в качестве геометрической информации:
border['geometry'] = border['multi']
Теперь мы также генерируем геометрическую информацию для точек, указанных в данных автомобиля в df
:
df['geometry'] = df[['longitude', 'latitude']].apply(lambda x: Point(x[0], x[1]), axis=1)
Как вы уже сделали, давайте теперь извлечем начальную и конечную точки:
df_first = df.drop_duplicates(subset=['id_easy'], keep='first')
df_last = df.drop_duplicates(subset=['id_easy'], keep='last')
Теперь мы можем сделать пространственное соединение, чтобы получить зоны каждой начальной и конечной точки по желанию:
df_first = gpd.sjoin(df_first, shp.loc[:, ['geometry', 'zone']], how='left', op='within')
df_last = gpd.sjoin(df_last, shp.loc[:, ['geometry', 'zone']], how='left', op='within')
Вот и все. Теперь у вас есть информация о зонах в столбце zone
для каждой точки.