首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >KD/Qtree实现

KD/Qtree实现
EN

Stack Overflow用户
提问于 2017-05-24 09:45:18
回答 2查看 366关注 0票数 1

我有一个如下的路径数据:

代码语言:javascript
运行
复制
    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作为“项目”。然后如何为这些轨迹提供不同的边界框。另外,我将如何知道或查询树以查找哪些轨迹位于四元树的哪个区域。

EN

回答 2

Stack Overflow用户

发布于 2017-05-24 16:15:42

因此,您希望查询每个轨迹的位置,这意味着您需要计算并插入每个轨迹的bbox。通常,这种类型的数据对于每个轨迹都有一行,其中有一个几何字段来描述xy坐标序列。但是,由于您的坐标向下移动,我们必须先对属于每个轨迹id的所有xy点进行分组,然后再计算bbox。

下面是未经测试的索引示例代码(我的pandas非常生疏,所以可以在其中检查一些错误):

代码语言:javascript
运行
复制
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轨迹。

代码语言:javascript
运行
复制
for clusterbbox in clusters:
    voygids = spindex.intersects(clusterbbox)

请注意,一个项目可以跨越并位于多个四边形中,因此您可能需要,也可能不需要在之后进行额外的充实。

票数 2
EN

Stack Overflow用户

发布于 2017-05-24 10:19:20

要将轨迹转换为每个voygid的项目列表,我们可以使用pandas.groupby

代码:

代码语言:javascript
运行
复制
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()的列表。

测试代码:

代码语言:javascript
运行
复制
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))

结果:

代码语言:javascript
运行
复制
   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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44147628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档