Python, фрейм данных pandas, условное форматирование для координат

1

У меня есть кадр данных, на котором есть координаты (записанный маршрут). Структура фрейма данных выглядит примерно так (имеет больше столбцов):

Нет Широта Долгота Высота Скорость Курс Дата Время и т.д.

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 южных точек (координатных точек).

С помощью этого кода мне удалось проанализировать данные, но он был далек от северных и южных точек (только половина улицы была включена). Так оно и делало, разобрав это или что-то странное.

Есть ли лучший или эффективный способ сделать это?

  • 0
    Должен ли df1 быть одной строкой?
  • 0
    df1 - это pandas DataFrame с несколькими столбцами и строками.
Теги:
pandas
coordinates
gps

2 ответа

0

Я решил это следующим образом.

Сначала я создал 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 с данными в нужном месте.

0

Прямоугольник не согласован с долготой и широтой, поэтому вы не можете использовать свой простой длинный/лат-чек. Простой способ сделать это - рассмотреть линию с заданной долготы/широты и расширить ее на несколько миль (немного больше, чем прямоугольник) в случайном направлении (возможно, для упрощения).

Затем запишите функцию intersect(Point1, Point2, Point3, Point4) которая возвращает true, если линия (P1, P2) пересекает линию (P1, P2). Затем, с расширенной линией, проверьте, сколько ребер вашего ограничивающего прямоугольника пересекается. Если ответ один, тогда вы хороши, вы внутри коробки.

  • 0
    Это приведет к странным краевым случаям на главном меридиане или полюсах. Я представляю, что вы не заботитесь о полюсах, но если вы находитесь рядом с основным меридианом, добавьте очень большое значение к долготе, чтобы у вас не было отрицательных чисел. Вы также можете сделать расширение, например, 500 миль (и, таким образом, обрабатывать ситуации с меридианом в пределах 600 миль от меридиана), чтобы не столкнуться с большими проблемами прямоугольника.
  • 0
    Да, я попробовал этот метод, но мне показалось слишком неуклюжим для того, что я пытаюсь сделать. Но вы направили меня на правильный путь с этой идеей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню