【发布时间】:2012-04-24 22:52:42
【问题描述】:
我将大约 1000 条路径从某处导入我的 postgis 数据库到线串字段。
(EDIT) 我的桌子是这样的
+---------+---------------+------------------+
| 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 的跳跃
(EDIT) 当我导入这些分成块的路径时,我认为它们是有序的,但事实是有些是混合的,这使得我的一些线串与它们的点是有序的像第二个例子。
我希望能够重新排序这些(点)块,因此我想构建一个 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)
【问题讨论】:
标签: sql postgresql postgis multilinestring