与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(); |