У меня есть кадр данных, на котором есть координаты (записанный маршрут). Структура фрейма данных выглядит примерно так (имеет больше столбцов):
Нет Широта Долгота Высота Скорость Курс Дата Время и т.д.
0 59,303758 18,078915 NaN 0,0 114,9 2017/04/01 13:21:48
1 59.303758 18.078915 -8.5 0.0 114.9 2017/04/01 13:21:49
2 59.303758 18.078915 -8.5 0.0 114.9 2017/04/01 13:21:50
,
,
и список продолжается...
Я пытаюсь разобрать ненужные точки из фрейма данных. Пример на картинке. Красная линия представляет координатные точки из фрейма данных, я хочу получить только точки на зеленых полях.
Пример кода:
#north
y_1n=59.33551 #point 1 latitude
x_1n=18.02649 #point 1 longitude
y_2n=59.33327 #point 2 latitude
x_2n=18.04500 #point 2 longitude
#south
y_1s=59.33478 #point 3 latitude
x_1s=18.02645 #point 3 longitude
y_2s=59.33246 #point 4 latitude
x_2s=18.04422 #point 4 longitude
#
test = df1[(df1['Latitude'] <= y_1n) & (df1['Latitude'] >= y_2n) &
(df1['Latitude'] <= y_1s) & (df1['Latitude'] >= y_2s) &
(df1['Longitude'] >= x_1n) & (df1['Longitude'] <= x_2n) &
(df1['Longitude'] >= x_1s) & (df1['Longitude'] <= x_2s)
]
Таким образом, идея состоит в том, что в новый кадр данных включены только данные внутри этих предопределенных 2 северных и 2 южных точек (координатных точек).
С помощью этого кода мне удалось проанализировать данные, но он был далек от северных и южных точек (только половина улицы была включена). Так оно и делало, разобрав это или что-то странное.
Есть ли лучший или эффективный способ сделать это?
Я решил это следующим образом.
Сначала я создал Geopandas Dataframe и использовал Shapely для создания многоугольника. Затем я добавил многоугольник в кадр данных. Также добавлено место для соответствия многоугольнику.
import geopandas as gpd
from shapely.geometry import Point, Polygon, LineString
polygon = gpd.GeoDataFrame()
coord = [(18.02649,59.33551),(18.04500,59.33327),(18.02645,59.33478),
(18.04422,59.33246)]
polygon.loc[0, 'geometry'] = Polygon(coord)
polygon.loc[0, 'Location'] = 'Fleminggatan'
Затем я сделал копию из Pandas DataFrame в DataFrame Geopandas.
df2 = gpd.GeoDataFrame(df1)
После этого я сделал новую серию для серии DataFrame, объединенной в Latitude & Longitude.
df2['geometry'] = [Point(xy) for xy in zip(df2.Longitude, df2.Latitude)]
Затем я использовал Geopandas Spatial Join. (op) не имеет значения, потому что я соединяю точки с многоугольником. если бы это были линии, это имело бы значение.
df3 = gpd.sjoin(df2,polygon, how='inner', op='intersects')
После этого у меня остался DataFrame с данными в нужном месте.
Прямоугольник не согласован с долготой и широтой, поэтому вы не можете использовать свой простой длинный/лат-чек. Простой способ сделать это - рассмотреть линию с заданной долготы/широты и расширить ее на несколько миль (немного больше, чем прямоугольник) в случайном направлении (возможно, для упрощения).
Затем запишите функцию intersect(Point1, Point2, Point3, Point4)
которая возвращает true, если линия (P1, P2) пересекает линию (P1, P2). Затем, с расширенной линией, проверьте, сколько ребер вашего ограничивающего прямоугольника пересекается. Если ответ один, тогда вы хороши, вы внутри коробки.