Exemple #1
0
        private void SearchAsync(IEnumerable <LayerInfo> layerInfos, SearchRegion region, MultiDimensionalObjectRelationship relationship)
        {
            btnSearch.Enabled = false;
            btnSearch.Text    = @"Searching...";

            var searchWorker = new BackgroundWorker();

            searchWorker.DoWork             += SearchWorker_DoWork;
            searchWorker.RunWorkerCompleted += SearchWorker_RunWorkerCompleted;

            _timer.Restart();
            searchWorker.RunWorkerAsync(Tuple.Create(layerInfos, region, relationship, rdoSearchByGeom.Checked));
        }
        private static FeatureSet SpatialSearch <TMdo, TVal>(JoobRTree <TMdo, TVal> rtree, string name, FeatureType type, SearchRegion region, MultiDimensionalObjectRelationship relationship, out long searchTime)
            where TMdo : JoobObject, IMultiDimensionalObject
            where TVal : JoobObject
        {
            if (rtree.Count > 0)
            {
                var projection = ProjectionInfo.FromProj4String(SRID_WGS84);
                projection.Transform = new Transform();
                var featureSet = new FeatureSet(type)
                {
                    Name       = name,
                    Projection = projection
                };

                var watch = new Stopwatch();
                watch.Start();

                var result = region == null
                    ? rtree.Where(item => item as ObjectWithSpatialInfo != null).Cast <ObjectWithSpatialInfo>().Select(item => item.Geom).ToList()
                    : rtree.Search(region.Envelope as TMdo, relationship).Select(item => item.Key as JoobGeometry).ToList();

                watch.Stop();
                searchTime = watch.ElapsedMilliseconds;

                PopulateFeatureSet(result, featureSet);
                return(featureSet);
            }

            searchTime = 0;
            return(null);
        }
        private static FeatureSet SpatialSearchOtherSpatialLayers(string layerName, SearchRegion region, MultiDimensionalObjectRelationship relationship, out long searchTime)
        {
            var layer = TheRoot.OtherSpatialLayers[layerName];

            if (layer != null)
            {
                var projection = ProjectionInfo.FromProj4String(SRID_None);
                projection.Transform = new Transform();
                var featureSet = new FeatureSet(FeatureType.Unspecified)
                {
                    Name       = layerName,
                    Projection = projection
                };

                var watch = new Stopwatch();
                watch.Start();

                var result = region == null?layer.Geometries.Cast <JoobGeometry>().ToList()
                                 : layer.Geometries.Search(region.Envelope, relationship).Select(item => item.Key);

                watch.Stop();
                searchTime = watch.ElapsedMilliseconds;

                PopulateFeatureSet(result, featureSet);
                return(featureSet);
            }

            searchTime = 0;
            return(null);
        }
        public static IEnumerable <FeatureSet> SpatialSearch(IEnumerable <LayerInfo> layerInfos, SearchRegion region, MultiDimensionalObjectRelationship relationship, out long totalSearchTime)
        {
            totalSearchTime = 0;
            var result = new List <FeatureSet>();

            foreach (var info in layerInfos)
            {
                long searchTime;
                if (info.Name.Equals(FeatureTypeStates, StringComparison.OrdinalIgnoreCase))
                {
                    var featureSet = SpatialSearch(TheRoot.AllStatesByGeom, info.Name, FeatureType.Polygon, region, relationship, out searchTime);
                    if (featureSet != null)
                    {
                        result.Add(featureSet);
                    }
                }
                else if (info.Name.Equals(FeatureTypeCounties, StringComparison.OrdinalIgnoreCase))
                {
                    var featureSet = SpatialSearch(TheRoot.AllCountiesByGeom, info.Name, FeatureType.Polygon, region, relationship, out searchTime);
                    if (featureSet != null)
                    {
                        result.Add(featureSet);
                    }
                }
                else if (info.Name.Equals(FeatureTypeCities, StringComparison.OrdinalIgnoreCase))
                {
                    var featureSet = SpatialSearch(TheRoot.AllCitiesByGeom, info.Name, FeatureType.Point, region, relationship, out searchTime);
                    if (featureSet != null)
                    {
                        result.Add(featureSet);
                    }
                }
                else
                {
                    var layer = SpatialSearchOtherSpatialLayers(info.Name, region, relationship, out searchTime);
                    if (layer != null)
                    {
                        result.Add(layer);
                    }
                }

                totalSearchTime += searchTime;
            }

            return(result);
        }