Проверка, находятся ли точки внутри полигонов - PullRequest
0 голосов
/ 24 марта 2020

У меня есть два набора данных в формате geo JSON. Используя geo Pandas, с одной стороны, у меня есть набор данных с координатами различных точек в определенном городе.

Таблица gdf:

╔═══╦════════╦══════════╦══════════════════════╦═════════╦══════════╦══════════════════════════╗
║   ║ id     ║ layer_id ║ title                ║ lon     ║ lat      ║ geometry                 ║
╠═══╬════════╬══════════╬══════════════════════╬═════════╬══════════╬══════════════════════════╣
║ 0 ║ 83969  ║ 12       ║ Garces               ║ 2.15351 ║ 41.37926 ║ POINT (2.15351 41.37926) ║
╠═══╬════════╬══════════╬══════════════════════╬═════════╬══════════╬══════════════════════════╣
║ 1 ║ 86258  ║ 146      ║ Ritsch               ║ 2.16235 ║ 41.38429 ║ POINT (2.16235 41.38429) ║
╠═══╬════════╬══════════╬══════════════════════╬═════════╬══════════╬══════════════════════════╣
║ 2 ║ 83964  ║ 40       ║ Lunch & Catering Bar ║ 2.15368 ║ 41.37913 ║ POINT (2.15368 41.37913) ║
╠═══╬════════╬══════════╬══════════════════════╬═════════╬══════════╬══════════════════════════╣
║ 3 ║ 83970  ║ 8        ║ Galaxia              ║ 2.15343 ║ 41.37932 ║ POINT (2.15343 41.37932) ║
╠═══╬════════╬══════════╬══════════════════════╬═════════╬══════════╬══════════════════════════╣
║ 4 ║ 74866  ║ 40       ║ Celler de l`Abi      ║ 2.14207 ║ 41.3694  ║ POINT (2.14207 41.36941) ║
╚═══╩════════╩══════════╩══════════════════════╩═════════╩══════════╩══════════════════════════╝

С другой стороны, у меня есть еще один набор данных, в котором полигоны разных областей расположены в одном городе.

Таблица полисов:

╔═══╦═══════╦═════╦═══════════════════════════════════════════════════╗
║   ║ Name  ║ ... ║ geometry                                          ║
╠═══╬═══════╬═════╬═══════════════════════════════════════════════════╣
║ 0 ║ aoi_1 ║ ... ║ POLYGON Z ((2.13049 41.38221 0.00000, 2.13101 ... ║
╠═══╬═══════╬═════╬═══════════════════════════════════════════════════╣
║ 1 ║ aoi_2 ║ ... ║ POLYGON Z ((2.14463 41.39321 0.00000, 2.14495 ... ║
╠═══╬═══════╬═════╬═══════════════════════════════════════════════════╣
║ 2 ║ aoi_3 ║ ... ║ POLYGON Z ((2.14592 41.39374 0.00000, 2.14613 ... ║
╠═══╬═══════╬═════╬═══════════════════════════════════════════════════╣
║ 3 ║ aoi_4 ║ ... ║ POLYGON Z ((2.14860 41.39433 0.00000, 2.14884 ... ║
╠═══╬═══════╬═════╬═══════════════════════════════════════════════════╣
║ 4 ║ aoi_5 ║ ... ║ POLYGON Z ((2.14845 41.39443 0.00000, 2.14873 ... ║
╚═══╩═══════╩═════╩═══════════════════════════════════════════════════╝

Я хочу определить, какие точки l ie в каждом из полигонов, и сгенерировать новый набор данных. Я также хотел бы знать наиболее оптимальный способ сделать это, потому что у меня есть около 100 полигонов и около 100 тысяч точек для проверки в полигонах.

Используя Shapely и свойство contains, я пытаюсь сделать следующее:

inside = gdf[gdf.apply(lambda row: polys.contains(Point(row.lon, row.lat)), axis=1)] 

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

1 Ответ

0 голосов
/ 30 марта 2020

Я нашел то, что искал, и это выглядит примерно так:

points_inside = gpd.sjoin(gdf, polys[['Name', 'geometry']], op='within')
...