zoukankan      html  css  js  c++  java
  • 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! "));

          }

    }

    2 OGR空间参考模型:OGRSpatialReference、OGRCoordinateTransformation

    目的:设置投影和大地参考(DATUM)。

    方法:

    2.1 坐标系统:OGRSpatialReference

    2.1.1 地理坐标系统:用于描地球的球面模型。包含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."<<baCrs;

        }

    2.1.2 投影坐标系统:将球面坐标投影到平面上,以平面的形式描述地球。

    依赖地理坐标系统。因此需要设置地理坐标系统。

    注意:顺序设置投影系统。1.创建投影。2.设置相关地理坐标。3.设置投影。

    1)   设置命名或编号坐标系统:importFromEPSG(),importFromProj4()等。

    2)   设置常用投影坐标系统:SetUTM()/SetTM()/SetLC()。

    3)   自定义投影系统名称(仅命名):SetProjCS()。

    2.1.3 坐标参数查询与设置

    2.1.3.1  坐标系统类型

    isProected():判断是否为投影坐标系统。

    isGeographic():判断是否为地理坐标系统。

    2.1.3.2  地球椭球体模型参数

    GetSemiMajor():长半轴。

    GetSemiMinor():短半轴。

    GetInvFlattening():扁率的倒数。

    2.1.3.3  具体参数值

    GetAttrValue():参数值。

    GetProjParm():投影参数值,可以使用预定义的宏进行获取。

    GetLinearUnits():类型,与M的转换单位。

    2.1.4 示例

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

    }

    2.2 坐标系统转换:OGRCoordinateTransformation

    目标:将点进行坐标系统转换。

    方法:

    创建坐标转换对象:OGRCreateCoordinateTransformation()。

    转换坐标系统:OGRCoordinateTransformation::Transform()。

    注意:如果使用了系统未定义的DATUM,有可能导致错误,使用时注意检查。

    参考:http://www.gdal.org/osr_tutorial.html

    2.2.1 示例

    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

    }

    3 OGR地图要素模型OGRFeature

    要素,包含属性和地图几何图元。一般用于操作空间和属性的联动。

    主要由属性OGRField、OGRFeatureDefn和几何图元OGRGeometry组成。由nFID唯一标识。

    3.1 OGRFeatureDefn

    属性表定义类。

    用于存取属性表的结构,以及几何图形的元数据。

    GetName():获取属性表结构名称,默认是图层名称。

    GetFieldCount():获取列数目。

    GetFieldDefn():获取列定义。

    GetFieldIndex():获取列索引。

    AddFieldDefn():添加列定义。

    DeleteFiledDefn():删除列定义。

    RecorderFieldDefn():保存属性表定义。只有无相关OGRFeature存在时才可使用,如果有,则使用OGR_L_RecorderFields()。

    GetGeomType():获取几何图形类型。

    SetGeomType():设置几何图形类型。

    Clone():复制。

    Release():释放。

    IsGeometryIgnored():判断是否可以忽略几何图形。

    SetGeometryIgnored():设置是否可以忽略几何图形。

    IsStyleIgnored():判断是否可以忽略样式。

    SetStyleIgnored():设置是否可以忽略样式。

    IsSame():判断相同。

    3.2 OGRFieldDef

    用于定义字段的属性。包含精度、类型、名称等。

    SetName():设置名称。

    GetNameRef():获取名称。

    GetType():读取类型。

    SetType():设置类型。

    GetJustify():读取对齐方式。

    SetJustify():设置对齐方式。

    GetWidth()/SetWidth():存取宽度。

    GetPricision()/SetPricision():存取精度。

    Set():一次性设置。

    SetDefault():设置默认值。

    GetDefault():读取默认值。

    IsIgnored():判断是否可忽略。

    SetIgnored():设置是否可忽略。

    IsSame():判断相同。

    3.3 OGRField

    元素。是一个集合。用于标识要素内部某一个元素的值。

    3.4 OGRStyleTable等样式类

    主要用于管理样式。

    OGRSytleTable:样式表类,样式中的所有具体内容。

    OGRStyleMgr:样式管理器,使用时要先用样式表生成此类。

    OGRStyleTool:由样式管理器进行管理,用于操作具体的样式。

    OGRStylePen:具体画笔样式。(OGRStyleTool派生)

    OGRStyleBrush:具体的画刷样式。(OGRStyleTool派生)

    OGRStyleLabel:具体的标签样式。(OGRStyleTool派生)

    OGRStyleSymbol:具体的符号样式。(OGRStyleTool派生)

    3.4.1 参考

    http://blog.csdn.net/zhouschina/article/details/8668667

    3.5 OGRFeature

    3.5.1 属性操作

    3.5.1.1  表结构操作

    GetDefnRef():获取元素的表结构定义OGRFeatureDefn。

    DumpReadable():导出为TXT文件。

    setFrom():从另一个Feature导入属性和几何元素。

    setFieldsFrom():从另一个Feature导入属性数据。

    RemapFields():重新排列属性。

    3.5.1.2  值操作

    GetFieldCount():数目。

    GetFieldIndex():索引号。

    isFiledSet():判断是否已经设置。

    UnsetField():置空。

    GetRawFiled():获取OGRField类型的值。

    GetFiled*():按照不同的类型获取值。

    SetFiled():设置属性值。

    GetFID()/SetFID():FID存取。

    3.5.2 几何操作

    SetGeometry():设置几何图形。

    SetGeometryDirectly():直接添加。与StealGeometry()相反。

    StealGeometry():与SetGeometryDirectly()相反,直接取出。

    GetGeometryRef():

    3.5.3 元素操作

    Clone():复制。

    Equal():判断相同。

    CreateFeature():创建,static。

    DestroyFeature():销毁,static。在GetNextFeature()等 函数中会返回一个复制对象,供调用者使用,使用完成之后应释放。但是由于Windows的DLL机制,DLL与主程序之间使用不同的堆,使用主程序释放DLL堆内容会报错,所有会才此函数来保证兼容性。

    3.5.4 样式操作

    GetStyleString():读取样式字符串。

    SetStyleString():设置样式字符串。

    SetStyleStringDirectly():直接设置。

    GetStyleTable():读取样式表。

    SetStyleTable():设置样式表。

    SetStyleTableDirectly():直接设置样式表。

    3.5.5 中文汉字乱码的问题解决

    3.5.5.1  原因

    GDAL/OGR默认使用UTF-8进行编码,Shape默认使用ANSI(可以设置为UTF-8,但不能识别UNICODE)。读入Shape时,只能以ANSI方式读入。如果Shape是以UTF-8类型编码的话,会造成乱码。

    3.5.5.2  解决方式

    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)。

    3.5.5.3  参考

    http://blog.csdn.net/liminlu0314/article/details/7330036

    3.5.5.4  示例

    //设置图层的编码格式

          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<nFieldCount;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);

               }

          }

    }

    3.6 示例

    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");

    }

    4 OGR地图组织模型OGRLayer/OGRDataSource/OGRDriver

    4.1 OGRLayer

    相同元素的集合。

    注意,在编译元素的时候,一定要在Open时,将bUpdate开关设置为TRUE。

    4.1.1 过滤查询

    GetSpatialFilter()/SetSpatialFilter():读取/设置空间过滤几何对象。再下次查询时会进行空间过滤。

    SetSpatialFilterRect():设置空间过滤为指定的矩形。当年版本的OGR有BUG,只能使用过滤图形的外接矩形与图层中图形的外接矩形进行分析。使用OGRGeometry的Intersects()函数,在GEOS库下可以进行具体操作。

    SetAttributeFilter():设置属性过滤条件。格式为SQL Where:NAME = ‘dd’。

    注意:OGR使用SQLITE进行查询,SQLITE使用UTF8格式,所以查询的时候应该转化为UTF8格式,虽然看上去是乱码,但是SQLITE可以识别。查询结果是正确的。

    4.1.2 元素读取

    ResetReading():重置读取。

    GetNextFeature():获取下个元素。

    SetNextByIndex():获取指定的元素。

    GetFeature():按FID读取元素。注意,读取元素后,生成元素副本(使用完成后一定要释放),并不是当前图层要元素,如果要进行修改,则应该将修改后的内容使用SetFeature()设置原有元素(无法生成新元素,只能修改原有元素,使用CreateFeature()生成新元素)。

    SetFeature():设置元素。

    CreateFeature():生成元素,如果要生成新的元素,请使用此函数。

    DeleteFeature():删除元素。

    GetFeatureCount():获取元素数量。

    GetFeaturesRead():

    4.1.3 图层属性

    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():?

    4.1.4 样式

    GetStyleTable():样式表。返回值为只读,不可修改,不可释放。

    SetStyleTable():设置样式表。

    SetStyleTableDirectly():直接设置样式表。

    4.1.5 事务

    StartTransaction():开始。

    CommitTransaction():提交。

    RollbackTransaction():回滚。

    4.1.6 图层空间分析Overlay

    Intersection():交(图层合并)。

    Union():并。

    SymDifference():和-交。

    Identify():交的补。

    Update():并-》合并。

    Clip():交(仅输入图层)。

    Erase():删除。

    图层叠迭操作会使用两个图层进行进行叠迭分析,将相关连的图形按照不同的操作方法生成一个结果图层。

    注意:坐标系统很重要!

    1)   进行叠迭分析时,要注意操作的两个图层要有相同的空间参考。这里有个要注意的地方就是常用的WGS84坐标系。因为ESPG4326和WGS84其它是一个坐标系统,但是如果不明确指定ESPG4326的话DATUM有稍许的不同(DATUM的单位精确度不同),所有虽然都是WGS84,但是操作时却被认为是不同的空间参考(ARCGIS具有同样的操作问题)。所有在使用前应该将坐标系统一(使用PROJECT可以进行转换)。

    2)   如果操作时坐标系统相同,仅是名称不同,在操作时会给出警告(ARCGIS会提示,OGR不会提示),但不会出错,仍然可以得到正确的结果。

    示例

    #include<ogrsf_frmts.h>

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

    }

    4.1.7 示例

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

          }

          GIntBig biNum = pLayerCity->GetFeaturesRead();

          OGRGeometry *pGeo = pLayerCity->GetSpatialFilter();

    }

    4.2 OGRDataSource

    数据源。图层的容器。当数据源销毁时,其相关的图层也会释放。

    4.2.1 数据源

    GetName():数据源名称。

    TestCapability():测试功能。

    ExecuteSQL():Sqlite数据SQL数据功能。

    ReleaseResultSet():释放SQL查询结果。

    SyncToDisk():写入硬盘。

    DestoryDataSource():释放对象。将会销毁所有依赖的图层。

    4.2.2 Layer

    GetLayerCount():数目。

    GetLayer():图层。

    GetLayerByName():图层。

    DeleteLayer():删除图层。

    CreateLayer():创建图层。

    CopyLayer():复制图层。

    4.2.3 Style

    GetStyleTable():样式表。

    SetStyleTable():设置。

    SetStyleTableDirectly():直接设置。

    4.2.4 Driver

    GetDriver():获取。

    SetDriver():调协。

    4.3 文件格式驱动OGRSFDriver

    用于支持对不同类型的文件的操作。

    使用OGRSFDriver操作文件,在操作之前要使用OGRSFDriverRegister进行注册。

    4.3.1 OGRSFDriverRegistrar

    管理OGR对文件格式的支持。只有注册过的文件格式才能使用驱动操作。单例。不要使用此类进行派生。

    为了使用所有可以支持的数据格式(即使有些用不到,OGR还是会在内部维护支持的数据格式列表),通常使用OGRRegisterAll():注册所有支持的类型。

    OGR支持的文件格式类型参见4.3.3。

    4.3.1.1  Driver

    OpenShared():按名称打开数据源的驱动。

    RegisterDriver():注册驱动。

    DeregisterDriver():反注册驱动。

    GetDriverCount():获取驱动数目。

    GetDriver():获取驱动。

    GetDriverByName():获取驱动。

    AutoLoadDrivers():自动搜索库文件,加载驱动。

    GetRegistrar():返回本类实例。如果没有,则新建。Static。

    4.3.1.2  DataSource

    GetOpenDSCount():打开的数据源数目。??????

    GetOpenDS():获取数据源。

    ReleaseDataSource():释放数据源。

    Open():打开数据源,Static。通常用来快速打开数据源(不关心驱动的情况下)。如果bUpdate设置为TRUE,可以进行编辑,如果为FALSE,则只读。

    4.3.2 OGRSFDriver

    驱动类。支持对特定文件格式的操作。

    GetName():名称。

    Open():打开数据源。

    TestCapability():测试功能。

    CreateDataSource():创建数据源。

    DeleteDataSource():删除数据源。

    CopyDataSource():复制数据源。

    4.3.3 OGR Vector Formats

    http://www.gdal.org/ogr/ogr_formats.html

    4.4 示例  

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

         

    }

    5  OGR坐标系统模型

    坐标详解与PROJ.4与OGR坐标操作使用说明.docx

    6  OGR样式模型

    OGR样式模型.docx

    7  实例操作

    GDAL_OGR实例操作.docx

    8  OGR实用工具

    8.1 字符串

    cpl_string.h/cpp:Common portable library string,通用接口库,字符串操作。

  • 相关阅读:
    easyUI combobox下拉框很长,easyUI combobox下拉框如何显示滚动条的解决方法
    一步步实现 easyui datagrid表格宽度自适应,效果非常好
    javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较
    javascript数据结构与算法--二叉树遍历(后序)
    javascript数据结构与算法--二叉树遍历(先序)
    javascript数据结构与算法--二叉树遍历(中序)
    javascript数据结构与算法--二叉树(插入节点、生成二叉树)
    散列表,散列函数,碰撞处理解决:线性探测法
    thinkphp5 Windows下用Composer引入官方GitHub扩展包
    thinkphp5.0开发规范
  • 原文地址:https://www.cnblogs.com/vito13/p/7760647.html
Copyright © 2011-2022 走看看