IGeometry decorator object.
Inheritance: IFdoGeometry
Ejemplo n.º 1
0
 /// <summary>
 /// Converts an FDO Geometry to a SharpMap geometry
 /// </summary>
 /// <param name="geom">The FDO geometry</param>
 /// <returns></returns>
 public static Sm.Geometry FromFdoGeometry(FdoGeometry geom, OSGeo.FDO.Geometry.FgfGeometryFactory geomFactory)
 {
     if (FdoGeometryUtil.Is2D(geom.InternalInstance))
     {
         //Get the WKB form of the geometry
         byte[] wkb = FdoGeometryFactory.Instance.GetWkb(geom.InternalInstance);
         return GeometryFromWKB.Parse(wkb);
     }
     else
     {
         using (OSGeo.FDO.Geometry.IGeometry flattened = FdoGeometryUtil.Flatten(geom.InternalInstance, geomFactory))
         {
             //Get the WKB form of the geometry
             byte[] wkb = FdoGeometryFactory.Instance.GetWkb(flattened);
             return GeometryFromWKB.Parse(wkb);
         }
     }
 }
        void DoWork(object sender, DoWorkEventArgs e)
        {
            IFdoReader reader = null;
            using (FdoFeatureService service = _connection.CreateFeatureService())
            {
                try
                {
                    if (e.Argument is FeatureAggregateOptions)
                    {
                        reader = service.SelectAggregates((FeatureAggregateOptions)e.Argument);
                    }
                    else if (e.Argument is StandardQuery)
                    {
                        var stdArg = (e.Argument as StandardQuery);
                        reader = service.SelectFeatures(stdArg.query, stdArg.Limit, stdArg.UseExtendedSelect);
                    }
                    else if (e.Argument is string)
                    {
                        reader = service.ExecuteSQLQuery(e.Argument.ToString());
                    }

                    //Init the data grid view
                    FdoFeatureTable table = new FdoFeatureTable();

                    table.RequestSpatialContext += delegate(object o, string name)
                    {
                        SpatialContextInfo c = service.GetSpatialContext(name);
                        if (c != null)
                            table.AddSpatialContext(c);
                    };

                    ClassDefinition clsDef = null;
                    bool hasJoins = false;
                    if (e.Argument is StandardQuery)
                    {
                        var qry = ((StandardQuery)e.Argument).query;
                        clsDef = service.GetClassByName(qry.ClassName); //TODO: Should really qualify this, but our input parameters do not specify a schema
                        hasJoins = qry.JoinCriteria.Count > 0;
                    }
                    table.InitTable(reader, clsDef, hasJoins);

                    // need to store object class defn outside loop
                    ClassDefinition classDefObject = null;
                    ClassDefinition classDefAssoc = null;

                    while (reader.ReadNext() && !_queryWorker.CancellationPending)
                    {
                        //Pass processed feature to data grid view
                        FdoFeature feat = table.NewRow();
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            string name = reader.GetName(i);
                            if (!reader.IsNull(name))
                            {
                                FdoPropertyType pt = reader.GetFdoPropertyType(name);

                                switch (pt)
                                {
                                    case FdoPropertyType.Association:
                                        // TODO: how to handle for non-StandardQuery
                                        if (e.Argument is StandardQuery)
                                        {
                                            // because the original code used an iterator over the reader.FieldCount
                                            // it is a bit of a hack to get another definition of the class and check
                                            // we are at the right property with a name comparison
                                            // TODO: code review to see if this can be implemented better
                                            FdoFeatureReader readerFeature = (FdoFeatureReader)reader;
                                            ClassDefinition classDef = readerFeature.GetClassDefinition();

                                            foreach (PropertyDefinition propertyDef in classDef.Properties)
                                            {
                                                // only looking for the right association
                                                if ( (PropertyType.PropertyType_AssociationProperty == propertyDef.PropertyType)
                                                    && (propertyDef.Name.Equals(name)) )
                                                {
                                                    AssociationPropertyDefinition assocProp = (AssociationPropertyDefinition)propertyDef;
                                                    ClassDefinition classAssoc = assocProp.AssociatedClass;

                                                    // get a reader from the association - nice!
                                                    IFeatureReader readerAssoc = readerFeature.GetFeatureObject(name);
                                                    if ((null != readerAssoc) && (readerAssoc.ReadNext()))
                                                    {
                                                        // TODO: this should be an iterative function

                                                        // the simple reassignment on each instance fails
                                                        //  (classDefObject.Properties is always zero after first record)
                                                        //  so have set classDefObject higher-up and re-use/
                                                        //   - problem will occur if more than one association
                                                        // ClassDefinition classDefObject = readerObject.GetClassDefinition();
                                                        if (null == classDefAssoc)
                                                            classDefAssoc = readerAssoc.GetClassDefinition();

                                                        foreach (PropertyDefinition propertyDefAssoc in classDefAssoc.Properties)
                                                        {
                                                            String nameAssoc = propertyDefAssoc.Name;

                                                            // TODO: only "data" type handled at present
                                                            if (PropertyType.PropertyType_DataProperty == propertyDefAssoc.PropertyType)
                                                            {
                                                                DataPropertyDefinition datapropertyDefAssoc = (DataPropertyDefinition)propertyDefAssoc;

                                                                String szFullName = name + "." + nameAssoc;
                                                                DataType ptAssoc = datapropertyDefAssoc.DataType;
                                                                // TODO: handle all types
                                                                switch (ptAssoc)
                                                                {
                                                                    case DataType.DataType_String:
                                                                        feat[szFullName] = readerAssoc.GetString(nameAssoc);
                                                                    break;

                                                                    case DataType.DataType_Int16:
                                                                        feat[szFullName] = readerAssoc.GetInt16(nameAssoc);
                                                                    break;

                                                                    case DataType.DataType_Int32:
                                                                        feat[szFullName] = readerAssoc.GetInt32(nameAssoc);
                                                                    break;

                                                                    case DataType.DataType_Int64:
                                                                        feat[szFullName] = readerAssoc.GetInt64(nameAssoc);
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                        readerAssoc.Close();
                                                    }
                                                }
                                            }
                                        }
                                    break;

                                    case FdoPropertyType.BLOB:
                                        feat[name] = reader.GetLOB(name).Data;
                                        break;
                                    case FdoPropertyType.Boolean:
                                        feat[name] = reader.GetBoolean(name);
                                        break;
                                    case FdoPropertyType.Byte:
                                        feat[name] = reader.GetByte(name);
                                        break;
                                    case FdoPropertyType.CLOB:
                                        feat[name] = reader.GetLOB(name).Data;
                                        break;
                                    case FdoPropertyType.DateTime:
                                        {
                                            try
                                            {
                                                feat[name] = reader.GetDateTime(name);
                                            }
                                            catch //Unrepresentable dates
                                            {
                                                feat[name] = DBNull.Value;
                                            }
                                        }
                                        break;
                                    case FdoPropertyType.Decimal: //We should probably remove this as FDO coerces decimals to doubles (otherwise why is there not a GetDecimal() method in FdoIReader?)
                                        {
                                            double val = reader.GetDouble(name);
                                            if (Double.IsNaN(val))
                                                feat[name] = DBNull.Value;
                                            else
                                                feat[name] = Convert.ToDecimal(val);
                                        }
                                        break;
                                    case FdoPropertyType.Double:
                                        feat[name] = reader.GetDouble(name);
                                        break;
                                    case FdoPropertyType.Geometry:
                                        {
                                            try
                                            {
                                                byte[] fgf = reader.GetGeometry(name);
                                                OSGeo.FDO.Geometry.IGeometry geom = service.GeometryFactory.CreateGeometryFromFgf(fgf);
                                                var fg = new FdoGeometry(geom);
                                                //OGR geometry trap
                                                using (var env = fg.Envelope) { }
                                                feat[name] = fg;
                                            }
                                            catch
                                            {
                                                feat[name] = DBNull.Value;
                                            }
                                        }
                                        break;
                                    case FdoPropertyType.Int16:
                                        feat[name] = reader.GetInt16(name);
                                        break;
                                    case FdoPropertyType.Int32:
                                        feat[name] = reader.GetInt32(name);
                                        break;
                                    case FdoPropertyType.Int64:
                                        feat[name] = reader.GetInt64(name);
                                    break;

                                    case FdoPropertyType.Object:
                                        // TODO: how to handle for non-StandardQuery
                                        if (e.Argument is StandardQuery)
                                        {
                                            // because the original code used an iterator over the reader.FieldCount
                                            // it is a bit of a hack to get another definition of the class and check
                                            // we are at the right property with a name comparison
                                            // TODO: code review to see if this can be implemented better
                                            FdoFeatureReader readerFeature = (FdoFeatureReader)reader;
                                            ClassDefinition classDef = readerFeature.GetClassDefinition();

                                            foreach (PropertyDefinition propertyDef in classDef.Properties)
                                            {
                                                // only looking for the right object
                                                if ((PropertyType.PropertyType_ObjectProperty == propertyDef.PropertyType)
                                                    && (propertyDef.Name.Equals(name)))
                                                {
                                                    ObjectPropertyDefinition assocProp = (ObjectPropertyDefinition)propertyDef;
                                                    ClassDefinition classAssoc = assocProp.Class;

                                                    // get a reader from the object - nice!
                                                    IFeatureReader readerObject = readerFeature.GetFeatureObject(name);
                                                    if ((null != readerObject) && (readerObject.ReadNext()))
                                                    {
                                                        // TODO: this should be an iterative function

                                                        // the simple reassignment on each instance fails
                                                        //  (classDefObject.Properties is always zero after first record)
                                                        //  so have set classDefObject higher-up and re-use/
                                                        //   - problem will occur if more than one association
                                                        // ClassDefinition classDefObject = readerObject.GetClassDefinition();
                                                        if (null == classDefObject)
                                                            classDefObject = readerObject.GetClassDefinition();

                                                        foreach (PropertyDefinition propertyDefObject in classDefObject.Properties)
                                                        {
                                                            String nameObject = propertyDefObject.Name;

                                                            // TODO: only "data" type handled at present
                                                            if (PropertyType.PropertyType_DataProperty == propertyDefObject.PropertyType)
                                                            {
                                                                DataPropertyDefinition datapropertyDefObject = (DataPropertyDefinition)propertyDefObject;

                                                                String szFullName = name + "." + nameObject;
                                                                DataType ptAssoc = datapropertyDefObject.DataType;
                                                                // TODO: handle all types
                                                                switch (ptAssoc)
                                                                {
                                                                    case DataType.DataType_String:
                                                                        feat[szFullName] = readerObject.GetString(nameObject);
                                                                    break;

                                                                    case DataType.DataType_Int16:
                                                                        feat[szFullName] = readerObject.GetInt16(nameObject);
                                                                    break;

                                                                    case DataType.DataType_Int32:
                                                                        feat[szFullName] = readerObject.GetInt32(nameObject);
                                                                    break;

                                                                    case DataType.DataType_Int64:
                                                                        feat[szFullName] = readerObject.GetInt64(nameObject);
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                        readerObject.Close();
                                                        readerObject = null;
                                                    }
                                                }
                                            }
                                        }
                                    break;

                                    //case FdoPropertyType.Raster:
                                    case FdoPropertyType.Single:
                                        feat[name] = reader.GetSingle(name);
                                        break;
                                    case FdoPropertyType.String:
                                        feat[name] = reader.GetString(name);
                                        break;
                                }
                            }
                            else
                            {
                                feat[name] = DBNull.Value;
                            }
                        }
                        table.AddRow(feat);

                        if (table.Rows.Count % 50 == 0)
                        {
                            System.Threading.Thread.Sleep(50);
                        }
                    }

                    if (_queryWorker.CancellationPending)
                    {
                        e.Cancel = true;
                        _cancelResult = table;
                    }
                    else
                    {
                        e.Result = table;
                    }
                }
                finally
                {
                    if(reader != null)
                        reader.Close();
                }
            }
        }
Ejemplo n.º 3
0
        public void ExecuteIntersectionQuery(SharpMap.Geometries.BoundingBox box, SharpMap.Data.FeatureDataSet ds)
        {
            Rectangle r = new Rectangle((float)box.Left, (float)box.Bottom, (float)box.Right, (float)box.Top, (float)0.0, (float)0.0);
            FdoFeature[] matches = _data.Intersects(r);

            FeatureDataTable table = new FeatureDataTable();
            foreach (DataColumn col in _data.Columns)
            {
                table.Columns.Add(col.ColumnName, col.DataType, col.Expression);
            }

            //Filter the initial result set by inverting the operands. This weeds out non-matches on point intersection tests.
            IEnvelope env = Converter.EnvelopeFromBoundingBox(box);
            FdoGeometry poly = new FdoGeometry(Converter.CreatePolygonFromEnvelope(env));
            foreach (FdoFeature feat in matches)
            {
                FdoGeometry geom = feat.DesignatedGeometry;
                if (geom != null)
                {
                    if (geom.Contains(env) || geom.Intersects(poly))
                    {
                        FeatureDataRow row = table.NewRow();
                        bool add = true;
                        foreach (DataColumn col in _data.Columns)
                        {
                            if (col.ColumnName == _data.GeometryColumn)
                            {
                                try
                                {
                                    row.Geometry = Converter.FromFdoGeometry(geom, _geomFactory);
                                }
                                catch //Can't help you if you fail conversion.
                                {
                                    add = false;
                                }
                            }
                            else
                            {
                                row[col.ColumnName] = feat[col.ColumnName];
                            }
                        }
                        if (add)
                            table.AddRow(row);
                    }
                }
            }
            ds.Tables.Add(table);
        }