检查点是否在多边形内部
Checking if points are inside of polygons
我有两个 geoJSON 格式的数据集。使用 geoPandas,一方面我有一个数据集,其中包含某个城市中各个点的坐标。
Table 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) ║
╚═══╩════════╩══════════╩══════════════════════╩═════════╩══════════╩══════════════════════════╝
另一方面,我有另一个数据集,其中不同区域的多边形位于同一个城市。
Table 多边形:
╔═══╦═══════╦═════╦═══════════════════════════════════════════════════╗
║ ║ 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 ... ║
╚═══╩═══════╩═════╩═══════════════════════════════════════════════════╝
我想做的是确定每个多边形内的点并生成新的数据集。我还想知道最佳方法,因为我有大约 100 个多边形和大约 100K 点要在多边形中进行验证。
使用Shapely
和属性 contains
,我想做的是以下内容::
inside = gdf[gdf.apply(lambda row: polys.contains(Point(row.lon, row.lat)), axis=1)]
问题是我不想只获取 单个多边形 内的点(上面的代码确实如此),而是 所有点 并知道 它们位于什么多边形 中。
我找到了我要找的东西,结果是这样的:
points_inside = gpd.sjoin(gdf, polys[['Name', 'geometry']], op='within')
我有两个 geoJSON 格式的数据集。使用 geoPandas,一方面我有一个数据集,其中包含某个城市中各个点的坐标。
Table 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) ║
╚═══╩════════╩══════════╩══════════════════════╩═════════╩══════════╩══════════════════════════╝
另一方面,我有另一个数据集,其中不同区域的多边形位于同一个城市。
Table 多边形:
╔═══╦═══════╦═════╦═══════════════════════════════════════════════════╗
║ ║ 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 ... ║
╚═══╩═══════╩═════╩═══════════════════════════════════════════════════╝
我想做的是确定每个多边形内的点并生成新的数据集。我还想知道最佳方法,因为我有大约 100 个多边形和大约 100K 点要在多边形中进行验证。
使用Shapely
和属性 contains
,我想做的是以下内容::
inside = gdf[gdf.apply(lambda row: polys.contains(Point(row.lon, row.lat)), axis=1)]
问题是我不想只获取 单个多边形 内的点(上面的代码确实如此),而是 所有点 并知道 它们位于什么多边形 中。
我找到了我要找的东西,结果是这样的:
points_inside = gpd.sjoin(gdf, polys[['Name', 'geometry']], op='within')