示例#1
0
        public FeatureDataSet ExecuteQuery(string query, OgrGeometry filter)
        {
            try
            {
                var results = _ogrDataSource.ExecuteSQL(query, filter, "");
                results.ResetReading();

                //reads the column definition of the layer/feature
                var ds   = new FeatureDataSet();
                var myDt = ReadColumnDefinition(results);

                myDt.BeginLoadData();
                var        reader = new OgrGeometryReader(Factory);
                OgrFeature ogrFeature;
                while ((ogrFeature = results.GetNextFeature()) != null)
                {
                    //LoadOgrFeatureToFeatureDataRow(myDt, ogrFeature, Factory);
                    LoadOgrFeatureToFeatureDataRow(myDt, ogrFeature, reader);
                    ogrFeature.Dispose();
                }
                myDt.EndLoadData();

                ds.Tables.Add(myDt);
                _ogrDataSource.ReleaseResultSet(results);

                return(ds);
            }
            catch (Exception exc)
            {
                _log.Debug(t => t(exc.ToString()));
                return(new FeatureDataSet());
            }
        }
示例#2
0
        /// <summary>
        /// Returns geometries within the specified bounding box
        /// </summary>
        /// <param name="bbox"></param>
        /// <returns></returns>
        public override Collection <Geometry> GetGeometriesInView(BoundingBox bbox)
        {
            var geoms = new Collection <Geometry>();

            OgrDataSource ogrDataSource;

            using (var ogrLayer = GetLayer(_layerIndex, out ogrDataSource))
            {
                ogrLayer.SetSpatialFilterRect(bbox.MinX, bbox.MinY, bbox.MaxX, bbox.MaxY);
                try
                {
                    var        reader = new OgrGeometryReader(Factory);
                    OgrFeature ogrFeature;
                    while ((ogrFeature = ogrLayer.GetNextFeature()) != null)
                    {
                        using (var gr = ogrFeature.GetGeometryRef())
                        {
                            //var geom = ParseOgrGeometry(gr, Factory);
                            var geom = reader.Read(gr);
                            if (geom != null)
                            {
                                geoms.Add(geom);
                            }
                        }
                        ogrFeature.Dispose();
                    }
                    ogrDataSource.Dispose();
                }
                catch (Exception ex)
                {
                    _log.Debug(t => t(ex.Message));
                }
            }
            return(geoms);
        }
示例#3
0
 /// <summary>
 /// Returns the geometry corresponding to the Object ID
 /// </summary>
 /// <param name="oid">Object ID</param>
 /// <returns>geometry</returns>
 public override Geometry GetGeometryByID(uint oid)
 {
     using (var ogrLayer = GetLayer(_layerIndex))
         using (var ogrFeature = ogrLayer.GetFeature((int)oid))
         {
             using (var gr = ogrFeature.GetGeometryRef())
             {
                 var g = new OgrGeometryReader(Factory).Read(gr);
                 return(g);
             }
         }
 }
示例#4
0
        /// <summary>
        /// Returns a FeatureDataRow based on a RowID
        /// </summary>
        /// <param name="rowId"></param>
        /// <returns>FeatureDataRow</returns>
        public override FeatureDataRow GetFeature(uint rowId)
        {
            FeatureDataRow res    = null;
            var            reader = new OgrGeometryReader(Factory);

            using (var ogrLayer = GetLayer(_layerIndex))
            {
                var fdt = ReadColumnDefinition(ogrLayer);
                fdt.BeginLoadData();
                using (var feature = ogrLayer.GetFeature((int)rowId))
                {
                    //res = LoadOgrFeatureToFeatureDataRow(fdt, feature, Factory);
                    res = LoadOgrFeatureToFeatureDataRow(fdt, feature, reader);
                }
                fdt.EndLoadData();
            }
            return(res);
        }
示例#5
0
        private void ExecuteIntersectionQuery(FeatureDataSet ds, OgrLayer ogrLayer)
        {
            ogrLayer.SetAttributeFilter(String.IsNullOrEmpty(_definitionQuery) ? "" : _definitionQuery);
            ogrLayer.ResetReading();

            //reads the column definition of the layer/feature
            var myDt   = ReadColumnDefinition(ogrLayer);
            var reader = new OgrGeometryReader(Factory);

            myDt.BeginLoadData();
            OgrFeature ogrFeature;

            while ((ogrFeature = ogrLayer.GetNextFeature()) != null)
            {
                //LoadOgrFeatureToFeatureDataRow(myDt, ogrFeature, Factory);
                LoadOgrFeatureToFeatureDataRow(myDt, ogrFeature, reader);
                ogrFeature.Dispose();
            }
            myDt.EndLoadData();

            ds.Tables.Add(myDt);
        }
