Exemplo n.º 1
0
        public virtual IEnumerable <IFeature> GetFeatures(IGeometry geometry, bool useCustomRenderers = true)
        {
            if (useCustomRenderers)
            {
                var customRenderer = CustomRenderers.FirstOrDefault();

                if (customRenderer != null)
                {
                    foreach (var feature in customRenderer.GetFeatures(geometry, this))
                    {
                        yield return(feature);
                    }

                    yield break;
                }
            }

            var getAllMapFeatures = map == null || map.Envelope.Equals(geometry.EnvelopeInternal); // when all map features are asked - avoid time consuming geometry x geometry checks

            if (UseQuadTree)
            {
                var features = GetFeaturesUsingQuadTree(geometry.EnvelopeInternal);

                foreach (var feature in features)
                {
                    // check if we're selecting subset of features, if so - use more robust intersection check (non-evelope based)
                    if (!getAllMapFeatures)
                    {
                        // log.DebugFormat("Checking geometry intersection for feature: " + feature.Attributes["NAME"]);
                        var g = feature.Geometry;

                        if (CoordinateTransformation != null)
                        {
                            g = GeometryTransform.TransformGeometry(g, CoordinateTransformation.MathTransform);
                        }

                        if (g.Intersects(geometry))
                        {
                            // log.DebugFormat("Intersected geometry found for feature: " + feature.Attributes["NAME"]);

                            yield return(feature);
                        }
                    }
                    else
                    {
                        yield return(feature);
                    }
                }
            }
            else
            {
                var features = Enumerable.Empty <IFeature>();
                var e        = geometry.EnvelopeInternal;
                if (CoordinateTransformation != null)
                {
                    // BUG: this will not work, migrate it
                    features = DataSource.Features.Cast <IFeature>();

                    foreach (var feature in features)
                    {
                        var g = GeometryTransform.TransformGeometry(feature.Geometry, CoordinateTransformation.MathTransform);

                        if (!g.EnvelopeInternal.Intersects(geometry.EnvelopeInternal))
                        {
                            continue;
                        }

                        if (!getAllMapFeatures)
                        {
                            if (g.Intersects(geometry))
                            {
                                yield return(feature);
                            }
                        }
                        else
                        {
                            yield return(feature);
                        }
                    }
                }
                else
                {
                    features = DataSource.Features.Cast <IFeature>().Where(feature => feature.Geometry != null && feature.Geometry.EnvelopeInternal.Intersects(e));

                    foreach (var feature in features)
                    {
                        if (!getAllMapFeatures)
                        {
                            if (feature.Geometry.Intersects(geometry))
                            {
                                yield return(feature);
                            }
                        }
                        else
                        {
                            yield return(feature);
                        }
                    }
                }
            }
        }