首先发布在这里..
我想实现一些基本的空间表,不使用内置类型(例如几何,点,线串)
我必须这样做才能为我的大学练习。
建议的分析是:
积分( Point_ID ,X,Y)
细分( Segment_ID ,From_Point,To_Point)
折线( Polyline_ID ,Segment_ID,Line_Seq_No)
区域( Region_ID ,Polyline_ID,Region_Seq_No)
使用上面的i制作以下表格(在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 =>序列,但是如果我存储一系列段,我怎么能用查询检索这段?
提前谢谢
答案 0 :(得分:0)
请允许我在这个答案中使用实体关系术语。
您需要两个实体来存储折线。第一个是折线实体,第二个是折线点实体。有一个 - >折线之间的许多关系 - >点沿折线。换句话说,将折线视为平面中点的有序序列是有帮助的,在这些点之间应绘制线。
出于某种原因,您提出了折线 - >段作为你的一个 - >很多关系。这不是编码效率的理想选择,因为每个段的端点需要与下一个段的起点相同。
此外,折线点实体需要具有序数属性才能正确排序。
在MySQL术语中,你需要两个表:
折线:折线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
多边形是一种折线,隐含地具有从其最后一个点到第一个点的线段。您似乎将区域定义为一组多边形。这是对的吗?