示例#6
0
        //private static Geometry ParseOgrGeometry(OgrGeometry ogrGeometry, WKBReader reader)
        ////private static Geometry ParseOgrGeometry(OgrGeometry ogrGeometry, IGeometryFactory factory)
        //{
        //    if (ogrGeometry != null)
        //    {

        //        //Just in case it isn't 2D
        //        ogrGeometry.FlattenTo2D();
        //        var wkbBuffer = new byte[ogrGeometry.WkbSize()];
        //        ogrGeometry.ExportToWkb(wkbBuffer);
        //        //var geom = GeometryFromWKB.Parse(wkbBuffer, factory);
        //        var geom = reader.Read(wkbBuffer);
        //        if (geom == null)
        //            _log.Debug(t=> t("Failed to parse '{0}'", ogrGeometry.GetGeometryType()));
        //        return geom;

        //        ogrGeometry.GetGeometry()
        //    }
        //    return null;
        //}

        //private static FeatureDataRow LoadOgrFeatureToFeatureDataRow(FeatureDataTable table, OSGeo.OGR.Feature ogrFeature, GeoAPI.Geometries.IGeometryFactory factory)
        private static FeatureDataRow LoadOgrFeatureToFeatureDataRow(FeatureDataTable table, OSGeo.OGR.Feature ogrFeature, OgrGeometryReader reader)
        {
            var values = new object[ogrFeature.GetFieldCount()];

            for (var iField = 0; iField < ogrFeature.GetFieldCount(); iField++)
            {
                // No need to get field value if there's no value available...
                if (!ogrFeature.IsFieldSet(iField))
                {
                    continue;
                }

                int count;
                switch (ogrFeature.GetFieldType(iField))
                {
                case OgrFieldType.OFTString:
                case OgrFieldType.OFTWideString:
                    values[iField] = ogrFeature.GetFieldAsString(iField);
                    break;

                case OgrFieldType.OFTStringList:
                case OgrFieldType.OFTWideStringList:
                    values[iField] = ogrFeature.GetFieldAsStringList(iField);
                    break;

                case OgrFieldType.OFTInteger:
                    values[iField] = ogrFeature.GetFieldAsInteger(iField);
                    break;

                case OgrFieldType.OFTIntegerList:
                    values[iField] = ogrFeature.GetFieldAsIntegerList(iField, out count);
                    break;

                case OgrFieldType.OFTReal:
                    values[iField] = ogrFeature.GetFieldAsDouble(iField);
                    break;

                case OgrFieldType.OFTRealList:
                    values[iField] = ogrFeature.GetFieldAsDoubleList(iField, out count);
                    break;

                case OgrFieldType.OFTDate:
                case OgrFieldType.OFTDateTime:
                case OgrFieldType.OFTTime:
                    Int32 y, m, d, h, mi, tz;
                    float s;
                    ogrFeature.GetFieldAsDateTime(iField, out y, out m, out d, out h, out mi, out s, out tz);
                    try
                    {
                        if (y == 0 && m == 0 && d == 0)
                        {
                            values[iField] = DateTime.MinValue.AddMinutes(h * 60 + mi);
                        }
                        else
                        {
                            values[iField] = new DateTime(y, m, d, h, mi, (int)s);
                        }
                    }
// ReSharper disable once EmptyGeneralCatchClause
                    catch { }
                    break;

                default:
                    var iTmpField = iField;
                    _log.Debug(t => t("Cannot handle Ogr DataType '{0}'", ogrFeature.GetFieldType(iTmpField)));
                    break;
                }
            }

            var fdr = (FeatureDataRow)table.LoadDataRow(values, true);

            using (var gr = ogrFeature.GetGeometryRef())
            {
                //fdr.Geometry = ParseOgrGeometry(gr, factory);
                fdr.Geometry = reader.Read(gr);
            }
            return(fdr);
        }