OGR数据模型
2013年10月10日
2015年3月30日修正坐标参考模型
1 OGR几何对象模型OGRGeometry
1.1 Geometry
几何图形,最基本的地图图形。注意:包含空间参考。
其它所有的地图图形都是由本类派生出来的。
包含了通用的属性和方法。
注意:空间操作的部分需要GEOS支持,如果没有GEOS,则返回FALSE。
1.1.1 几何属性
getGeometryType():获取几何类型。
getGeometryName():获取几何对象的名称。
1.1.2 维度操作
getDimension():获取图形维度。
getCoordinateDimension():获取坐标系统维度。
setCoordinateDimension():设置坐标系统维度。
flattenTo2D():将3D图形转换为2D(Z值全部设置为0)。
1.1.3 整体形状操作
isEmpty():判断空形状。
isSimple():判断简单形状。
isValid():判断有效性。
isRing():判断是否为环。如果没有点,返回TRUE;否则返回FALSE。
empty():置空图形。
clone():复制图形。
getEnvelop():获取外接矩形。
getBoundary():
closeRings():强制封闭环。
segmentize():线段分化,将长线段分为短线段。
swapXY():交换XY。
1.1.4 导入导出
wkbSize():计算WKB格式所需要的字节数。
importFromWkb():导入WKB。
exportToWkb():导出为WKB。
importFromWkt():导入WKT。
exportToWkt():导出为WKT。
dumpReadable():将WKT格式写入指定文件。
exportToGML():导出为GML。
exportToKML():导出为KML。
exportToJson():导出为JSON。
exportToGEOS():导出为GEOS格式。
1.1.5 空间参考
assignSpatialReference():设置空间参考。
getSpatialReference():获取空间参考。
transform():转换空间参考,指定转换参数。
transformTo():转换空间参考,转换为新的空间参考,需要原有空间参考。
1.1.6 空间分析
1.1.6.1 判断空间关系
Intersects():判断相交。
Intersect():与Intersects()相同。
Equals():判断相同。
Equal():与Equals()相同。
Disjoint():判断不相交。
Touchs():判断边界相交。
Crosses():判断通过性。
Within():判断是否在内部。与Contains相反。
Contains():判断包含。与Within相反。
Overlaps():判断叠迭性,不能相同。
1.1.6.2 计算空间关系
Boundary():计算外部形状。
getBoundary():由Boundary()代替,不推荐使用。
Distance():计算距离。
ConvexHull():计算最小凸外多边形。
Buffer():计算缓冲区。
Intersection():计算相交部分。
Union():计算相并部分。
UnionCascade():串联计算相并部分。
Difference():计算相差部分。
SymDifference():计算交集的补集。
SymmetricDifference():由SymDifference()代替,不推荐使用。
Centroid():计算重心。
Simplify():简化图形。
SimplifyPreserveTopology():简化图形的同时保留拓扑特性。
Polygonize():多边形化。
1.1.7 示例
voidCidentifyView::OnGeosSelect()
{
// TODO: 在此添加命令处理程序代码
char *filePath = "D:\\Test\\SMO\\data\\SHP";
OGRRegisterAll();
OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE);
OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");
OGRFeature *pFeature = pLayerCity->GetFeature(0);
OGRGeometry *pGeometry = pFeature->GetGeometryRef();
OGRPoint pt;
pt.setX(87);
pt.setY(29);
OGRBoolean bInterset = pGeometry->Intersects(&pt);
if(bInterset == TRUE)
{
OGRGeometry *pIntersetion =pGeometry->Intersection(&pt);
OGRPoint *pPtIntersection = (OGRPoint *)pIntersetion;
int a = 0;
}
}
1.2 点
1.2.1 OGRPoint
点类型,2D或3D。
由于2D和3D是相对应的,使用wkbFlatten()可以将3D转化为2D(z值置空)。
GetX()/SetX()
GetY()/SetY()
GetZ()/SetZ()
1.3 线
1.3.1 OGRCurve
线类型的抽象基类型。
isClosed():判断封闭性。
get_Length():获取长度。
StartPoint():获取起始点。
EndPoint():获取终止点。
Value():获取指定距离的点。
1.3.2 OGRLineString
折线,由Vertex(节点)组成。
addPoint():添加节点。
getPoint():获取节点。
setPoints():设置所有节点。
getPoints():获取所有节点。
setNumPoints():设置节点数目。
addSubLineString():添加子线段。
1.3.2.1 示例
voidCidentifyView::OnGeometryLinestring()
{
// TODO: 在此添加命令处理程序代码
char *filePath = "D:\\Test\\SMO\\data\\SHP";
OGRRegisterAll();
OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE);
OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");
OGRFeature *pFeature = pLayerCity->GetFeature(0);
OGRGeometry *pGeometry = pFeature->GetGeometryRef();
//linestring
OGRLineString lineString;
lineString.addPoint(84,27);
lineString.addPoint(88,31);
OGRBoolean bTouch =pGeometry->Touches(&lineString);//false
OGRBoolean bCross =pGeometry->Crosses(&lineString);//true
short nNum = lineString.getNumPoints();
OGRLineString subLineString;
subLineString.addPoint(90,31);
subLineString.addPoint(91,31);
lineString.addSubLineString(&subLineString);
OGRPoint pt;
lineString.getPoint(3,&pt);//(91,31)
}
1.3.3 OGRLinearRing
环-封闭的折线。
isClockwise():判断顺时针。
CloseRings():强制封闭环。
get_Area():获取环的面积。
isPointInRing():判断点是否在环的内部。
1.3.3.1 示例
voidCidentifyView::OnGeometryLinearRing()
{
// TODO: 在此添加命令处理程序代码
char *filePath = "D:\\Test\\SMO\\data\\SHP";
OGRRegisterAll();
OGRDataSource *pODS = OGRSFDriverRegistrar::Open(filePath,TRUE);
OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");
OGRFeature *pFeature = pLayerCity->GetFeature(0);
OGRGeometry *pGeometry = pFeature->GetGeometryRef();
//linering
OGRLinearRing linearRing;
linearRing.addPoint(84,27);
linearRing.addPoint(88,31);
linearRing.addPoint(88,27);
linearRing.closeRings();//num = 4
double dArea = linearRing.get_Area();//8.0
OGRBoolean bClockwise = linearRing.isClockwise();
OGRPoint pt(87,28);
OGRBoolean bWithin =linearRing.isPointInRing(&pt,TRUE);//true
}
1.4 面
1.4.1 OGRSurface
面抽象基类。
get_Area():返回面积。
PointOnSurface():返回表面的一个点(确保在面上)。
1.4.2 OGRPolygon
多边形。由环组成。可以是复杂的多边形(包含岛)。
addRing():添加环,如果多边形为空,则为外环,如果不为空,则为内环(岛)。将传入的环复制一个环,加入多边形中。
addRingDirectly():添加环。功能同addRing(),直接使用传入的环,不再构建。
closeRings():强制封闭环。
getExteriorRing():获取外环。
getInteriorRing():获取某个内环。
getNumInteriorRing():获取内环数目。
1.4.2.1 示例
voidCidentifyView::OnGeometryPolygon()
{
// TODO: 在此添加命令处理程序代码
char *filePath = "D:\\Test\\SMO\\data\\SHP";
OGRRegisterAll();
OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE);
OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");
OGRFeature *pFeature = pLayerCity->GetFeature(0);
OGRGeometry *pGeometry = pFeature->GetGeometryRef();
//polygon
OGRLinearRing ringOut;
ringOut.addPoint(80,30);
ringOut.addPoint(80,40);
ringOut.addPoint(90,40);
ringOut.addPoint(90,30);
ringOut.closeRings();
OGRLinearRing ringIn0;
ringIn0.addPoint(82,32);
ringIn0.addPoint(82,38);
ringIn0.addPoint(88,38);
ringIn0.addPoint(88,32);
ringIn0.closeRings();
OGRPolygon polygon;
polygon.addRing(&ringOut);
polygon.addRing(&ringIn0);
polygon.addRingDirectly(&ringIn0);
int nNum = polygon.getNumInteriorRings();
const OGRLinearRing *ringIn = polygon.getInteriorRing(0);
OGRLinearRing *prIn0 = (OGRLinearRing *)ringIn->clone();
OGRPoint pt0;
prIn0->getPoint(0,&pt0);
OGRLinearRing ringOut0 = polygon.getExteriorRing();
polygon.closeRings();
//change,addRing()与addRingDirectly()区别
ringIn0.addPoint(108,78);
ringIn0.getPoint(5,&pt0);//(108,78)
ringIn->getPoint(5,&pt0);//随机值
const OGRLinearRing *ringIn1 = polygon.getInteriorRing(1);
ringIn1->getPoint(5,&pt0);//(108,78)
}
1.5 几何对象集合
1.5.1 OGRGeometryCollection
几何对象集合。
addGeometry():添加几何对象(特定派生类只能添加特定的几何对象)。复制。
addGeometryDirectly():直接添加几何对象。不再复制。
removeGeometry():移除几何对象。
getNumGeometries():获取集合中对象的数目。
getGeometryRef():获取几何对象。是集合中的某一个对象。
1.5.2 OGRMultiPoint
1.5.3 OGRMultiLineString
1.5.4 OGRMultiPolygon
1.5.5 示例
voidCidentifyView::OnGeometryCollection()
{
// TODO: 在此添加命令处理程序代码
char *filePath = "D:\\Test\\SMO\\data\\SHP";
OGRRegisterAll();
OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE);
OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");
OGRFeature *pFeature = pLayerCity->GetFeature(0);
OGRGeometry *pGeometry = pFeature->GetGeometryRef();
OGRGeometryCollection colGeometry;
colGeometry.addGeometry(pGeometry);
colGeometry.addGeometry(pGeometry);
int iNum = colGeometry.getNumGeometries();
OGRPolygon *pGeo = (OGRPolygon *)colGeometry.getGeometryRef(0);
OGRPolygon *pGeo1 = (OGRPolygon*)colGeometry.getGeometryRef(1);
colGeometry.removeGeometry(1,FALSE);//如果这里使用默认的TRUE删除,则pGeo1所占用的内存会被释放,再次调用会出错。
OGREnvelope env;
pGeo->getEnvelope(&env);
pGeo1->getEnvelope(&env);//如果删除时释放,则此句会报错。
OGRPoint pt0;
pGeo1->getExteriorRing()->getPoint(0,&pt0);
OGRMultiPolygon colPoly;
colPoly.addGeometry(pGeometry);
OGRErr errAdd = colPoly.addGeometry(&pt0);//类型不一致,无法添加
errAdd = colPoly.addGeometry(&colGeometry);//类型不一致,无法添加
errAdd = colGeometry.addGeometry(&colPoly);//可以添加
OGRMultiPoint colPt;
colPt.addGeometry(&pt0);
colPt.addGeometry(&pt0);
errAdd = colGeometry.addGeometry(&colPt);//可以添加
errAdd = colGeometry.addGeometry(&pt0);//可以添加
OGRMultiPoint colPt2;
colPt2.addGeometry(&pt0);
colPt2.addGeometry(&pt0);
errAdd = colPt.addGeometry(&colPt2);//类型不一致,无法添加
if(errAdd != OGRERR_NONE)
{
TRACE(_T("OGRERR!\n"));
}
}
2 OGR空间参考模型:OGRSpatialReference、OGRCoordinateTransformation
目的:设置投影和大地参考(DATUM)。
方法: