OGR数据模型
2013年10月10日
2015年3月30日修正坐标参考模型
几何图形,最基本的地图图形。注意:包含空间参考。
其它所有的地图图形都是由本类派生出来的。
包含了通用的属性和方法。
注意:空间操作的部分需要GEOS支持,如果没有GEOS,则返回FALSE。
getGeometryType():获取几何类型。
getGeometryName():获取几何对象的名称。
getDimension():获取图形维度。
getCoordinateDimension():获取坐标系统维度。
setCoordinateDimension():设置坐标系统维度。
flattenTo2D():将3D图形转换为2D(Z值全部设置为0)。
isEmpty():判断空形状。
isSimple():判断简单形状。
isValid():判断有效性。
isRing():判断是否为环。如果没有点,返回TRUE;否则返回FALSE。
empty():置空图形。
clone():复制图形。
getEnvelop():获取外接矩形。
getBoundary():
closeRings():强制封闭环。
segmentize():线段分化,将长线段分为短线段。
swapXY():交换XY。
wkbSize():计算WKB格式所需要的字节数。
importFromWkb():导入WKB。
exportToWkb():导出为WKB。
importFromWkt():导入WKT。
exportToWkt():导出为WKT。
dumpReadable():将WKT格式写入指定文件。
exportToGML():导出为GML。
exportToKML():导出为KML。
exportToJson():导出为JSON。
exportToGEOS():导出为GEOS格式。
assignSpatialReference():设置空间参考。
getSpatialReference():获取空间参考。
transform():转换空间参考,指定转换参数。
transformTo():转换空间参考,转换为新的空间参考,需要原有空间参考。
Intersects():判断相交。
Intersect():与Intersects()相同。
Equals():判断相同。
Equal():与Equals()相同。
Disjoint():判断不相交。
Touchs():判断边界相交。
Crosses():判断通过性。
Within():判断是否在内部。与Contains相反。
Contains():判断包含。与Within相反。
Overlaps():判断叠迭性,不能相同。
Boundary():计算外部形状。
getBoundary():由Boundary()代替,不推荐使用。
Distance():计算距离。
ConvexHull():计算最小凸外多边形。
Buffer():计算缓冲区。
Intersection():计算相交部分。
Union():计算相并部分。
UnionCascade():串联计算相并部分。
Difference():计算相差部分。
SymDifference():计算交集的补集。
SymmetricDifference():由SymDifference()代替,不推荐使用。
Centroid():计算重心。
Simplify():简化图形。
SimplifyPreserveTopology():简化图形的同时保留拓扑特性。
Polygonize():多边形化。
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;
}
}
点类型,2D或3D。
由于2D和3D是相对应的,使用wkbFlatten()可以将3D转化为2D(z值置空)。
GetX()/SetX()
GetY()/SetY()
GetZ()/SetZ()
线类型的抽象基类型。
isClosed():判断封闭性。
get_Length():获取长度。
StartPoint():获取起始点。
EndPoint():获取终止点。
Value():获取指定距离的点。
折线,由Vertex(节点)组成。
addPoint():添加节点。
getPoint():获取节点。
setPoints():设置所有节点。
getPoints():获取所有节点。
setNumPoints():设置节点数目。
addSubLineString():添加子线段。
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)
}
环-封闭的折线。
isClockwise():判断顺时针。
CloseRings():强制封闭环。
get_Area():获取环的面积。
isPointInRing():判断点是否在环的内部。
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
}
面抽象基类。
get_Area():返回面积。
PointOnSurface():返回表面的一个点(确保在面上)。
多边形。由环组成。可以是复杂的多边形(包含岛)。
addRing():添加环,如果多边形为空,则为外环,如果不为空,则为内环(岛)。将传入的环复制一个环,加入多边形中。
addRingDirectly():添加环。功能同addRing(),直接使用传入的环,不再构建。
closeRings():强制封闭环。
getExteriorRing():获取外环。
getInteriorRing():获取某个内环。
getNumInteriorRing():获取内环数目。
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)
}
几何对象集合。
addGeometry():添加几何对象(特定派生类只能添加特定的几何对象)。复制。
addGeometryDirectly():直接添加几何对象。不再复制。
removeGeometry():移除几何对象。
getNumGeometries():获取集合中对象的数目。
getGeometryRef():获取几何对象。是集合中的某一个对象。
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"));
}
}
目的:设置投影和大地参考(DATUM)。
方法:
1) 设置地理坐标系统:SetGeogCS()。注意要使用标准的DATUM名称,其它参数用于设置为用户可以识别的名称。一般情况下,不需要自己定义坐标系统,而是使用一些已经定义好的坐标系统。OGR可以使用部分内置的坐标系统。
2) 设置命名或编号坐标系统:SetWellknownGeogsCS()。
3) WKT格式交换:exportToWKT()/importFromWKT()。返回值要以CPLFree()或OGRFree()释放。
4) 示例:设置坐标系统,如果无指定值,则使用WGS84
QByteArray baCrs("WGS84");
if(!strTargetCRS.isEmpty ()){
baCrs = strTargetCRS.toLocal8Bit ();
}
OGRSpatialReference oSRS;
oSRS.SetWellKnownGeogCS(baCrs);
char *pszDstWKT = NULL;
oSRS.exportToWkt( &pszDstWKT );
CPLErr err = pDstDst->SetProjection(pszDstWKT);
CPLFree(pszDstWKT);
if(CE_None!=err){
qDebug()<<"destinationdataset crs set failed."< } 依赖地理坐标系统。因此需要设置地理坐标系统。 注意:顺序设置投影系统。1.创建投影。2.设置相关地理坐标。3.设置投影。 1) 设置命名或编号坐标系统:importFromEPSG(),importFromProj4()等。 2) 设置常用投影坐标系统:SetUTM()/SetTM()/SetLC()。 3) 自定义投影系统名称(仅命名):SetProjCS()。 isProected():判断是否为投影坐标系统。 isGeographic():判断是否为地理坐标系统。 GetSemiMajor():长半轴。 GetSemiMinor():短半轴。 GetInvFlattening():扁率的倒数。 GetAttrValue():参数值。 GetProjParm():投影参数值,可以使用预定义的宏进行获取。 GetLinearUnits():类型,与M的转换单位。 voidCidentifyView::OnSrsGeogcs() { // TODO: 在此添加命令处理程序代码 OGRSpatialReference srs; srs.SetGeogCS("mySrs","WGS_1984","myEllipsoid",SRS_WGS84_SEMIMAJOR,SRS_WGS84_INVFLATTENING,"Greenwich",0.0,"degree",atof(SRS_UA_DEGREE_CONV)); char *pszWKT = NULL; srs.exportToWkt(&pszWKT); srs.SetWellKnownGeogCS("EPSG:4326"); srs.exportToWkt(&pszWKT); OGRSpatialReference srsProj; srsProj.SetProjCS("myProject"); srsProj.SetWellKnownGeogCS("EPSG:4326"); srsProj.SetUTM(17,TRUE); char *pszPROJ = NULL; srsProj.exportToWkt(&pszPROJ); int iPrj = srsProj.IsProjected(); int iGeo = srsProj.IsGeographic(); double dMajor = srsProj.GetSemiMajor(); double dMinor = srsProj.GetSemiMinor(); double dInvF = srsProj.GetInvFlattening(); double dUnits = srsProj.GetLinearUnits(); const char *pName =srsProj.GetAttrValue("PROJECTION"); double dMeridian = srsProj.GetProjParm(SRS_PP_CENTRAL_MERIDIAN); CPLFree(pszWKT); CPLFree(pszPROJ); } 目标:将点进行坐标系统转换。 方法: 创建坐标转换对象:OGRCreateCoordinateTransformation()。 转换坐标系统:OGRCoordinateTransformation::Transform()。 注意:如果使用了系统未定义的DATUM,有可能导致错误,使用时注意检查。 参考:http://www.gdal.org/osr_tutorial.html voidCidentifyView::OnSrsTransform() { // TODO: 在此添加命令处理程序代码 //target OGRSpatialReference srsProj; srsProj.SetProjCS("BJUTM"); srsProj.SetWellKnownGeogCS("EPSG:4326"); srsProj.SetUTM(50,TRUE); char *pszPROJ = NULL; srsProj.exportToWkt(&pszPROJ); //source OGRSpatialReference srsGeog; srsGeog.SetWellKnownGeogCS("EPSG:4326"); //transfrom OGRCoordinateTransformation *pCT =OGRCreateCoordinateTransformation(&srsGeog,&srsProj); double x = 88,y=30; pCT->Transform(1,&x,&y);//x=-2356049.0001576482,y=3701005.1820355225 } 要素,包含属性和地图几何图元。一般用于操作空间和属性的联动。 主要由属性OGRField、OGRFeatureDefn和几何图元OGRGeometry组成。由nFID唯一标识。 属性表定义类。 用于存取属性表的结构,以及几何图形的元数据。 GetName():获取属性表结构名称,默认是图层名称。 GetFieldCount():获取列数目。 GetFieldDefn():获取列定义。 GetFieldIndex():获取列索引。 AddFieldDefn():添加列定义。 DeleteFiledDefn():删除列定义。 RecorderFieldDefn():保存属性表定义。只有无相关OGRFeature存在时才可使用,如果有,则使用OGR_L_RecorderFields()。 GetGeomType():获取几何图形类型。 SetGeomType():设置几何图形类型。 Clone():复制。 Release():释放。 IsGeometryIgnored():判断是否可以忽略几何图形。 SetGeometryIgnored():设置是否可以忽略几何图形。 IsStyleIgnored():判断是否可以忽略样式。 SetStyleIgnored():设置是否可以忽略样式。 IsSame():判断相同。 用于定义字段的属性。包含精度、类型、名称等。 SetName():设置名称。 GetNameRef():获取名称。 GetType():读取类型。 SetType():设置类型。 GetJustify():读取对齐方式。 SetJustify():设置对齐方式。 GetWidth()/SetWidth():存取宽度。 GetPricision()/SetPricision():存取精度。 Set():一次性设置。 SetDefault():设置默认值。 GetDefault():读取默认值。 IsIgnored():判断是否可忽略。 SetIgnored():设置是否可忽略。 IsSame():判断相同。 元素。是一个集合。用于标识要素内部某一个元素的值。 主要用于管理样式。 OGRSytleTable:样式表类,样式中的所有具体内容。 OGRStyleMgr:样式管理器,使用时要先用样式表生成此类。 OGRStyleTool:由样式管理器进行管理,用于操作具体的样式。 OGRStylePen:具体画笔样式。(OGRStyleTool派生) OGRStyleBrush:具体的画刷样式。(OGRStyleTool派生) OGRStyleLabel:具体的标签样式。(OGRStyleTool派生) OGRStyleSymbol:具体的符号样式。(OGRStyleTool派生) http://blog.csdn.net/zhouschina/article/details/8668667 GetDefnRef():获取元素的表结构定义OGRFeatureDefn。 DumpReadable():导出为TXT文件。 setFrom():从另一个Feature导入属性和几何元素。 setFieldsFrom():从另一个Feature导入属性数据。 RemapFields():重新排列属性。 GetFieldCount():数目。 GetFieldIndex():索引号。 isFiledSet():判断是否已经设置。 UnsetField():置空。 GetRawFiled():获取OGRField类型的值。 GetFiled*():按照不同的类型获取值。 SetFiled():设置属性值。 GetFID()/SetFID():FID存取。 SetGeometry():设置几何图形。 SetGeometryDirectly():直接添加。与StealGeometry()相反。 StealGeometry():与SetGeometryDirectly()相反,直接取出。 GetGeometryRef(): Clone():复制。 Equal():判断相同。 CreateFeature():创建,static。 DestroyFeature():销毁,static。在GetNextFeature()等 函数中会返回一个复制对象,供调用者使用,使用完成之后应释放。但是由于Windows的DLL机制,DLL与主程序之间使用不同的堆,使用主程序释放DLL堆内容会报错,所有会才此函数来保证兼容性。 GetStyleString():读取样式字符串。 SetStyleString():设置样式字符串。 SetStyleStringDirectly():直接设置。 GetStyleTable():读取样式表。 SetStyleTable():设置样式表。 SetStyleTableDirectly():直接设置样式表。 GDAL/OGR默认使用UTF-8进行编码,Shape默认使用ANSI(可以设置为UTF-8,但不能识别UNICODE)。读入Shape时,只能以ANSI方式读入。如果Shape是以UTF-8类型编码的话,会造成乱码。 1) 设置新图层为UTF-8编码方式 这一步很重要,因为默认会以ANSI方式编码。设置之后,会将ANSI类型的编码,转换为UTF-8格式的编码。所以,如果原始数据是UTF-8类型的编码,要先转换为ANSI格式编码,再保存。 CPLSetConfigOption("SHAPE_ENCODING",""); 2) 以ANSI读入原始数据(只能读入为ANSI,但编码方式取决于原始数据)。 3) 转换为Unicode 如果原图层为UTF-8编码的话,必须使用UTF-8编码格式读入并转换为Unicode,如果原图层为ANSI编码格式,则以ANSI编码格式转换为Unicode。 这一步,将原始数据进行还原。 4) 将UNICODE转换为ANSI编码格式,存入元素之中。 这一步,将数据转换为OGR能够正确设置的编码格式(只能识别ANSI)。 http://blog.csdn.net/liminlu0314/article/details/7330036 //设置图层的编码格式 CPLSetConfigOption("SHAPE_ENCODING",""); OGRLayer *pOGRLayerDes =pDSDes->CopyLayer(pOGRLayerSrc,pDesLayerName); //设置元素的编码格式 voidCFeature::translateAttributeToUTF8() { OGRFeatureDefn *pFeatureDefn = m_pFeature->GetDefnRef(); int nFieldCount = pFeatureDefn->GetFieldCount(); for(int i=0;i { OGRFieldDefn *pFieldDefn = NULL; pFieldDefn = pFeatureDefn->GetFieldDefn(i); OGRFieldType eFieldType = pFieldDefn->GetType(); //汉字处理 if(eFieldType == OFTString) { IConvertCString *pConvertCString = NULL; getConvertCString(&pConvertCString); //读取元素 const char *csFieldValue = m_pFeature->GetFieldAsString(i); //以UTF8格式转化为宽字符 CString strFieldValue; pConvertCString->fromUTF8(csFieldValue,strFieldValue); //转化为ANSI char *pStrANSI; pConvertCString->toChar(strFieldValue,pStrANSI); m_pFeature->SetField(i,pStrANSI); //release delete pStrANSI; pStrANSI = NULL; delete pConvertCString; pConvertCString = NULL; } else//直接Copy { OGRField *pValue = m_pFeature->GetRawFieldRef(i); m_pFeature->SetField(i,pValue); } } } voidCidentifyView::OnFeatureField() { // 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); //feature def OGRFeatureDefn *pDef = pFeature->GetDefnRef(); const char * pDefName = pDef->GetName(); int iFieldCount = pDef->GetFieldCount(); int iDefIndex = pDef->GetFieldIndex("NAME"); OGRwkbGeometryType tType = pDef->GetGeomType(); //field def OGRFieldDefn *pFieldDef = pDef->GetFieldDefn(iDefIndex); int iWidth = pFieldDef->GetWidth(); int iPresion = pFieldDef->GetPrecision(); const OGRField *pFieldDefault = pFieldDef->GetDefaultRef(); OGRFieldType fieldType = pFieldDef->GetType(); const char *pFieldNam = pFieldDef->GetNameRef(); OGRJustification jstf = pFieldDef->GetJustify(); int iFieldIndex = pFeature->GetFieldIndex("NAME"); OGRField *pField = pFeature->GetRawFieldRef(iFieldIndex); int iSet = pFeature->IsFieldSet(iFieldIndex); pFeature->UnsetField(iFieldIndex); int iCount = pFeature->GetFieldCount(); pFeature->SetField(iFieldIndex,"MyString"); const char *pFieldString =pFeature->GetFieldAsString(iFieldIndex); pFeature->SetFID(8877L); long lFID = pFeature->GetFID(); //style const char *pStyle = pFeature->GetStyleString(); OGRStyleTable *pStyleTable = new OGRStyleTable; OGRStyleMgr *pMgr = new OGRStyleMgr(pStyleTable); pMgr->AddPart("PEN(w:10)"); //GBool bAdd =pMgr->AddStyle("BRUSH","(w:10)"); OGRStylePen *pPenStyle =(OGRStylePen *)pMgr->GetPart(0); GBool bAdd =pMgr->AddStyle("PEN","(w:10)"); OGRStyleLabel styleLabel; styleLabel.SetAngle(10); pMgr->AddPart(&styleLabel); int iStyleCount = pMgr->GetPartCount(); OGRStyleTool *pTool = pMgr->GetPart(0); OGRStyleTool *pTool1 = pMgr->GetPart(1); const char * pStrBrush =pMgr->GetStyleByName("Pen"); OGRStyleTable *pTableNow = pMgr->GetDataSetStyleTable(); OGRFeature *pFeatureNew = OGRFeature::CreateFeature(pDef); OGRPoint pt(88,30); pFeatureNew->SetGeometry(&pt); pFeatureNew->SetField(0,"963"); } 相同元素的集合。 注意,在编译元素的时候,一定要在Open时,将bUpdate开关设置为TRUE。 GetSpatialFilter()/SetSpatialFilter():读取/设置空间过滤几何对象。再下次查询时会进行空间过滤。 SetSpatialFilterRect():设置空间过滤为指定的矩形。当年版本的OGR有BUG,只能使用过滤图形的外接矩形与图层中图形的外接矩形进行分析。使用OGRGeometry的Intersects()函数,在GEOS库下可以进行具体操作。 SetAttributeFilter():设置属性过滤条件。格式为SQL Where:NAME = ‘dd’。 注意:OGR使用SQLITE进行查询,SQLITE使用UTF8格式,所以查询的时候应该转化为UTF8格式,虽然看上去是乱码,但是SQLITE可以识别。查询结果是正确的。 ResetReading():重置读取。 GetNextFeature():获取下个元素。 SetNextByIndex():获取指定的元素。 GetFeature():按FID读取元素。注意,读取元素后,生成元素副本(使用完成后一定要释放),并不是当前图层要元素,如果要进行修改,则应该将修改后的内容使用SetFeature()设置原有元素(无法生成新元素,只能修改原有元素,使用CreateFeature()生成新元素)。 SetFeature():设置元素。 CreateFeature():生成元素,如果要生成新的元素,请使用此函数。 DeleteFeature():删除元素。 GetFeatureCount():获取元素数量。 GetFeaturesRead(): GetName():图层名称。 GetGeomType():几何类型。 GetLayerDefn():属性表定义。 GetSpatialRef():空间参考。注意,这里返回的空间参考OGRSpatialReference*是原图层的中的指针,只读,不可释放。 GetExtent():外接多边形。可以使用TRUE强制计算图层的MBR(minimum bounding rectangle),如果使用FALSE,则在浪费较多资源的情况下,会返回失败,并不进行计算。如果不存在有效的图形,则返回OGRERR_FAILURE。不同的驱动对空间过滤条件的影响也不同,所以应该不使用空间过滤。有的驱动会改变图层的当前元素位置。返回OGREnvelop对象(包含Merge()函数,可以获取合并后的MBR)。 TestCapability():测试功能。 GetInfo():点位函数。用于返回元数据。暂时无功能,等待完善。 CreateField():生成列。 DeleteField():删除列。 RecorderFields():重新排列内部列的顺序。??? RecorderField():不推荐使用,由RecordsFields()代替。 AlterFieldDefn():修改列定义。 SyncToDisk():写入硬盘。 GetFIDColumn():获取FID列名。 GetGeometryColumn():获取几何列名。 SetIgnoredFields():设置忽略列。 AttributeFilterEvaluationNeedsGeometry():? InitializeIndexSupport():? GetIndex():? GetStyleTable():样式表。返回值为只读,不可修改,不可释放。 SetStyleTable():设置样式表。 SetStyleTableDirectly():直接设置样式表。 StartTransaction():开始。 CommitTransaction():提交。 RollbackTransaction():回滚。 Intersection():交(图层合并)。 Union():并。 SymDifference():和-交。 Identify():交的补。 Update():并-》合并。 Clip():交(仅输入图层)。 Erase():删除。 图层叠迭操作会使用两个图层进行进行叠迭分析,将相关连的图形按照不同的操作方法生成一个结果图层。 注意:坐标系统很重要! 1) 进行叠迭分析时,要注意操作的两个图层要有相同的空间参考。这里有个要注意的地方就是常用的WGS84坐标系。因为ESPG4326和WGS84其它是一个坐标系统,但是如果不明确指定ESPG4326的话DATUM有稍许的不同(DATUM的单位精确度不同),所有虽然都是WGS84,但是操作时却被认为是不同的空间参考(ARCGIS具有同样的操作问题)。所有在使用前应该将坐标系统一(使用PROJECT可以进行转换)。 2) 如果操作时坐标系统相同,仅是名称不同,在操作时会给出警告(ARCGIS会提示,OGR不会提示),但不会出错,仍然可以得到正确的结果。 示例 #include voidCidentifyView::OnGeosIdentify() { // TODO: 在此添加命令处理程序代码 char *filePath = "D:\\Test\\SMO\\data\\SHP"; char *layerName1 = "result";//ESPG4326 char *layerName2 = "city_RR_new";//Custom OGRLayer *pLayer1 = NULL; OGRLayer *pLayer2 = NULL; OGRDataSource *pODS = NULL; OGRRegisterAll(); pODS = OGRSFDriverRegistrar::Open(filePath,TRUE); //读取取要进行Union的两个图层 pLayer1 = pODS->GetLayerByName(layerName1); pLayer2 = pODS->GetLayerByName(layerName2); //OGRLayer *pLayer3 =pODS->CreateLayer("city_RR_new",pLayer2->GetSpatialRef(),wkbPolygon,NULL); //pLayer3->CreateFeature(pLayer2->GetFeature(0)); //pLayer3->SyncToDisk(); //创建结果图层 OGRLayer *pResultLayer = NULL; OGRSpatialReference sr4326; sr4326.SetWellKnownGeogCS("WGS84"); pResultLayer =pODS->CreateLayer("resultDiffName",&sr4326,wkbPolygon,NULL); //配置Union函数中的第三个参数 char **p = new char *[4]; p[0] = "SKIP_FAILURES=YES"; p[1] = "PROMOTE_TO_MULTI=YES"; p[2] = "INPUT_PREFIX=1"; p[3] = "METHOD_PREFIX=2"; OGRErr errResult =pLayer1->Erase(pLayer2,pResultLayer,p,NULL,NULL); //将对pResultLayer的编辑写入文件,如果不加这句,result文件中将没有记录 pResultLayer->SyncToDisk(); OGRDataSource::DestroyDataSource(pODS); } voidCidentifyView::OnLayerLayer() { // TODO: 在此添加命令处理程序代码 char *filePath = "D:\\Test\\SMO\\data\\SHP"; OGRRegisterAll(); OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE); OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR"); int iFCount = pLayerCity->GetFeatureCount(); const char *pLayerInfo =pLayerCity->GetInfo("NAME"); pLayerCity->SetSpatialFilterRect(80,25,100,40); pLayerCity->SetAttributeFilter("NAME = '张掖市'"); pLayerCity->ResetReading(); OGRFeature *pFeature = NULL; while( pFeature = pLayerCity->GetNextFeature()) { const char *pStrName =pFeature->GetFieldAsString("NAME"); TRACE(pStrName); TRACE("\n"); } GIntBig biNum = pLayerCity->GetFeaturesRead(); OGRGeometry *pGeo = pLayerCity->GetSpatialFilter(); } 数据源。图层的容器。当数据源销毁时,其相关的图层也会释放。 GetName():数据源名称。 TestCapability():测试功能。 ExecuteSQL():Sqlite数据SQL数据功能。 ReleaseResultSet():释放SQL查询结果。 SyncToDisk():写入硬盘。 DestoryDataSource():释放对象。将会销毁所有依赖的图层。 GetLayerCount():数目。 GetLayer():图层。 GetLayerByName():图层。 DeleteLayer():删除图层。 CreateLayer():创建图层。 CopyLayer():复制图层。 GetStyleTable():样式表。 SetStyleTable():设置。 SetStyleTableDirectly():直接设置。 GetDriver():获取。 SetDriver():调协。 用于支持对不同类型的文件的操作。 使用OGRSFDriver操作文件,在操作之前要使用OGRSFDriverRegister进行注册。 管理OGR对文件格式的支持。只有注册过的文件格式才能使用驱动操作。单例。不要使用此类进行派生。 为了使用所有可以支持的数据格式(即使有些用不到,OGR还是会在内部维护支持的数据格式列表),通常使用OGRRegisterAll():注册所有支持的类型。 OGR支持的文件格式类型参见4.3.3。 OpenShared():按名称打开数据源的驱动。 RegisterDriver():注册驱动。 DeregisterDriver():反注册驱动。 GetDriverCount():获取驱动数目。 GetDriver():获取驱动。 GetDriverByName():获取驱动。 AutoLoadDrivers():自动搜索库文件,加载驱动。 GetRegistrar():返回本类实例。如果没有,则新建。Static。 GetOpenDSCount():打开的数据源数目。?????? GetOpenDS():获取数据源。 ReleaseDataSource():释放数据源。 Open():打开数据源,Static。通常用来快速打开数据源(不关心驱动的情况下)。如果bUpdate设置为TRUE,可以进行编辑,如果为FALSE,则只读。 驱动类。支持对特定文件格式的操作。 GetName():名称。 Open():打开数据源。 TestCapability():测试功能。 CreateDataSource():创建数据源。 DeleteDataSource():删除数据源。 CopyDataSource():复制数据源。 http://www.gdal.org/ogr/ogr_formats.html Format Name Code Creation Georeferencing Compiled by default Aeronav FAA files AeronavFAA No Yes Yes ESRI ArcObjects ArcObjects No Yes No, needs ESRI ArcObjects Arc/Info Binary Coverage AVCBin No Yes Yes Arc/Info .E00 (ASCII) Coverage AVCE00 No Yes Yes Arc/Info Generate ARCGEN No No Yes Atlas BNA BNA Yes No Yes AutoCAD DWG DWG No No No AutoCAD DXF DXF Yes No Yes CartoDB CartoDB Yes Yes No, needs libcurl Comma Separated Value (.csv) CSV Yes No Yes CouchDB / GeoCouch CouchDB Yes Yes No, needs libcurl DODS/OPeNDAP DODS No Yes No, needs libdap EDIGEO EDIGEO No Yes Yes ElasticSearch ElasticSearch Yes (write-only) - No, needs libcurl ESRI FileGDB FileGDB Yes Yes No, needs FileGDB API library ESRI Personal GeoDatabase PGeo No Yes No, needs ODBC library ESRI ArcSDE SDE No Yes No, needs ESRI SDE ESRI Shapefile ESRI Shapefile Yes Yes Yes FMEObjects Gateway FMEObjects Gateway No Yes No, needs FME GeoJSON GeoJSON Yes Yes Yes Géoconcept Export Geoconcept Yes Yes Yes Geomedia .mdb Geomedia No No No, needs ODBC library GeoRSS GeoRSS Yes Yes Yes (read support needs libexpat) Google Fusion Tables GFT Yes Yes No, needs libcurl GML GML Yes Yes Yes (read support needs Xerces or libexpat) GMT GMT Yes Yes Yes GPSBabel GPSBabel Yes Yes Yes (needs GPSBabel and GPX driver) GPX GPX Yes Yes Yes (read support needs libexpat) GRASS Vector Format GRASS No Yes No, needs libgrass GPSTrackMaker (.gtm, .gtz) GPSTrackMaker Yes Yes Yes Hydrographic Transfer Format HTF No Yes Yes Idrisi Vector (.VCT) Idrisi No Yes Yes Informix DataBlade IDB Yes Yes No, needs Informix DataBlade INTERLIS "Interlis 1" and "Interlis 2" Yes Yes No, needs Xerces (INTERLIS model reading needs ili2c.jar) INGRES INGRES Yes No No, needs INGRESS KML KML Yes Yes Yes (read support needs libexpat) LIBKML LIBKML Yes Yes No, needs libkml Mapinfo File MapInfo File Yes Yes Yes Microstation DGN DGN Yes No Yes Access MDB (PGeo and Geomedia capable) MDB No Yes No, needs JDK/JRE Memory Memory Yes Yes Yes MySQL MySQL No Yes No, needs MySQL library NAS - ALKIS NAS No Yes No, needs Xerces Oracle Spatial OCI Yes Yes No, needs OCI library ODBC ODBC No Yes No, needs ODBC library MS SQL Spatial MSSQLSpatial Yes Yes No, needs ODBC library Open Document Spreadsheet ODS Yes No No, needs libexpat OGDI Vectors (VPF, VMAP, DCW) OGDI No Yes No, needs OGDI library OpenAir OpenAir No Yes Yes OpenStreetMap XML and PBF OSM No Yes No, needs libsqlite3 (and libexpat for OSM XML) PCI Geomatics Database File PCIDSK No No Yes, using internal PCIDSK SDK (from GDAL 1.7.0) Geospatial PDF PDF Yes Yes Yes (read supports need libpoppler or libpodofo support) PDS PDS No Yes Yes PostgreSQL SQL dump PGDump Yes Yes Yes PostgreSQL/PostGIS PostgreSQL/PostGIS Yes Yes No, needs PostgreSQL client library (libpq) EPIInfo .REC REC No No Yes S-57 (ENC) S57 No Yes Yes SDTS SDTS No Yes Yes SEG-P1 / UKOOA P1/90 SEGUKOOA No Yes Yes SEG-Y SEGY No No Yes Norwegian SOSI Standard SOSI No Yes No, needs FYBA library SQLite/SpatiaLite SQLite Yes Yes No, needs libsqlite3 or libspatialite SUA SUA No Yes Yes SVG SVG No Yes No, needs libexpat UK .NTF UK. NTF No Yes Yes U.S. Census TIGER/Line TIGER No Yes Yes VFK data VFK No Yes Yes VRT - Virtual Datasource VRT No Yes Yes OGC WFS (Web Feature Service) WFS Yes Yes No, needs libcurl MS Excel format XLS No No No, needs libfreexl MS Office Open XML spreadsheet XLSX Yes No No, needs libexpat X-Plane/Flightgear aeronautical data XPLANE No Yes Yes Walk Walk No Yes No, needs ODBC library voidCidentifyView::OnLayerDatasource() { // TODO: 在此添加命令处理程序代码 char *filePath = "D:\\Test\\SMO\\data\\SHP"; OGRRegisterAll(); OGRSFDriverRegistrar *pRegistrar =OGRSFDriverRegistrar::GetRegistrar(); int iCount = pRegistrar->GetDriverCount(); OGRSFDriver *pDriver0 = pRegistrar->GetDriver(0); const char *pName0 = pDriver0->GetName(); OGRSFDriver *pDriverShp =pRegistrar->GetDriverByName("ESRI Shapefile"); const char *pNameShp = pDriverShp->GetName(); char *cityPath ="D:\\Test\\SMO\\data\\SHP\\City_RR.shp"; OGRDataSource *pDSCity = pDriverShp->Open(cityPath,FALSE); OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE); int iOpenDS = pRegistrar->GetOpenDSCount();//无效? OGRDataSource *pDS = pRegistrar->GetOpenDS(0); const char* pName = pODS->GetName(); OGRSFDriver *pDriver = pODS->GetDriver(); } 见坐标详解与PROJ.4与OGR坐标操作使用说明.docx 见OGR样式模型.docx。 见GDAL_OGR实例操作.docx。 cpl_string.h/cpp:Common portable library string,通用接口库,字符串操作。 1) OGR帮助文档。 2) OGR入门,陈泰生,2008.08。2.1.2 投影坐标系统:将球面坐标投影到平面上,以平面的形式描述地球。
2.1.3 坐标参数查询与设置
2.1.3.1 坐标系统类型
2.1.3.2 地球椭球体模型参数
2.1.3.3 具体参数值
2.1.4 示例
2.2 坐标系统转换:OGRCoordinateTransformation
2.2.1 示例
3 OGR地图要素模型OGRFeature
3.1 OGRFeatureDefn
3.2 OGRFieldDef
3.3 OGRField
3.4 OGRStyleTable等样式类
3.4.1 参考
3.5 OGRFeature
3.5.1 属性操作
3.5.1.1 表结构操作
3.5.1.2 值操作
3.5.2 几何操作
3.5.3 元素操作
3.5.4 样式操作
3.5.5 中文汉字乱码的问题解决
3.5.5.1 原因
3.5.5.2 解决方式
3.5.5.3 参考
3.5.5.4 示例
3.6 示例
4 OGR地图组织模型OGRLayer/OGRDataSource/OGRDriver
4.1 OGRLayer
4.1.1 过滤查询
4.1.2 元素读取
4.1.3 图层属性
4.1.4 样式
4.1.5 事务
4.1.6 图层空间分析Overlay
4.1.7 示例
4.2 OGRDataSource
4.2.1 数据源
4.2.2 Layer
4.2.3 Style
4.2.4 Driver
4.3 文件格式驱动OGRSFDriver
4.3.1 OGRSFDriverRegistrar
4.3.1.1 Driver
4.3.1.2 DataSource
4.3.2 OGRSFDriver
4.3.3 OGR Vector Formats
4.4 示例
5 OGR坐标系统模型
6 OGR样式模型
7 实例操作
8 OGR实用工具
8.1 字符串
9 参考