我将大约 1000 条路径从某处导入我的 postgis 数据库到线串字段。
(编辑)我的桌子是这样的
+---------+---------------+------------------+
| id(int) | name(varchar) | path(LINESTRING) |
+---------+---------------+------------------+
| 123 | foo | 000002... |
| 124 | bar | 000002... |
我遇到的问题是每条路径都被分成块,并且在某些情况下这些块被混淆了。
假设线串在点号 50 和 70 处被分割:
- 块 A:点 1-50
- 块 B:点 51-70
- 块 C:点 71-100
当我将它迁移到我的数据库中时,它们混合在一起,所以结果线串可能会像这样结束:
- 块 A:点 1-50
- 块 C:点 71-100
- 块 B:点 51-70
所以这会产生从 50 到 71 的跳跃和另一个从 100 到 51 的跳跃
(编辑)当我导入这些分成块的路径时,我认为它们是有序的,但事实是有些是混合的,这使得我的一些线串与它们的点一样排列,就像第二个例子一样。
我希望能够重新排序这些块(点),所以我想构建一个 SQL 查询来检测哪些路径有混合点,然后我可以手动(使用使用 openlayers 制作的工具)重新排列它们。
最好有一个 SQL 更新查询来解决这个问题,但我认为检测更容易(我认为有大约 5% 或更少的路径有错误)
EDIT3:我认为检测脚本可以检查路径是否包含一对太远的连续点。也许从包含最长段的路径排序路径的 SQL 会很好。
如何创建一个函数来获取线串中最大段的长度?
这里我展示一个例子:这就是它在数据库中的样子
这就是我希望它被修复的方式
EDIT4:就像我在 EDIT3 上计划的那样,可以编写一个函数来查找线串中两个连续点之间的最长距离,使用ST_NPoints()和ST_PointN()遍历线串的点,然后可以进行查询以订购路径与那最长的距离。这个距离太长的线串很可能会出现所描述的问题。这样我就可以检测到它们,并手动修复它们。
检测 SQL 的结果将是这样的:
|ordered by this|
+---------+---------------+------------------+---------------+
| id(int) | name(varchar) | path(LINESTRING) | msbtcp(int) |
+---------+---------------+------------------+---------------+
| 123 | foo | 000002... | 1000 |
| 124 | bar | 000002... | 800 |
*msbtcp 将是函数的结果:max_separation_between_two_consecutive_points(path)