QGIS中的最近邻居分组选择


14

我有一个包含以纬度/经度格式超过100,000点的列表,我已经将其导入到qgis中。

现在,我要在此处进行的操作是将所有这些点分组为框组,这实际上是指我想将地图拆分为边界框。

我的要求如下:

  • 盒装组的得分不得低于100,且得分不得超过200
  • 不得将一个点放置在多个组中
  • 所有点应基于其最近的邻居

我如何通过q​​gis实现这一目标?

我假设可以传递一些自定义查询代码并保存结果,或者将创建的框保存为shapefile正确吗?有人可以解释一下如何做到这一点以及代码是什么样的吗?

如前所述,我的目标是将一堆方形框显示为shapefile图层,其中每个框内的属性不少于100个且不超过200个。


6
对于将这个问题标记为“最喜欢的”的每个人:为什么也不要反对它呢?有人会认为您最喜欢的问题应该是一个好问题。
黑暗

1
为什么需要拳击?如果您基于计数创建盒子,那么它们的大小将有所不同,因此平铺是不可能的。分组为多边形(即凸包)可能更容易。
diciu 2011年

@diciu感谢您的回复。是的,我认为凸包会很好,因为以后我可以将它们变成盒子。使用凸包方法必须使用什么代码?
NetConstructor.com 2011年

2
如果确实使用凸包,则包围盒(包围外壳)将重叠,并且不再满足将点放在单个BBOX中的要求。凸包不是向BBOX过渡的中间步骤,而是替代品。即使那样,创建一个通用解决方案也将相当复杂。
diciu 2011年

Answers:


13

我可以通过假设您已经弄清楚如何请求(a)一组积分的最东半部和(b)一组积分的最北半部,来帮助您解决问题。当然,您可以轻松地从中获得(c)最西端的一半或(d)最南端的一半。(我不知道QGIS,但通常(a)的一种方法是请求中值x坐标,然后获取x坐标超过该值的所有点。(b)-(d)的解决方案相似)

使用此功能,可以轻松递归地获得解决方案。为了描述它,让我们假设有一个过程Half,实现了前面的操作,它带有两个参数:第一个是一组点,第二个是等于需要true东西分割的代码,false否则等于。它返回输入的两个子集,并根据请求对其进行分区。

Procedure Box(P: set of points, i: boolean, n: integer)
Begin
    If (Count(P) > 2*n) then
        {R,S} = Half(P,i)
        Q = Box(R,!i,n) + Box(S,!i,n)
    Else
        Q = {P}
    Endif
    Return Q
End

在此伪代码中,R和S分区P;Box(R,!i,n)是R在正交方向上的分区,Box(S,!i,n)是S在正交方向上的分区,“ +”表示形成集合论联合,并且{}指定一个集合。(交替分割方向将创建框而不是条。)参数n指定分区中组的最小大小;最大大小为2 n

例

作为示例,这里是一个12 891个随机点的集合P,按Box(P,true,100)大小分为100和200之间的组。该算法创建128个盒子,其中37个盒子有100个点,而91个盒子有101个点。


2
该算法是有效的。在单个内核上运行,它在18秒内处理了十倍的点数(128,910)。对于n点,它缩放为O(n log(n)log(n))。(可以改善除去log(n)的那些因素之一,但是努力不值得。)
whuber

1
@W您是否使用词典顺序排序来简化点坐标的划分?

2
@whuber,这太棒了
dassouki

1
@Dan进行词汇排序会有所帮助,但不是必需的。请注意,可以在O(n)时间中找到n个值的中位数(而不是O(n log(n))时间),因此将点划分为东西半部或南北半部渐近地为O(n )计算。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.