与FDO相同,MapGuide支持11种几何图形类型,这11种几何图形类型可以分为简单类型和聚合类型,聚合类型的几何图形由简单类型的几何图形所组成。类MgGeometryType定义了这11种几何图形类型,表8-1列出了这11种几何图形类型以及它们在MapGuide中所对应的类。
| 几何图形类型 | 几何类 |
简单类型 | MgGeometryType::Point | MgPoint |
MgGeometryType::LineString | MgLineString | |
MgGeometryType::CurveString | MgCurveString | |
MgGeometryType::Polygon | MgPolygon | |
MgGeometryType::CurvePolygon | MgCurvePolygon | |
聚合类型 | MgGeometryType::MultiPoint | MgMultiPoint |
MgGeometryType::MultiLineString | MgMultiLineString | |
MgGeometryType::MultiPolygon | MgMultiPolygon | |
MgGeometryType::MultiGeometry | MgMultiGeometry | |
MgGeometryType::MultiCurveString | MgMultiCurveString | |
MgGeometryType::MultiCurvePolygon | MgMultiCurvePolygon |
表8-1 MapGuide支持的几何图形类型
除了Point之外,简单类型的几何图形也是由一些组件所组成的,例如线段、圆环、环,类MgGeometryComponentType定义了MapGuide支持的所有组件,表8-2列出了这些组件类型以及它们在MapGuide中所对应的类。
几何图形组件类型 | 组件类 |
MgGeometryComponentType::ArcSegment | MgArcSegment |
MgGeometryComponentType::CurveRing | MgCurveRing |
MgGeometryComponentType::LinearRing | MgLinearRing |
MgGeometryComponentType::LinearSegment | MgLinearSegment |
表8-2 MapGuide支持的几何图形组件类型
1) Point
Point是一个0维的几何图形,用于表示一个单独的坐标位置,如下的代码展示了如何创建一个Point几何图形。
$geometryFactory = new MgGeometryFactory(); // 创建一个坐标 $oordinate = $geometryFactory->CreateCoordinateXY(0,2); // 创建一个Point $point = $geometryFactory->CreatePoint($coordinate); // 得到Point的AGF文本 $pointAgfText = $wktReaderWriter->Write($point); |
2) Curve和CurveSegment
Curve是一个1维几何图形,用于存储一系列有序的Point,它由一系列CurveSegment所组成,如果Curve的起始点和结束点是同一个点,那么它是闭合的,否则此Curve是开放的。CurveSegment是一个抽象几何图形组件类型,它有两种子类型:直线段LinearSegment和圆弧段ArcSegment。Curve也是一个抽象几何图形类型,它有两个具体子类型LineString和CurveString,LineString的每个CurveSegment都是直线段LinearSegment,CurveString的每个CurveSegment段既可以是直线段LinearSegment,也可以是圆弧段ArcSegment。
3) LineString
LineString是Curve的子类型,它由若干个有序的直线段LinearSegment所组成,如下的代码创建了由一个直线段组成的LineString,图8-2显示了一些LineString几何图形。
|
4) CurveString
CurveString 是Curve的子类型,它由若干个有序的直线段LinearSegment和圆弧段ArcSegment所组成,如下的代码创建了一个由一个圆弧段和一个直线段组成的CurveString。
|
5) Region和Ring
MgRegion是一个2维的几何图形,在OGC简单几何规范文档中称之为Surface,它一个外部边界和0或多个内部边界组成,这些边界都是Ring类型。Ring是一个抽象几何图形组件类型,它有两个具体子类型直线环LinearRing和曲线环CurveRing,LinearRing由若干个有序的LinearSegment组成,CurveRing由若干个有序的LinearSegment组成。Region也是一个抽象几何图形类型,它有两个具体子类型Polygon和CurvePolygon,Polygon的边界都为直线环LinearRing,CurvePolygon的边界为曲线环MgCurveRing。
6) Polygon
Polygon是Region的子类型,它的外部边界和内部边界都为直线环LinearRing。Polygon的内部边界可以和外部边界接触,但是必须是相切,并且只能有一个内部边界和外部边界相切。图8-3显示了一些Polygon几何图形,图8-4展示了一些无法使用单个Polygon表示的几何图形。如下的代码创建了一个Polygon,它由一个正方形的外部边界和一个正方形的内部边界组成。
$geometryFactory = new MgGeometryFactory(); $coordinateCollection = new MgCoordinateCollection(); $interiorRingCollection = new MgLinearRingCollection(); $wktReaderWriter = new MgWktReaderWriter();
// 注意:外部边界的坐标值需要以逆时针的顺序加入 // 创建外部边界的第一个坐标值 $coordinate = $geometryFactory->CreateCoordinateXY(0,0); $index = $coordinateCollection->Add($coordinate);
// 创建外部边界的第二个坐标值 $coordinate = $geometryFactory->CreateCoordinateXY(3,0); $index = $coordinateCollection->Add($coordinate);
// 创建外部边界的第三个坐标值 $coordinate = $geometryFactory->CreateCoordinateXY(3,3); $index = $coordinateCollection->Add($coordinate);
// 创建外部边界的第四个坐标值 $coordinate = $geometryFactory->CreateCoordinateXY(0,3); $index = $coordinateCollection->Add($coordinate);
// 创建外部边界的第五个坐标值,它与外部边界的第一个坐标值相同 $coordinate = $geometryFactory->CreateCoordinateXY(0,0); $index = $coordinateCollection->Add($coordinate);
// 创建用于定义外部边界的LinearRing $exteriorRing = $geometryFactory->CreateLinearRing($coordinateCollection); $coordinateCollection->Clear();
// 注意:内部边界的坐标值需要以顺时针的顺序加入 // 创建内部边界的第一个坐标 $coordinate = $geometryFactory->CreateCoordinateXY(1,1); $index = $coordinateCollection->Add($coordinate);
// 创建内部边界的第二个坐标 $coordinate = $geometryFactory->CreateCoordinateXY(1,2); $index = $coordinateCollection->Add($coordinate);
// 创建内部边界的第三个坐标 $coordinate = $geometryFactory->CreateCoordinateXY(2,2); $index = $coordinateCollection->Add($coordinate);
// 创建内部边界的第四个坐标 $coordinate = $geometryFactory->CreateCoordinateXY(2,1); $index = $coordinateCollection->Add($coordinate);
// 创建内部边界的第五个坐标值,它与内部边界的第一个坐标值相同 $coordinate = $geometryFactory->CreateCoordinateXY(1,1); $index = $coordinateCollection->Add($coordinate);
// 创建用于定义内部边界的LinearRing $interiorRing = $geometryFactory->CreateLinearRing($coordinateCollection);
// 将内部环加入内部环集合 $index = $interiorRingCollection->Add($interiorRing);
// 创建Polygon $polygon = $geometryFactory->CreatePolygon($exteriorRing, $interiorRingCollection);
// 得到Polygon的AGF文本 $polygonAgfText = $wktReaderWriter->Write($polygon); |
7) CurvePolygon
CurvePolygon是Region的子类型,它的边界为曲线环CurveRing类型,如下的代码创建了一个CurvePolygon,它外部边界是一个圆,内部边界也是一个圆。
$geometryFactory = new MgGeometryFactory(); $curveSegmentCollection = new MgCurveSegmentCollection(); $curveRingCollection = new MgCurveRingCollection();
// 创建外部边界的第一个曲线段 $startCoordinate = $geometryFactory->CreateCoordinateXY(0,2); $controlCoordinate = $geometryFactory->CreateCoordinateXY(2,4); $endCoordinate = $geometryFactory->CreateCoordinateXY(4,2); $arcSegment = $geometryFactory->CreateArcSegment($startCoordinate, $endCoordinate, $controlCoordinate); $index = $curveSegmentCollection->Add($arcSegment);
// 创建外部边界的第二个曲线段 $startCoordinate = $geometryFactory->CreateCoordinateXY(4,2); $controlCoordinate = $geometryFactory->CreateCoordinateXY(2,0); $endCoordinate = $geometryFactory->CreateCoordinateXY(0,2); $arcSegment = $geometryFactory->CreateArcSegment($startCoordinate, $endCoordinate, $controlCoordinate); $index = $curveSegmentCollection->Add($arcSegment);
// 为外部边界创建曲线环 $exteriorCurveRing = $geometryFactory->CreateCurveRing($curveSegmentCollection);
// 在加入新的曲线段之前清除MgCurveSegmentCollection $curveSegmentCollection->Clear();
// 创建内部边界的第一个曲线段 $startCoordinate = $geometryFactory->CreateCoordinateXY(1,2); $controlCoordinate = $geometryFactory->CreateCoordinateXY(2,3); $endCoordinate = $geometryFactory->CreateCoordinateXY(3,2); $arcSegment = $geometryFactory->CreateArcSegment($startCoordinate, $endCoordinate, $controlCoordinate); $index = $curveSegmentCollection->Add($arcSegment);
// 创建内部边界的第二个曲线段 $startCoordinate = $geometryFactory->CreateCoordinateXY(3,2); $controlCoordinate = $geometryFactory->CreateCoordinateXY(2,1); $endCoordinate = $geometryFactory->CreateCoordinateXY(1,2); $arcSegment = $geometryFactory->CreateArcSegment($startCoordinate, $endCoordinate, $controlCoordinate); $index = $curveSegmentCollection->Add($arcSegment);
// 为内部边界创建曲线环 $interiorCurveRing = $geometryFactory->CreateCurveRing($curveSegmentCollection); $index = $curveRingCollection->Add($interiorCurveRing);
// 创建CurvePolygon $curvePolygon = $geometryFactory->CreateCurvePolygon($exteriorCurveRing, $curveRingCollection);
//得到CurvePolygon的AGF文本 $curvePolygonAgfText = $wktReaderWriter->Write($curvePolygon); |
8) MultiPoint
MultiPoint是一个0维几何图形集合,集合中的每个元素都是Point,并且这些Point是无序的、不连接的,如下的代码创建了一个由两个Point组成MultiPoint。
// 假设已经创建了两个Point $pointCollection = new MgPointCollection(); // 在创建Point之后,将它们加入MgPointCollection $index = $pointCollection->Add($point1); $index = $pointCollection->Add($point2); // 创建MultiPoint $multiPoint = $geometryFactory->CreateMultiPoint($pointCollection); // 获取MultiPoint的AGF文本 $multiPointAgfText = $wktReaderWriter->Write($multiPoint); |
9) MultiLineString
MultiLineString是一个1维几何图形集合,集合中的元素只能为LineString,并且这些LineString是无序的,图8-5显示了一些MultiLineString几何图形,如下的代码创建了一个由两个LineString组成MultiLineString。
// 假设已经创建了两个LineString $lineStringCollection = new MgLineStringCollection(); // 在创建LineString之后,将它们加入MgLineStringCollection $index = $lineStringCollection->Add($lineString1); $index = $lineStringCollection->Add($lineString2); //创建MultiLineString $multiLineString = $geometryFactory->CreateMultiLineString($lineStringCollection); // 获取MultiLineString的AGF文本 $multiLineStringAgfText = $wktReaderWriter->Write($multiLineString); |
10) MultiCurveString
一个MultiLineString是一个1维几何图形的集合,集合中的元素为CurveString,并且这些CurveString是无序的,如下的代码创建了一个由两个CurveString组成MultiCurveString。
// 假设已经创建了两个CurveString $curveStringCollection = new MgCurveStringCollection(); // 在创建CurveString之后,将它们加入MgCurveStringCollection $index = $curveStringCollection->Add($curveString1); $index = $curveStringCollection->Add($curveString2); // 创建MultiCurveString $multiCurveString = $geometryFactory->CreateMultiCurveString($curveStringCollection); // 获取MultiCurveString的AGF文本 $multiCurveStringAgfText = $wktReaderWriter->Write($multiCurveString); |
11) MultiPolygon
MultiPolygon是一个2维几何图形的集合,集合中的元素为Polygon,它的任意两个MgPolygon不可以相交,但可以接触,接触点必须是有限的,图8-6显示了一些MultiPolygon的示例,图8-7显示了无法使用MultiPolygon表示的几何,如下的代码创建了一个由两个Polygon组成MultiPolygon。
// 假设已经创建了两个Polygon $polygonCollection = new MgPolygonCollection(); // 在创建Polygon之后,将它们加入MgPolygonCollection $index = $polygonCollection->Add($polygon1); $index = $polygonCollection->Add($polygon2); // 创建MultiPolygon $multiPolygon = $geometryFactory->CreateMultiPolygon($polygonCollection); // 获取MultiPolygon的AGF文本 $multiPolygonAgfText = $wktReaderWriter->Write($multiPolygon); |
12) MultiCurvePolygon
MultiCurvePolygon是一个2维几何图形的集合,集合中的元素为CurvePolygon,它的任意两个CurvePolygon不可以相交,但可以接触,接触点必须是有限的,如下的代码创建了一个由两个CurvePolygon组成MultiCurvePolygon。
// 假设已经创建了两个CurvePolygon $curvePolygonCollection = new MgCurvePolygonCollection(); // 在创建CurvePolygon之后,将它们加入MgCurvePolygonCollection $index = $curvePolygonCollection->Add($curvePolygon1); $index = $curvePolygonCollection->Add($curvePolygon2); // 创建MultiCurvePolygon $multiCurvePolygon = $geometryFactory-> CreateMultiCurvePolygon( $curvePolygonCollection); // 获取MultiCurvePolygon的AGF文本 $ multiCurvePolygon = $wktReaderWriter->Write($multiPolygon); |
13) MultiGeometry
MultiGeometry是一个几何图形的集合,集合中的元素可以为任意类型的几何图形,例如一个MultiGeometry可以包含一个Point和一个MultiPoint,集合中的任意两个几何图形不可以是连接的,并且集合中的所有几何图形是无序的,如下的代码创建了一个由Point、MultiPoint、MultiLineString、CurveString、MultiCurveString、Polygon、MultiPolygon和MultiCurvePolygon组成MultiCurvePolygon。
$geometryFactory = new MgGeometryFactory(); $geometryCollection = new MgGeometryCollection();
// 假设已经创建了下面的这些几何图形 $index = $geometryCollection->Add($point); $index = $geometryCollection->Add($multiPoint); $index = $geometryCollection->Add($lineString); $index = $geometryCollection->Add($multiLineString); $index = $geometryCollection->Add($curveString); $index = $geometryCollection->Add($multiCurveString); $index = $geometryCollection->Add($polygon); $index = $geometryCollection->Add($multiPolygon); $index = $geometryCollection->Add($curvePolygon); $index = $geometryCollection->Add($multiCurvePolygon);
//创建MultiGeometry $multiGeometry = $geometryFactory->CreateMultiGeometry($geometryCollection);
// 获取MultiCurvePolygon的AGF文本 $multiGeometryAgfText = $wktReaderWriter->Write($multiGeometry); |
图8-2 LineString示例
图8-3 Polygon示例
图8-4 无法用单个Polygon表示的几何体
图8-5 MultiLineString示例
图8-6 MultiPolygon示例
图8-7 无法用MultiPolygon表示的几何体