[Gdal-dev] Re: how to extract data from OGR

Jacob Bensabat jbensabat at ewre.com
Thu May 13 11:38:47 EDT 2004


Hi and thanks a lot for your help
Indeed I work using C++ instead of C. Please indicate if there are major
issues that I should be aware
of (so I can start on the right foot), sample code using c++ would be great.
Also could you show how I can querry for PENS, BRUSHES, patterns etc.
Sorry to bother, but while the lib. looks exciting, the learning curve is
really steep.
thanks again
jac.

----- Original Message ----- 
From: "Frank Warmerdam" <warmerdam at pobox.com>
Newsgroups: gmane.comp.gis.gdal.devel
Sent: Thursday, May 13, 2004 4:25 PM
Subject: Re: how to extract data from OGR


> Jacob Bensabat wrote:
> > Hello
> > I have started to use gdal and OGR and I have the following question,
> > I am loading a mapinfo map into a OGR structure, and I would like to be
> > able to access all its components (lines, polygon, points ).
> > The problem is that except functions like DumpReadable, I do not see any
> > public method in the code
> > that allows access to the data.
> >
> > Am I missing something ? Is there a way to get to the data ?
> > an example (s) or pointer to examples would be very welcome.
> > thanks
>
> Jac,
>
> You don't mention if you are using the C or C++ API to accomplish this.  I
am
> attaching example C code which converts an OGRGeometry into another form.
It
> may be instructive as an example.
>
> Things work somewhat similarly in C++.  Basically you need to fetch the
> geometry object from the feature (OGRFeature::GetGeometryRef()), inspect
the
> type and then cast it to a pointer of the appropriate geometry type.  This
> downcast pointer can then be used to interrogate information about the
> geometry.  Many geometries (ie. polygon and the collections) are made of
> other geometry objects which need to be fetched and queried.
>
> Good luck,
>
> -- 
> ---------------------------------------+----------------------------------
----
> I set the clouds in motion - turn up   | Frank Warmerdam,
warmerdam at pobox.com
> light and sound - activate the windows | http://pobox.com/~warmerdam
> and watch the world go round - Rush    | Geospatial Programmer for Rent
>
> /************************************************************************/
> /*                      ogr_geometry_to_gv_shape()                      */
> /************************************************************************/
>
> static GvShape *ogr_geometry_to_gv_shape( OGRGeometryH hGeom )
>
> {
>      GvShape *gv_shape = NULL;
>      OGRwkbGeometryType eType;
>
>      if( hGeom == NULL )
>      {
>          // Use collection - which can be empty - to represent a
geometryless
>          // feature.
>
>          return gv_shape_new( GVSHAPE_COLLECTION );
>      }
>
>      eType = wkbFlatten(OGR_G_GetGeometryType(hGeom));
>
>      if( eType == wkbPoint )
>      {
>          gv_shape = gv_shape_new( GVSHAPE_POINT );
>          gv_shape_set_xyz( gv_shape, 0, 0,
>                            OGR_G_GetX( hGeom, 0 ),
>                            OGR_G_GetY( hGeom, 0 ),
>                            OGR_G_GetZ( hGeom, 0 ) );
>      }
>
>      else if( eType == wkbLineString )
>      {
>          int    node, count = OGR_G_GetPointCount(hGeom);
>
>          gv_shape = gv_shape_new( GVSHAPE_LINE );
>          for( node = count-1; node >= 0; node-- )
>              gv_shape_set_xyz( gv_shape, 0, node,
>                                OGR_G_GetX( hGeom, node ),
>                                OGR_G_GetY( hGeom, node ),
>                                OGR_G_GetZ( hGeom, node ) );
>      }
>
>      else if( eType == wkbPolygon )
>      {
>          OGRGeometryH hRing;
>          int        iRing = 0, nRingCount = OGR_G_GetGeometryCount(
hGeom );
>
>          gv_shape = gv_shape_new( GVSHAPE_AREA );
>
>          for( iRing = 0; iRing < nRingCount; iRing++ )
>          {
>              int node;
>              int vert_count = _getGeoPtCount( hGeom, iRing, &hRing );
>
>              //hRing      = OGR_G_GetGeometryRef( hGeom, iRing );
>              //vert_count = OGR_G_GetPointCount(hRing);
>
>              for( node = vert_count - 1; node >= 0; node-- )
>                  gv_shape_set_xyz( gv_shape, iRing, node,
>                                    OGR_G_GetX( hRing, node ),
>                                    OGR_G_GetY( hRing, node ),
>                                    OGR_G_GetZ( hRing, node ) );
>          }
>      }
>
>      else if( eType == wkbMultiPolygon )
>      {
>          int iPoly, nShapeRing = 0;
>
>          gv_shape = gv_shape_new( GVSHAPE_AREA );
>
>          for( iPoly = 0; iPoly < OGR_G_GetGeometryCount( hGeom );
iPoly++ )
>          {
>              //OGRGeometryH hPoly, hRing;
>              OGRGeometryH hPoly;
>              int         iRing, nRingCount;
>
>              hPoly      = OGR_G_GetGeometryRef( hGeom, iPoly );
>              nRingCount = OGR_G_GetGeometryCount( hPoly );
>
>              for( iRing = 0; iRing < nRingCount; iRing++ )
>              {
>                  OGRGeometryH hRing;
>                  int vert_count = _getGeoPtCount( hPoly, iRing, &hRing );
>                  int node;
>
>                  //hRing      = OGR_G_GetGeometryRef( hPoly, iRing );
>                  //vert_count = OGR_G_GetPointCount(hRing);
>
>                  for( node = vert_count - 1; node >= 0; node-- )
>                      gv_shape_set_xyz( gv_shape, nShapeRing, node,
>                                       OGR_G_GetX( hRing, node ),
>                                       OGR_G_GetY( hRing, node ),
>                                       OGR_G_GetZ( hRing, node ) );
>                  nShapeRing++;
>              }
>          }
>      }
>
>      else if( eType == wkbGeometryCollection
>               || eType == wkbMultiLineString
>               || eType == wkbMultiPoint )
>      {
>          int         iGeom, nGeomCount;
>
>          nGeomCount = OGR_G_GetGeometryCount( hGeom );
>
>          gv_shape = gv_shape_new( GVSHAPE_COLLECTION );
>
>          for( iGeom = 0; iGeom < nGeomCount; iGeom++ )
>          {
>              OGRGeometryH hSubGeom = OGR_G_GetGeometryRef( hGeom, iGeom );
>              GvShape *sub_shape;
>
>              sub_shape = ogr_geometry_to_gv_shape( hSubGeom );
>              gv_shape_collection_add_shape( gv_shape, sub_shape );
>          }
>      }
>
>      return gv_shape;
> }



More information about the Gdal-dev mailing list