?? ogr_api.cpp
字號:
/************************************************************************/
/* OGR_G_AddPoint() */
/************************************************************************/
/**
* Add a point to a geometry (line string or point).
*
* The vertex count of the line string is increased by one, and assigned from
* the passed location value.
*
* @param hGeom handle to the geometry to add a point to.
* @param dfX x coordinate of point to add.
* @param dfY y coordinate of point to add.
*/
void OGR_G_AddPoint_2D( OGRGeometryH hGeom,
double dfX, double dfY )
{
switch( wkbFlatten(((OGRGeometry *) hGeom)->getGeometryType()) )
{
case wkbPoint:
{
((OGRPoint *) hGeom)->setX( dfX );
((OGRPoint *) hGeom)->setY( dfY );
}
break;
case wkbLineString:
((OGRLineString *) hGeom)->addPoint( dfX, dfY );
break;
default:
CPLAssert( FALSE );
break;
}
}
/************************************************************************/
/* OGR_G_GetGeometryCount() */
/************************************************************************/
/**
* Fetch the number of elements in a geometry.
*
* @param hGeom geometry from which to get the number of elements.
* @return the number of elements.
*/
int OGR_G_GetGeometryCount( OGRGeometryH hGeom )
{
switch( wkbFlatten(((OGRGeometry *) hGeom)->getGeometryType()) )
{
case wkbPolygon:
if( ((OGRPolygon *)hGeom)->getExteriorRing() == NULL )
return 0;
else
return ((OGRPolygon *)hGeom)->getNumInteriorRings() + 1;
case wkbMultiPoint:
case wkbMultiLineString:
case wkbMultiPolygon:
case wkbGeometryCollection:
return ((OGRGeometryCollection *)hGeom)->getNumGeometries();
default:
return 0;
}
}
/************************************************************************/
/* OGR_G_GetGeometryRef() */
/************************************************************************/
/**
* Fetch geometry from a geometry container.
*
* This function returns an handle to a geometry within the container.
* The returned geometry remains owned by the container, and should not be
* modified. The handle is only valid untill the next change to the
* geometry container. Use OGR_G_Clone() to make a copy.
*
* This function relates to the SFCOM
* IGeometryCollection::get_Geometry() method.
*
* This function is the same as the CPP method
* OGRGeometryCollection::getGeometryRef().
*
* @param hGeom handle to the geometry container from which to get a
* geometry from.
* @param iSubGeom the index of the geometry to fetch, between 0 and
* getNumGeometries() - 1.
* @return handle to the requested geometry.
*/
OGRGeometryH OGR_G_GetGeometryRef( OGRGeometryH hGeom, int iSubGeom )
{
switch( wkbFlatten(((OGRGeometry *) hGeom)->getGeometryType()) )
{
case wkbPolygon:
if( iSubGeom == 0 )
return (OGRGeometryH)
((OGRPolygon *)hGeom)->getExteriorRing();
else
return (OGRGeometryH)
((OGRPolygon *)hGeom)->getInteriorRing(iSubGeom-1);
case wkbMultiPoint:
case wkbMultiLineString:
case wkbMultiPolygon:
case wkbGeometryCollection:
return (OGRGeometryH)
((OGRGeometryCollection *)hGeom)->getGeometryRef( iSubGeom );
default:
return 0;
}
}
/************************************************************************/
/* OGR_G_AddGeometry() */
/************************************************************************/
/**
* Add a geometry to a geometry container.
*
* Some subclasses of OGRGeometryCollection restrict the types of geometry
* that can be added, and may return an error. The passed geometry is cloned
* to make an internal copy.
*
* There is no SFCOM analog to this method.
*
* This function is the same as the CPP method
* OGRGeometryCollection::addGeometry.
*
* @param hGeom existing geometry container.
* @param hNewSubGeom geometry to add to the container.
*
* @return OGRERR_NONE if successful, or OGRERR_UNSUPPORTED_GEOMETRY_TYPE if
* the geometry type is illegal for the type of existing geometry.
*/
OGRErr OGR_G_AddGeometry( OGRGeometryH hGeom, OGRGeometryH hNewSubGeom )
{
switch( wkbFlatten(((OGRGeometry *) hGeom)->getGeometryType()) )
{
case wkbPolygon:
{
OGRLinearRing *poRing = (OGRLinearRing *) hNewSubGeom;
if( poRing->WkbSize() != 0
|| wkbFlatten(poRing->getGeometryType()) != wkbLineString )
return OGRERR_UNSUPPORTED_GEOMETRY_TYPE;
else
{
((OGRPolygon *)hGeom)->addRing( poRing );
return OGRERR_NONE;
}
}
case wkbMultiPoint:
case wkbMultiLineString:
case wkbMultiPolygon:
case wkbGeometryCollection:
return ((OGRGeometryCollection *)hGeom)->addGeometry(
(OGRGeometry *) hNewSubGeom );
default:
return OGRERR_UNSUPPORTED_OPERATION;
}
}
/************************************************************************/
/* OGR_G_AddGeometryDirectly() */
/************************************************************************/
/**
* Add a geometry directly to an existing geometry container.
*
* Some subclasses of OGRGeometryCollection restrict the types of geometry
* that can be added, and may return an error. Ownership of the passed
* geometry is taken by the container rather than cloning as addGeometry()
* does.
*
* This function is the same as the CPP method
* OGRGeometryCollection::addGeometryDirectly.
*
* There is no SFCOM analog to this method.
*
* @param hGeom existing geometry.
* @param hNewSubGeom geometry to add to the existing geometry.
*
* @return OGRERR_NONE if successful, or OGRERR_UNSUPPORTED_GEOMETRY_TYPE if
* the geometry type is illegal for the type of geometry container.
*/
OGRErr OGR_G_AddGeometryDirectly( OGRGeometryH hGeom,
OGRGeometryH hNewSubGeom )
{
switch( wkbFlatten(((OGRGeometry *) hGeom)->getGeometryType()) )
{
case wkbPolygon:
{
OGRLinearRing *poRing = (OGRLinearRing *) hNewSubGeom;
if( poRing->WkbSize() != 0
|| wkbFlatten(poRing->getGeometryType()) != wkbLineString )
return OGRERR_UNSUPPORTED_GEOMETRY_TYPE;
else
{
((OGRPolygon *)hGeom)->addRingDirectly( poRing );
return OGRERR_NONE;
}
}
case wkbMultiPoint:
case wkbMultiLineString:
case wkbMultiPolygon:
case wkbGeometryCollection:
return ((OGRGeometryCollection *)hGeom)->addGeometryDirectly(
(OGRGeometry *) hNewSubGeom );
default:
return OGRERR_UNSUPPORTED_OPERATION;
}
}
/************************************************************************/
/* OGR_G_RemoveGeometry() */
/************************************************************************/
/**
* Remove a geometry from an exiting geometry container.
*
* Removing a geometry will cause the geometry count to drop by one, and all
* "higher" geometries will shuffle down one in index.
*
* There is no SFCOM analog to this method.
*
* This function is the same as the CPP method
* OGRGeometryCollection::removeGeometry().
*
* @param hGeom the existing geometry to delete from.
* @param iGeom the index of the geometry to delete. A value of -1 is a
* special flag meaning that all geometries should be removed.
*
* @param bDelete if TRUE the geometry will be destroyed, otherwise it will
* not. The default is TRUE as the existing geometry is considered to own the
* geometries in it.
*
* @return OGRERR_NONE if successful, or OGRERR_FAILURE if the index is
* out of range.
*/
OGRErr OGR_G_RemoveGeometry( OGRGeometryH hGeom, int iGeom, int bDelete )
{
switch( wkbFlatten(((OGRGeometry *) hGeom)->getGeometryType()) )
{
case wkbPolygon:
{
CPLError( CE_Failure, CPLE_AppDefined,
"OGR_G_RemoveGeometry() not supported on polygons yet." );
return OGRERR_UNSUPPORTED_OPERATION;
}
case wkbMultiPoint:
case wkbMultiLineString:
case wkbMultiPolygon:
case wkbGeometryCollection:
return ((OGRGeometryCollection *)hGeom)->removeGeometry( iGeom,bDelete);
default:
return OGRERR_UNSUPPORTED_OPERATION;
}
}
/************************************************************************/
/* OGR_G_GetArea() */
/************************************************************************/
/**
* Compute geometry area.
*
* Computes the area for an OGRLinearRing, OGRPolygon or OGRMultiPolygon.
* Undefined for all other geometry types (returns zero).
*
* This function utilizes the C++ get_Area() methods such as
* OGRPolygon::get_Area().
*
* @param hGeom the geometry to operate on.
* @return the area or 0.0 for unsupported geometry types.
*/
double OGR_G_GetArea( OGRGeometryH hGeom )
{
double fArea = 0.0;
switch( wkbFlatten(((OGRGeometry *) hGeom)->getGeometryType()) )
{
case wkbPolygon:
fArea = ((OGRPolygon *) hGeom)->get_Area();
break;
case wkbMultiPolygon:
fArea = ((OGRMultiPolygon *) hGeom)->get_Area();
break;
case wkbLinearRing:
case wkbLineString:
/* This test below is required to filter out wkbLineString geometries
* not being of type of wkbLinearRing.
*/
if( EQUAL( ((OGRGeometry*) hGeom)->getGeometryName(), "LINEARRING" ) )
{
fArea = ((OGRLinearRing *) hGeom)->get_Area();
}
break;
default:
CPLError( CE_Warning, CPLE_AppDefined,
"OGR_G_GetArea() called against non-surface geometry type." );
fArea = 0.0;
}
return fArea;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -