gpt4 book ai didi

mysql - 使用关系数据库管理系统实现空间数据库

转载 作者:行者123 更新时间:2023-11-30 01:34:31 25 4
gpt4 key购买 nike

这里是第一篇文章..

我想实现一些基本的空间表,不使用内置类型(例如几何,点,线串)

我必须这样做才能为我的大学实现一项练习。

建议的分析是:

积分(Point_ID、X、Y)

分段(Segment_ID、From_Point、To_Point)

折线(Polyline_ID、Segment_ID、Line_Seq_No)

区域(Region_ID、Polyline_ID、Region_Seq_No)

使用上面的内容我制作了下表(在 mysql 中)

CREATE TABLE IF NOT EXISTS `points` (
`point_id` int(11) NOT NULL AUTO_INCREMENT,
`x` int(11) NOT NULL,
`y` int(11) NOT NULL,
PRIMARY KEY (`point_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `polylines` (
`polyline_id` int(11) NOT NULL AUTO_INCREMENT,
`segment_id` int(11) NOT NULL,
`line_seq_no` int(11) NOT NULL,
PRIMARY KEY (`polyline_id`),
KEY `segment_id` (`segment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `regions` (
`region_id` int(11) NOT NULL AUTO_INCREMENT,
`polyline_id` int(11) NOT NULL,
`region_seq_no` int(11) NOT NULL,
PRIMARY KEY (`region_id`),
KEY `polyline_id` (`polyline_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `segments` (
`segment_id` int(11) NOT NULL AUTO_INCREMENT,
`from_point` int(11) NOT NULL,
`to_point` int(11) NOT NULL,
PRIMARY KEY (`segment_id`),
KEY `from_point` (`from_point`),
KEY `to_point` (`to_point`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


ALTER TABLE `polylines`
ADD CONSTRAINT `polylines_ibfk_1` FOREIGN KEY (`segment_id`) REFERENCES `segments` (`segment_id`);

ALTER TABLE `regions`
ADD CONSTRAINT `regions_ibfk_1` FOREIGN KEY (`polyline_id`) REFERENCES `polylines` (`polyline_id`);

ALTER TABLE `segments`
ADD CONSTRAINT `segments_ibfk_2` FOREIGN KEY (`to_point`) REFERENCES `points` (`point_id`),
ADD CONSTRAINT `segments_ibfk_1` FOREIGN KEY (`from_point`) REFERENCES `points` (`point_id`);

我不知道上面的实现方法是否正确..

我了解如何将数据存储到表中。

但我不知道如何存储折线或区域。例如,在 line_seq_no 中我必须存储什么? seq=>sequence,但是如果我存储一个段序列,如何通过查询检索这些段?

提前致谢

最佳答案

请允许我在这个答案中使用实体关系术语。

您需要两个实体来存储折线。第一个是折线实体,第二个是沿折线的点实体。折线 --> 沿折线的点之间存在一 --> 多关系。换句话说,将多段线视为平面中点的有序序列是有帮助的,应在这些点之间绘制线。

出于某种原因,您建议折线 --> 线段作为您的一 --> 多关系。对于编码效率而言,这不是一个理想的选择,因为每个段的端点需要与下一个段的起点相同。

此外,沿折线的点实体需要具有序数属性,以便您可以正确地对它们进行排序。

用 MySQL 术语来说,您需要两个表:

Polyline:折线ID、名称、其他属性PointAlongPolyline:pointID(升序)、polylineID、x、y、其他属性

要获取特定折线中的点序列,您可以使用以下查询:

 SELECT x,y
FROM Polyline
JOIN PointAlongPolyLine ON Polyline.polylineID = PointAlongPolyline.polylineID
WHERE Polyline.name = 'name you hope to retrieve'
ORDER BY PointAlongPolyline.pointID

多边形是一种折线,隐式地具有从最后一个点到第一个点的线段。您似乎将一个区域定义为一组多边形。这是正确的吗?

关于mysql - 使用关系数据库管理系统实现空间数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17084876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com