代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

在数据库中集群lat/long

  •  12
  • Pure.Krome  · 技术社区  · 16 年前

    我正在尝试查看是否有人知道如何使用数据库集群一些lat/long结果,以减少通过连接发送到应用程序的结果数。

    在客户机端或服务器(应用程序)端,有许多关于如何集群的资源。但不在数据库端:(

    This is a similar question 一位S.O.成员的同事问。这些解决方案是基于服务器端的(即代码隐藏)。

    除了数据库之外,有人在解决这个问题上有什么运气或经验吗?有没有数据库专家在经历一场风风雨雨和性感的数据库挑战?

    请帮助:

    编辑1:澄清-通过聚类,我希望分组 x 一个区域中单个点的点数。所以,如果我说把所有的东西都聚集在1英里/1公里的平方里,那么这个平方里的所有结果都会组合成一个单一的结果(比如……广场中央)。

    编辑2:我使用的是MS SQL 2008,但如果其他数据库中有其他解决方案,我愿意听取。

    6 回复  |  直到 10 年前
        1
  •  12
  •   Drew Hall    16 年前

    我可能会使用 k -means clustering 使用点的笛卡尔坐标(例如wgs-84 ecf)。很容易实现并快速收敛,并且无论数据是什么样子,都能适应您的数据。另外,你可以选择 K 为了满足您的带宽需求,每个集群将具有相同数量的关联点(mod k)。

    我将创建一个集群形心表,并在原始数据表中添加一个字段,以指示它属于哪个集群。如果您的数据是动态的,那么您显然希望定期更新集群。我不知道您是否可以使用存储过程和触发器来实现这一点,但也许可以。

    *“修正”是调整计算出的质心向量的长度,使它们位于地球表面。否则你会得到一堆负高度的点(当转换回llh时)。

        2
  •  5
  •   paxdiablo    16 年前

    如果您是在地理位置上集群的,而我不能想象它是其他任何东西:—,那么您可以将“集群ID”和lat/long坐标一起存储在数据库中。

    我的意思是把世界地图分成(例如)一个100x100矩阵(10000个集群),每个坐标被分配到其中一个集群。

    然后,您可以通过选择同一个正方形中的坐标和通过选择相邻正方形中的坐标来检测非常接近的坐标。

    你的方块的大小(以及它们的数量)将由你需要聚类的精确程度决定。显然,如果你只有一个2x2矩阵,你可以得到一些相距很远的坐标的聚类。

    yo总是有边缘情况,例如两个点靠得很近,但在不同的簇中(簇中最北的一个,簇中最南端的另一个),但可以调整簇的大小。 在客户端对结果进行后处理。

        3
  •  4
  •   Dustin    16 年前

    我为一个地理应用程序做了类似的事情,我想确保可以轻松缓存点集。我的地理散列代码如下:

    def compute_chunk(latitude, longitude)
      (floor_lon(longitude) * 0x1000) | floor_lat(latitude)
    end
    
    def floor_lon(longitude)
      ((longitude + 180) * 10).to_i
    end
    
    def floor_lat(latitude)
      ((latitude + 90) * 10).to_i
    end
    

    一切都很顺利。我有一些代码可以从一个给定的点抓取所有的块到一个给定的半径,这个半径可以转换成一个单独的memcache multiget(还有一些代码可以在它丢失时对其进行回填)。

        4
  •  2
  •   Brian C. Lane    16 年前

    为了 movielandmarks.com 我使用了来自 Mike Purvis ,的作者之一 Beginning Google Maps Applications with PHP and AJAX . 它使用php和mysql为不同的缩放级别构建集群/点树,并将其存储在数据库中,以便快速调用。即使您使用的是不同的数据库,其中一些可能对您有用。

        5
  •  1
  •   lmsasu    15 年前

    为什么不测试多种方法呢?

    1. 翻译 weka 带有的.NET CLI中的库 IKVM.NET
    2. 将代码和weka.dll(使用ilmerge)生成的程序集添加到数据库中

    做一些测试。没有任何一种特定的集群比其他任何一种集群更有效。

        6
  •  0
  •   Yuval F    16 年前

    我相信你可以用 MSSQL's spatial data types . 如果它们与我所知道的其他空间数据类型类似,它们会将您的点存储在一个矩形树中,然后您可以转到低分辨率的矩形以获得隐式簇。