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