我有一个如下的路径数据:
id1 p1 p2
0 1 7.935 5.103
1 1 7.934 5.112
2 1 7.936 5.102
3 1 7.938 5.145
4 2 7.930 5.191
5 2 7.945 5.161
6 2 7.954 5.127我正在尝试实现四叉树来分析这些轨迹。为了实现四叉树,我尝试使用"pyqtree“https://github.com/karimbahgat/Pyqtree python包。
在代码"len(spindex)“中,”len(Spindex)“是项目的总数,而边界框"bbox”的格式是(xmin,ymin,xmax,ymax),"testitem“是交叉点边界框,而len(matches)将给出交叉点中的节点数。
我正在尝试使用上面的df来实现四叉树。请让我知道如何在代码中使用上述df作为“项目”。然后如何为这些轨迹提供不同的边界框。另外,我将如何知道或查询树以查找哪些轨迹位于四元树的哪个区域。
发布于 2017-05-24 16:15:42
因此,您希望查询每个轨迹的位置,这意味着您需要计算并插入每个轨迹的bbox。通常,这种类型的数据对于每个轨迹都有一行,其中有一个几何字段来描述xy坐标序列。但是,由于您的坐标向下移动,我们必须先对属于每个轨迹id的所有xy点进行分组,然后再计算bbox。
下面是未经测试的索引示例代码(我的pandas非常生疏,所以可以在其中检查一些错误):
for group in df.groupby('voygid'):
bbox = [ group['x'].min(), group['y'].min(), group['x'].max(), group['y'].max() ]
spindex.insert(group['voygid'][0], bbox)不太确定您计划如何集群,这将是一个单独的问题。四元树的主要目的不是询问项目位于哪个四元组中,而是询问哪些项目与任意bbox区域相交。
因此,如果您将坐标区域划分为单独的集群区域,则可以查询每个区域中的voygid轨迹。
for clusterbbox in clusters:
voygids = spindex.intersects(clusterbbox)请注意,一个项目可以跨越并位于多个四边形中,因此您可能需要,也可能不需要在之后进行额外的充实。
发布于 2017-05-24 10:19:20
要将轨迹转换为每个voygid的项目列表,我们可以使用pandas.groupby
代码:
def get_items(group):
return [Item(row[1].x, row[1].y) for row in group.iterrows()]
voygids = dict(df.groupby('voygid').apply(get_items))How?
groupby将收集与特定voygid相关联的行。然后,我们可以使用pandas.DataFrame.apply()调用一个函数,该函数将返回组中x, y对的项目列表。该函数使用列表理解来构造Items()的列表。
测试代码:
df = pd.read_fwf(StringIO(u"""
voygid x y
1 -7.935513 5.103579
1 -7.935781 5.103300
1 -7.936354 5.102726
1 -7.935915 5.102802
2 -7.935306 5.103424
2 -7.945678 5.119876
2 -7.954764 5.128738"""), header=1)
print(df)
class Item:
def __init__(self, x, y):
left = x-1
right = x+1
top = y-1
bottom = y+1
self.bbox = [left, top, right, bottom]
def __repr__(self):
return '[%s]' % ' '.join('%.4f' % x for x in self.bbox)
def get_items(group):
return [Item(row[1].x, row[1].y) for row in group.iterrows()]
voygids = dict(df.groupby('voygid').apply(get_items))
for voygid, items in voygids.items():
print(voygid)
for item in items:
print(' ' + repr(item))结果:
voygid x y
0 1 -7.935513 5.103579
1 1 -7.935781 5.103300
2 1 -7.936354 5.102726
3 1 -7.935915 5.102802
4 2 -7.935306 5.103424
5 2 -7.945678 5.119876
6 2 -7.954764 5.128738
1
[-8.9355 4.1036 -6.9355 6.1036]
[-8.9358 4.1033 -6.9358 6.1033]
[-8.9364 4.1027 -6.9364 6.1027]
[-8.9359 4.1028 -6.9359 6.1028]
2
[-8.9353 4.1034 -6.9353 6.1034]
[-8.9457 4.1199 -6.9457 6.1199]
[-8.9548 4.1287 -6.9548 6.1287]https://stackoverflow.com/questions/44147628
复制相似问题