AGF规范

本节使用类似于OGC规范的格式描述了简单几何(Simple Geometry)类型的内存布局,它建立在C++结构体内存布局之上,所有的数组是inline的,具有可计算的大小,不指向内存中不同的位置,这样的格式允许将几何数据转换为一个二进制流。

double类型数据是8个字节,使用了IEEE双精度数据编码方式,int类型数据是4字节。

enum GeometryType : int

{

None = 0,

Point = 1,

LineString = 2,

Polygon = 3,

MultiPoint = 4,

MultiLineString = 5,

MultiPolygon = 6,

MultiGeometry = 7,

CurveString = 10,

CurvePolygon = 11,

MultiCurveString = 12,

MultiCurvePolygon = 13

}

1) 坐标类型(Coordinate Types

enum CoordinateDimensionality : FdoInt32

{

XY = 0,

Z = 1,

M = 2

}

2) 基本几何图形(Basic Geometry

struct Geometry

{

int geomType;

CoordinateDimensionality type;

}

3) 符号定义(Notation Definition

// Define a notation within this specification

// int PositionSize(geometry)

// {

// if (geometry.type == CoordinateDimensionality.XY | CoordinateDimensionality.M ||

// geometry.type == CoordinateDimensionality.XY | CoordinateDimensionality.Z)

// return 3;

// if (geometry.type == CoordinateDimensionality.XY |CoordinateDimensionality.M |

// CoordinateDimensionality.Z)

// return 4;

// return 2;

// }

struct Point // : Geometry

{

int geomType; // == GeometryType.Point;

CoordinateDimensionality type; // all types allowed

double[] coords; // size = PositionSize(this)

}

struct LineString

{

int geomType;

CoordinateDimensionality type;

int numPts; // >0

double[] coords; // size = numPts* PositionSize(this)

}

struct MultiPoint

{

int geomType;

int numPoints; // > 0

Point[] points; // size = numPoints

}

struct MultiLineString

{

int geomType;

int numLineStrings; // >= 0

LineString[] lineStrings; // size = numLineStrings

}

// building block for polygons, not geometry by itself

struct LinearRing

{

int numPts; // >0

double[] coords; // size = numPts* PositionSize(polygon)

}

struct Polygon

{

int geomType;

CoordinateDimensionality type;

int numRings; // >= 1 as there has to be at least one ring

LinearRing[] lineStrings; // size = numRings

}

struct MultiPolygon

{

int geomType;

int numPolygons; // >= 0

Polygon[] polygons; // size = numPolygons

}

struct MultiGeometry

{

int geomType;

int numGeom; // >= 0

Geometry[] geometry; // size = numGeom

}

enum CurveElementType : int

{

LineString = 1,

CircularArc = 2

}

struct CurveStringElement

{

int CurveElementType;

}

struct LinearCurveStringElement

{

int CurveElementType;

int length;

double[] coords; // size = this.length * PositionSize (this)

}

struct CircularArcCurveStringElement

{

int CurveElementType; // == CurveElmentType.Arc

double[] coords; // size = 2 * PositionSize(this)

}

struct CurveString

{

int geomType;

CoordinateDimensionality type; // all types allowed

double[] startPoint; // size = PositionSize(this)

int numElements; // >=0

CurveStringElement[] elements; // size = numElements

}

struct Ring

{

double[] startPoint; // size = PositionSize(this)

int numElements; // >=0

CurveStringElement[] elements; // size = numElements

}

struct MultiCurveString

{

int geomType;

int numCurveStrings; // >= 0

CurveString[] curveStrings; // size = numCurveStrings

}

struct CurvePolygon

{

int geomType; ;

CoordinateDimensionality type;

int numRings; // >=1 as there has to be at least one ring

Ring[] rings; // size = numRings

}

struct MultiCurvePolygon

{

int geomType;

int numPolygons; // >=0

CurvePolygon[] polygons; // size = numElements

}

AGF Memory Layout

1 按照FGF格式存储的多边形

1以字节数组的方式显示了一个按照FGF规范存储的多边形,其中

l T=3表示GeometryType == GeometryType.Polygon

l CT = 0代表CoordinateDimensionality == CoordinateDimensionality.XY

l NR = 2代表ring的数目为2

l NP = 3代表点的数目为3

你可能感兴趣的:(数据结构)