【问题标题】:implementation of Spatial db with a relational dbms使用关系 dbms 实现空间数据库
【发布时间】:2013-06-13 19:15:59
【问题描述】:

第一次发帖。

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

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

建议的分析是:

Point_ID、X、Y)

SegmentSegment_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`);

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

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

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

提前谢谢

【问题讨论】:

  • 这取决于您要对数据执行什么操作...有效地搜索空间数据需要适合该目的的结构,例如 R-Trees; MySQL 提供基于此类数据结构的索引,但前提是使用其空间扩展(您显然已排除)。
  • @eggyal 我不在乎效率。我将运行一些困难的查询,例如find the Euclidean distance between a point and a polyline 我不是在寻找最佳解决方案,我只是在寻找一个简单的解决方案

标签: mysql spatial database


【解决方案1】:

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

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

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

此外,point-along-polyline 实体需要有一个序数属性才能让您正确排序。

在 MySQL 术语中,您需要两个表:

Polyline:polylineID、名称、其他属性 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

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

【讨论】:

    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多