import geopandas as gpd
def radius(points_neighbour, points_center, new_field_name, r):
"""
:param points_neighbour:
:param points_center:
:param new_field_name: new field_name attached to points_center
:param r: radius around points_center
:return:
"""
sindex = points_neighbour.sindex
pts_in_neighbour = []
for i, pt_center in points_center.iterrows():
nearest_index = list(sindex.intersection((pt_center.LATITUDE-r, pt_center.LONGITUDE-r, pt_center.LATITUDE+r, pt_center.LONGITUDE+r)))
pts_in_this_neighbour = points_neighbour[nearest_index]
pts_in_neighbour.append(len(pts_in_this_neighbour))
points_center[new_field_name] = gpd.GeoSeries(pts_in_neighbour)
每次循环都得到相同的结果。
第二个问题,如何找到第k个最近邻居?
关于问题本身的更多信息:
我们在非常小的范围内进行,例如美国华盛顿州或加拿大不列颠哥伦比亚省
我们希望尽可能利用 geopandas,因为它类似于 pandas 并支持空间索引:RTree
例如,在这里 sindex 有 nearest、intersection 等方法。
如果需要更多信息,请留言。这是 GeoPandasBase 类中的代码:
@property
def sindex(self):
if not self._sindex_generated:
self._generate_sindex()
return self._sindex
我尝试了Richard的示例,但它没有起作用。
def radius(points_neighbour, points_center, new_field_name, r):
"""
:param points_neighbour:
:param points_center:
:param new_field_name: new field_name attached to points_center
:param r: radius around points_center
:return:
"""
sindex = points_neighbour.sindex
pts_in_neighbour = []
for i, pt_center in points_center.iterrows():
pts_in_this_neighbour = 0
for n in sindex.intersection(((pt_center.LATITUDE-r, pt_center.LONGITUDE-r, pt_center.LATITUDE+r, pt_center.LONGITUDE+r))):
dist = pt_center.distance(points_neighbour['geometry'][n])
if dist < radius:
pts_in_this_neighbour = pts_in_this_neighbour + 1
pts_in_neighbour.append(pts_in_this_neighbour)
points_center[new_field_name] = gpd.GeoSeries(pts_in_neighbour)
要下载形状文件,请前往https://catalogue.data.gov.bc.ca/dataset/hellobc-activities-and-attractions-listing,并选择ArcView进行下载。