public ClusterMarkersResponse GetClusterMarkers(GetMarkersParams getParams)
        {
            // Decorate with elapsed time
            var sw = new Stopwatch();

            sw.Start();
            var reply = GetMarkersHelper(getParams);

            sw.Stop();
            reply.Elapsed = sw.Elapsed.ToString();
            return(reply);
        }
示例#2
0
        /// <summary>
        /// Gets the events in the form of Map points (markers and/or clusters).
        /// Does not use caching but can be modified to cache the results from the database.
        /// </summary>
        /// <param name="filter">Filter used for retrieving events from the database.</param>
        /// <param name="clusteringFilter">Filter used for clustering the markers.</param>
        /// <returns>List of Map points.</returns>
        public async Task <IList <MapPoint> > GetClusteredEventsAsync(IFilter filter, IClusteringFIlter clusteringFilter)
        {
            string dBCacheKey = filter.ULat.ToString() + filter.ULong.ToString() + filter.Radius.ToString() + filter.Category.ToString() + filter.Custom + filter.StartTime.ToString() + filter.EndTime.ToString() + filter.Price.ToString() + filter.RatingEvent.ToString() + filter.SearchString;

            var points = await GetClusterPointCollection(filter, dBCacheKey);

            var mapService = new ClusterService(points);
            var input      = new GetMarkersParams()
            {
                NorthEastLatitude  = clusteringFilter.NELatitude,
                NorthEastLongitude = clusteringFilter.NELongitude,
                SouthWestLatitude  = clusteringFilter.SWLatitude,
                SouthWestLongitude = clusteringFilter.SWLongitude,
                ZoomLevel          = clusteringFilter.ZoomLevel,
                PointType          = dBCacheKey
            };
            //"MapService says: exception Object reference not set to an instance of an object."
            var markers = mapService.GetClusterMarkers(input);

            return(markers.Markers);
        }
        /// <summary>
        /// Read Through Cache
        /// </summary>
        /// <param name="getParams"></param>
        /// <returns></returns>
        private ClusterMarkersResponse GetMarkersHelper(GetMarkersParams getParams)
        {
            try
            {
                var neLat     = getParams.NorthEastLatitude;
                var neLong    = getParams.NorthEastLongitude;
                var swLat     = getParams.SouthWestLatitude;
                var swLong    = getParams.SouthWestLongitude;
                var zoomLevel = getParams.ZoomLevel;
                var filter    = getParams.Filter ?? "";

                // values are validated there
                var markersInput = new MarkersInput(neLat, neLong, swLat, swLong, zoomLevel, filter);

                var grid           = GridCluster.GetBoundaryExtended(markersInput);
                var cacheKeyHelper = string.Format("{0}_{1}_{2}", markersInput.Zoomlevel, markersInput.FilterHashCode(), grid.GetHashCode());
                var cacheKey       = CacheKeys.GetMarkers(cacheKeyHelper.GetHashCode());

                var response = new ClusterMarkersResponse();

                markersInput.Viewport.ValidateLatLon(); // Validate google map viewport input (should be always valid)
                markersInput.Viewport.Normalize();

                // Get all points from memory
                IList <MapPoint> points = _pointCollection.Get(getParams.PointType); // _pointsDatabase.GetPoints();

                // Filter points
                points = FilterUtil.FilterByType(
                    points,
                    new FilterData {
                    TypeFilterExclude = markersInput.TypeFilterExclude
                }
                    );



                // Create new instance for every ajax request with input all points and json data
                var clusterAlgo = new GridCluster(points, markersInput);

                var clusteringEnabled = markersInput.IsClusteringEnabled ||
                                        GmcConfiguration.Get.AlwaysClusteringEnabledWhenZoomLevelLess > markersInput.Zoomlevel;

                // Clustering
                if (clusteringEnabled && markersInput.Zoomlevel < GmcConfiguration.Get.ZoomlevelClusterStop)
                {
                    IList <MapPoint> markers = clusterAlgo.RunCluster();

                    response = new ClusterMarkersResponse
                    {
                        Markers   = markers,
                        Polylines = clusterAlgo.GetPolyLines()
                    };
                }
                else
                {
                    // If we are here then there are no clustering
                    // The number of items returned is restricted to avoid json data overflow
                    IList <MapPoint> filteredDataset          = FilterUtil.FilterDataByViewport(points, markersInput.Viewport);
                    IList <MapPoint> filteredDatasetMaxPoints = filteredDataset.Take(GmcConfiguration.Get.MaxMarkersReturned).ToList();

                    response = new ClusterMarkersResponse
                    {
                        Markers   = filteredDatasetMaxPoints,
                        Polylines = clusterAlgo.GetPolyLines(),
                        Mia       = filteredDataset.Count - filteredDatasetMaxPoints.Count,
                    };
                }

                // if client ne and sw is inside a specific grid box then cache the grid box and the result
                // next time test if ne and sw is inside the grid box and return the cached result
                if (GmcConfiguration.Get.CacheServices)
                {
                    _memCache.Set(cacheKey, response, TimeSpan.FromMinutes(10)); // cache data
                }
                return(response);
            }
            catch (Exception ex)
            {
                return(new ClusterMarkersResponse
                {
                    OperationResult = "0",
                    ErrorMessage = string.Format("MapService says: exception {0}", ex.Message)
                });
            }
        }