[fdo-users] How to Create Spatial Filter

Gavin Cramer gavin.cramer at autodesk.com
Thu Oct 2 13:31:40 EDT 2008


The unit tests are a good source of working example code.  It is mostly unmanaged C++, but the concepts and most classes/methods have virtually the same names.  Here is a snippet:

SpatialFilterTests::runSpatialQuery( FdoString* class_name, FdoSpatialOperations spOp, FdoIPolygon* poly)
{
    int count = 0;

    try
    {
        FdoPtr<FdoISelect> select = (FdoISelect*)mConnection->CreateCommand(FdoCommandType_Select);

        select->SetFeatureClassName( class_name );

        FdoPtr<FdoFgfGeometryFactory> gf = FdoFgfGeometryFactory::GetInstance();

        FdoPtr<FdoByteArray> polyfgf = gf->GetFgf(poly);
        FdoPtr<FdoGeometryValue> gv = FdoGeometryValue::Create(polyfgf);

        FdoPtr<FdoSpatialCondition> filter = FdoSpatialCondition::Create(L"Geometry", spOp, gv);

        select->SetFilter(filter);

        FdoPtr<FdoIFeatureReader> reader = select->Execute();

        while (reader->ReadNext())
        {
...


Have you tried a simple rectangle or other polygon instead of a circle?  SHP as a datastore does not support circular arcs.  I am not sure whether the spatial filtering does, but using regular Polygon instead of a CurvePolygon would be a good way to rule that out as a factor.

Gavin


-----Original Message-----
From: fdo-users-bounces at lists.osgeo.org [mailto:fdo-users-bounces at lists.osgeo.org] On Behalf Of surrounded
Sent: Thursday, October 02, 2008 1:21 PM
To: fdo-users at lists.osgeo.org
Subject: [fdo-users] How to Create Spatial Filter


I am trying to create a filter that will allow me to intersect a circle
geometry with a shapefile layer, returning only the features from the
shapefile that meet the intersection criteria.  The following code does not
produce errors, BUT the reader object has no values in it.  PLEASE LET ME
KNOW WHERE MY LOGIC IS WRONG OR IF YOU HAVE AN EXAMPLE SPATIAL QUERY THAT I
COULD TWEAK TO WORK FOR MY NEEDS.    THANKS .....


//CREATE CIRCLE GEOMETRY
FgfGeometryFactory gFac = new FgfGeometryFactory();
IDirectPosition startPos = gFac.CreatePositionXY(longitude - 1.0, latitude);
IDirectPosition midPos = gFac.CreatePositionXY(longitude, latitude + 1.0);
IDirectPosition endPos = gFac.CreatePositionXY(longitude - 1.0, latitude);
ICircularArcSegment pCircleSegs = gFac.CreateCircularArcSegment(startPos,
midPos, endPos);
CurveSegmentCollection pCSC = new CurveSegmentCollection();
pCSC.Add(pCircleSegs);
IRing pRing = gFac.CreateRing(pCSC);
RingCollection pRC = new RingCollection();
pRC.Add(pRing);
ICurvePolygon pCPoly = gFac.CreateCurvePolygon(pRing, pRC);
//IEnvelope pEnv = pCPoly.Envelope;
IGeometry pGeom = gFac.CreateGeometry(pCPoly);

//CONVERT GEOMETRY INTO BYTE ARRAY TO CREATE FILTER
byte[] pByte = gFac.GetFgf(pGeom);
OSGeo.FDO.Expression.GeometryValue pGVal = new GeometryValue(pByte);

//BUILD THE SPATIAL FILTER
OSGeo.FDO.Expression.Identifier pPropName = new Identifier("Geometry");
IdentifierCollection pIDColl = sel.PropertyNames;
pIDColl.Add(pPropName);
OSGeo.FDO.Filter.Filter pPtLineFilter = new
OSGeo.FDO.Filter.SpatialCondition(pPropName,
OSGeo.FDO.Filter.SpatialOperations.SpatialOperations_Inside, pGVal);

OSGeo.FDO.Commands.Feature.IFeatureReader reader = sel.Execute();
while (reader.ReadNext())
{
    ....CODE....
}
--
View this message in context: http://n2.nabble.com/How-to-Create-Spatial-Filter-tp1134432p1134432.html
Sent from the FDO Users mailing list archive at Nabble.com.

_______________________________________________
fdo-users mailing list
fdo-users at lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/fdo-users


More information about the fdo-users mailing list