查看点(经度和纬度)是否位于多边形内的最佳实践是什么?我有一个带有列-ID,纬度,经度的pyspark数据框。
df_event = sc.parallelize([
['a',33.765557,-84.369011],
['b',33.765526, -84.368416],
['c',33.766233, -84.364824]
]).toDF(('id', 'latitude','longitude'))
下面是多边形
v0 = [33.765499, -84.368708]
v1 = [33.765489, -84.368043]
v2 = [33.764821, -84.368053]
v3 = [33.764816, -84.368729]
lats_vect = np.array([v0[0],v1[0],v2[0],v3[0]])
lons_vect = np.array([v0[1],v1[1],v2[1],v3[1]])
lons_lats_vect = np.column_stack((lons_vect, lats_vect))
polygon = Polygon(lons_lats_vect)
有没有办法使用它来查看pyspark数据框的经度和纬度位于此多边形内。我可以匀称使用吗?我在下面有一个函数,但会引发错误ImportError:没有名为shapely.geometry.point
的模块def isInBoundingBox(x,y,Polygon):
try:
x = float(x); y = float(y); OK = 1
except ValueError:
OK = 0
if OK == 1:
point = Point(float(x), float(y));
return Polygon.contains(point)
我可以使用以下代码将pyspark数据框转换为pandas数据框,并且可以正常工作,但是对于庞大的数据集而言,这将非常缓慢。我想坚持使用pyspark数据框,而不要将其转换为熊猫。
df_events_pandas = df_event.toPandas()
df_events_pandas["geometry"] = df_events_pandas.apply(lambda row:
Point(row["_longitude"], row["_latitude"]), axis=1)
df_events_pandas["polygon"] = polygon
df_events_pandas["inPolygon"] = df_events_pandas.apply(lambda row:
(row["geometry"].within(row["polygon"])), axis = 1)