好的,我需要将数据存储在折线的某些点上,而不是其他点上。
我目前的做法是我有 3 张桌子
line:
lineID INT AUTO INCREMENT
lineType INT
forkFrom INT
linePoint:
pointID INT AUTO INCREMENT
lineID INT
lat DECIMAL
lng DECIMAL
pointMarker:
pointID INT
someDataFields...
但是一条线,假设它有 20 个点,将占用表格中的 20 行。
我想要一个带有线串字段的线表,从而不需要 linePoints 表。但是我没有办法引用一行中的特定点。
示例:这条线是一条水管,它有很多点,因为它绕过拐角,因此,在其中一些点上,它有一个水龙头或一个水表,我该如何记录呢?
我是否使用纬度/经度作为索引,然后在我的代码中以某种方式检查孤立点(如果线被修改)?还是有更好的方法来做到这一点?
还有一些行是主行的“分叉”或“分支”,为此我目前正在使用“forkFrom”列来存储“分叉”起始点的 ID。我将如何使用 lineString 执行此操作?这就是 multiLineString 的用途吗?
我在处理行的前端代码上遇到了一些问题,所以现在是更改数据存储方式的好时机,因为我可能不得不重新编写大量代码来处理它。还不如多写几行,把数据库方面的事情也整理一下,而不是修复现在坏掉的东西,然后在我最终更改数据库时把所有东西都扔到窗外。
地理信息系统
使用 GIS 并停止做所有这些疯狂的事情。
MySQL 提供
LineString(pt1, pt2)
ST_LineStringFromText(wkt)
(类型安全)ST_GeomFromText(wkt)
它们易于使用,任何程序都可以输出 Well-known 文本或 Well-known 二进制文件来创建行。它们也是可索引的,更紧凑,并使用 SRID 存储。
一个 multiLineString 可以容纳叉子,是的。或者,您可以只使用表中的另一个线串条目来完成。这仅取决于您想做什么。当你查询它时,你想知道返回了什么“fork”(表中的单独条目使这更容易和更快),或者你是否只关心某处的管道而不考虑返回的 fork。
如果您要使用 GIS,也必须声明,在某些时候您可能需要 PostGIS 。
你绝对需要这些点来建立这条线吗?这些点是从现场的 GPS 记录的吗?
最终,您似乎对线条而不是点感兴趣(除了其中一些具有有用和补充信息的点)。因此人们可以在 QGIS(FOSS)这样的程序中构建他们的线,然后将其推送到线表。可以将有用的点(如水表)推送到点表。
那么您要么有一个简单的关系约束,要么有一个类似于 ST_Overlaps 的空间关系。两个表中的基准和投影必须相同。