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()); } }
/// <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); }
/// <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); } } }
/// <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); }
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); }
//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); }