예제 #1
0
        /// <summary>
        /// Query by geometry
        /// </summary>
        /// <param name="geo">input geometry</param>
        /// <param name="layer">target layer</param>
        /// <returns></returns>
        public List <int> QueryByGeometry(OSGeo.OGR.Geometry geo, OSGeo.OGR.Layer layer, SpatialRel sr)
        {
            List <int> result = new List <int>();

            try
            {
                OSGeo.OGR.Feature oFeature = null;

                while ((oFeature = layer.GetNextFeature()) != null)
                {
                    OSGeo.OGR.Geometry oGeometry = oFeature.GetGeometryRef();
                    switch (sr)
                    {
                    case SpatialQuery.SpatialRel.Undefined: break;

                    case SpatialQuery.SpatialRel.Intersects:
                        if (geo.Intersect(oGeometry))
                        {
                            result.Add((int)oFeature.GetFID());
                        }
                        break;

                    case SpatialQuery.SpatialRel.Contains:
                        if (oGeometry.Contains(geo))
                        {
                            result.Add((int)oFeature.GetFID());
                        }
                        break;

                    case SpatialQuery.SpatialRel.Crosses:
                        if (geo.Crosses(oGeometry))
                        {
                            result.Add((int)oFeature.GetFID());
                        }
                        break;

                    case SpatialQuery.SpatialRel.Overlaps:
                        if (geo.Overlaps(oGeometry))
                        {
                            result.Add((int)oFeature.GetFID());
                        }
                        break;

                    case SpatialQuery.SpatialRel.Touches:
                        if (geo.Touches(oGeometry))
                        {
                            result.Add((int)oFeature.GetFID());
                        }
                        break;

                    case SpatialQuery.SpatialRel.WithIn:
                        if (oGeometry.Within(geo))
                        {
                            result.Add((int)oFeature.GetFID());
                        }
                        break;
                    }
                }
            }
            catch
            {
                throw;
            }

            return(result);
        }