0

初投稿はこちら..

組み込み型 (ジオメトリ、ポイント、ラインストリングなど) を使用せずに、いくつかの基本的な空間テーブルを実装したい

大学の演習を実装するには、これを行う必要があります。

提案された分析は次のとおりです。

ポイント( 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 ですが、セグメントのシーケンスを格納する場合、クエリでこのセグメントを取得するにはどうすればよいですか?

事前にThx

4

1 に答える 1

0

この回答でエンティティ関係の専門用語を使用することを許可してください。

ポリラインを保存するには、2 つのエンティティが必要です。1 つ目はポリライン エンティティで、2 つ目は点に沿ったポリライン エンティティです。ポリライン -> ポイントに沿ったポリラインの間には、1 つ --> 複数の関係があります。言い換えると、ポリラインを平面内の順序付けられた点のシーケンスと考えると便利です。その間に線を描画する必要があります。

何らかの理由で、ポリライン --> セグメントを 1 つ --> 多数の関係として提案しました。各セグメントのエンドポイントは次のセグメントの開始ポイントと同じである必要があるため、これはコーディング効率にとって理想的な選択ではありません。

さらに、ポイントに沿ったポリライン エンティティには、正しく順序付けできるように序数属性が必要です。

MySQL 用語では、これには 2 つのテーブルが必要です。

ポリライン: polylineID、名前、その他の属性 PointAlongPolyline: ポイント ID (昇順)、ポリライン ID、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-06-13T11:15:59.200 に答える