设置
我有一张包含字符串的表。线串由多个地理点组成。每个点都由经纬度组成。注意:linestring值作为文本存储在数据库中。
所以表中的一行可能如下所示:
id:整数
线串:x1,y2,x2,y2,x3,y3,x4,y4
问题
谷歌地图一次最多只能显示1000个元素。在我的例子中,我要显示850个线串,将来还需要添加更多。
问题
相当多的线串与一个或多个其他线串连接,这意味着它们以相同的坐标开始和/或结束。我要做的是找到优化数据集的最佳方法,以便将两端连接的linestring合并到db表中。当我解析db表并为google maps创建显示文件时,这将减少元素总数。
例子
在这个例子中,假设alpha(a,b,c)值表示地理点。未优化的表可能如下所示:
优化前:
ID线字符串
1甲、乙、丙
2立方厘米
3乙,甲
4层,G层,H层
5克,我
6小时,J
优化后:
1甲、乙、丙、丁
2个F,G,H,J
3克,我
那么,优化数据的最佳方法是什么?有什么特别的算法最有效吗?我有一些解决方案的想法,我会制定和补充,但它们似乎冗长和令人信服。
我不是主修计算机科学的学生,所以请原谅这些草率的术语,如果有任何地方需要澄清,请告诉我。谢谢!
仅供参考..我使用的是mysql数据库。我没有使用空间扩展。如果你有一个使用空间扩展的令人尴尬的简单解决方案,我无论如何都想听一听。

最佳答案

需要认识到的一点是,如果有多个线串可以连接到给定的线串,那么选择哪一个并不重要--优化表中的最终线串数将相同。
因此,在这种情况下,一个简单的贪婪策略,反复寻找一对可以连接的字符串,并将它们连接起来,直到您再也找不到这样的一对字符串,将为您提供一个最佳表。实际上,伪代码是:

while (there exists a pair of linestrings x and y that share an endpoint) {
    delete(x)
    delete(y)
    insert(x . y)
}

这不能在单个sql查询中完成,因为可能会再次使用生成的linestringx . y。您应该能够使用过程语言(如t-sql)或脚本语言(如perl,使用dbi进行数据库访问)编写while循环,并使用sql select查询查找一对或一组对,然后使用delete和insert语句处理每一对。
我建议在表中添加两个字段,beginend,并对它们进行索引以加快搜索速度。

关于database - 优化包含线串的数据集的最佳方法。有些行在相同的坐标处开始和结束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/462640/

10-13 01:16