减少多边形中的点数

时间:2014-05-09 07:44:54

标签: .net sql-server polygon

我在sqlserver中有一个包含55k几何点的表。每个点相距5米并分配给它们的值。我的任务是在谷歌地图中绘制这些点。 我早就得出结论,谷歌地图无法处理55k点。所以我想我必须按值(10%间隔,1-9,10-19等)对点进行分组以形成多边形。但是,多边形仍然包含相同数量的点。我需要减少每个多边形中的点数。 我需要多边形来至少保持它们的形状,所以凸起的船体是不可能的。

获取凹形船体/ alpha形状将是我猜的最佳解决方案,但我无法为sqlserver 2008 r2或.NET程序集/函数找到它的实现。

获取创建多边形外线的点也是可以接受的,因此我可以将这些点传递给Google Maps并使其绘制多边形。

以下是多边形的点集合的图片:

2 个答案:

答案 0 :(得分:1)

如果您只想在地图上看到55,000个点但不关心它们是否形成多边形 - 那么您将无法用颜色填充多边形,例如,您可以使用Google Fusion Tables。

它们每层支持100,000点,全部支持5层 - 即高达500,000点。当您通过在Google服务器上运行的SQL类型语言访问它们时,它们也是闪电般快速的 - 正好是您上传数据时的数据。

您将CSV加载到Google云端硬盘中的Fusion Table中,然后获取该表的密钥,然后使用Javascript中的密钥。

我使用Fusion Tables创建了以下网站,我在Javascript中为零!请参见Skyscan网站here

enter image description here

答案 1 :(得分:0)

"每个点相距5米,并为其分配值。"

听起来很像你可以将点集视为稀疏的2D(布尔)矩阵。您可以使用它来删除形状中心的冗余点。这也可以应用于alpha形状,但只有在点紧密打包在一起时才能正常工作,就像你的例子中的情况一样,并且正如问题中的上一行所暗示的那样。

单次传递的伪代码(不确定如何以您所寻求的语言实际实现它)如下所示:

Verify that the points are lexicographically sorted
Create a list to hold the unfiltered points
Create a set of the points for the fast membership tested needed
For each point:
    If none of patterns are present:
        Add the point to the list of unfiltered points
return list of unfiltered points

模式基于3x3矩阵,表示距离中心的偏移量。所以中心是(00,00),因为它没有偏离点。 3x3中有12种主要模式需要查找。然后可以将其推广到更大的奇数大小的平方矩阵(5x5,7x7,9x9,13x13 ......)。具有偏移的3x3看起来像这样:

[[(-5,+5),(00,+5),(+5,+5)],
 [(-5,00),(00,00),(+5,00)],
 [(-5,-5),(00,-5),(+5,-5)]]

带偏移的5x5看起来像这样:

[[(-10,+10),(-05,+10),(00,+10),(+05,+10),(+10,+10)],
 [(-10,+05),(-05,+05),(00,+05),(+05,+05),(+10,+05)],
 [(-10,000),(-05,000),(00,000),(+05,000),(+10,000)],
 [(-10,-05),(-05,-05),(00,-05),(+05,-05),(+10,-05)],
 [(-10,-10),(-05,-10),(00,-10),(+05,-10),(+10,-10)]]

只使用下面12个模式中的一个将删除很多点,只留下外部和内部(如果多边形没有填充)船体。附加模式用于减少外壳/内壳中的点数。这可能足以满足您的目的。但是,每个额外的通道应仅删除大约一半的剩余点,但要查找的模式数量以O(p ^ 2)的速率增长。注意p是O(d),其中d是点集中两点之间的最大距离,在这种特殊情况下是O(N)。这应该足以允许简单的图形算法通过在凸包上拾取元素并在形状周围行走以产生凹壳来提取外凹壳。进一步的传递将进一步减少点的数量,直到某些点取决于使用哪些模式。在极端情况下,它会将其缩小为三角形。

然后要查找12种模式以确定中心点是否冗余。这是通过检查中心点是否在一条线上(对于前四条)或近似线/弧(最后一条8)来完成的。请注意,实际上挖空点集只需要其中一个。其余的只是用来进一步减少积分数。

 1. [[0,1,0], |  2. [[0,0,0], |  3. [[1,0,0], |  4. [[0,0,1],
     [0,1,0], |      [1,1,1], |      [0,1,0], |      [0,1,0],  
     [0,1,0]] |      [0,0,0]] |      [0,0,1]] |      [1,0,0]]

 5. [[1,0,0], |  6. [[0,0,1], | 7.  [[0,0,1], | 8. [[0,0,0],
     [0,1,0], |      [0,1,0], |      [1,1,0], |     [1,1,0],  
     [0,1,0]] |      [0,1,0]] |      [0,0,0]] |     [0,0,1]]  

 9. [[0,1,0], | 10. [[0,1,0], | 11. [[1,0,0], | 12. [[0,0,0],
     [0,1,0], |      [0,1,0], |      [0,1,1], |      [0,1,1],  
     [0,1,0]] |      [0,1,0]] |      [0,0,0]] |      [1,0,0]] 

图案旨在形成以中心点为考虑点的弧。上面的弧度实际上更多。为了简化操作,下面仅列出了两种更常用的模式。请注意,必须至少有一个2必须存在至少一个3必须存在。如果这样做,直到

13. [[2,2,2], | 14. [[2,0,3],
     [0,1,0], |      [2,1,3],
     [3,3,3]] |      [2,0,3]]

将13和14扩展为5x5(第二遍)会产生以下结果:

15. [[2,2,2,2,2], | 16. [[2,0,0,0,3],
     [0,0,0,0,0], |      [2,0,0,0,3],
     [0,0,1,0,0], |      [2,0,1,0,3],
     [0,0,0,0,0], |      [2,0,0,0,3],
     [3,3,3,3,3]] |      [2,0,0,0,3]]

13和14的进一步概括解决了一些偏移问题,并在5x5案例中引出了以下内容。虽然,需要注意避免重复先前通行证的工作。

15. [[2,2,2,2,2], | 16. [[2,2,0,3,3],
     [2,2,2,2,2], |      [2,2,0,3,3],
     [0,0,1,0,0], |      [2,2,1,3,3],
     [3,3,3,3,3], |      [2,2,0,3,3],
     [3,3,3,3,3]] |      [2,2,0,3,3]]

保持外壳/内壳完好无损:

上述目标是减少点数,我也在船体中包含了点数。如果希望仅移除船体之间的点,则每个模式可以检查两个以上的相邻点,如果它们不存在则仅移除该点。最极端的例子是以下3x3模式,其中中心点只有在完全被包围时才是冗余的。首先使用5x5模式而不是3x3将使外壳/内壳为3点厚,并且在任何3x3模式之后不会产生任何效果:

17. [[1,1,1],
     [1,1,1],
     [1,1,1]]
相关问题