使用关系dbms实现Spatial db

时间:2013-06-13 10:32:59

标签: mysql spatial database

首先发布在这里..

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

我必须这样做才能为我的大学练习。

建议的分析是:

积分 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 =>序列,但是如果我存储一系列段,我怎么能用查询检索这段?

提前谢谢

1 个答案:

答案 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

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