Exemple #1
0
        static void Main(string[] args)
        {
            Views view = new Views();

            List <Contract> contracts = view.getContracts();

            foreach (var c in view.getContracts())
            {
                Console.WriteLine(c.name);
            }

            Contract contract1 = contracts[0];

            List <Station> stations = view.getStations(contract1);

            foreach (var c in stations)
            {
                Console.WriteLine("La stations de : " + c.name);
            }

            //view.getInfos(2,"rouen");

            GeoCoordinatePortable.GeoCoordinate g = new GeoCoordinatePortable.GeoCoordinate(49.443232, 1.099971);
            Station s = view.findClosestStation(g, stations);

            Console.WriteLine(s.name);
        }
Exemple #2
0
        private SuggestionsResult GetSuggestionsInternal(string partialMatch, GeoCoordinatePortable.GeoCoordinate location, List <string> scoringStrategies)
        {
            if (string.IsNullOrEmpty(partialMatch)) // no input ==> no output!
            {
                return(new SuggestionsResult());
            }

            var matchingCities = Dataset.Where(c => c.Name.StartsWith(partialMatch, StringComparison.CurrentCultureIgnoreCase)).ToList();
            var scores         = new List <double>(matchingCities.Select(mc => 1.0));

            foreach (var strategyName in scoringStrategies)
            {
                var strat     = Factory.CreateScoringStrategy(strategyName);
                var newScores = strat.ComputeScore(matchingCities, partialMatch, location);
                scores = scores.Zip(newScores, (oldScore, newScore) => oldScore * newScore).ToList();
            }

            var resultItems = matchingCities.Zip(scores, (c, score) => new SuggestionsResultItem()
            {
                name = c.Name, latitude = c.Location.Latitude.ToString(), longitude = c.Location.Longitude.ToString(), score = Math.Round(score, 2)
            })
                              .OrderByDescending(mc => mc.score);
            var result = new SuggestionsResult();

            foreach (var i in resultItems)
            {
                result.AddItem(i);
            }
            return(result);
        }
Exemple #3
0
        public ResponseMessage <List <RecyclingBank> > GetAllClose(RecyclingBankRequest _recyclingBankRequest)
        {
            ResponseMessage <List <RecyclingBank> > response = new ResponseMessage <List <RecyclingBank> >();

            try
            {
                List <RecyclingBank> banks = _recyclingBankRepository.GetAll();
                var currentLocation        = new GeoCoordinatePortable.GeoCoordinate(double.Parse(_recyclingBankRequest.Coordinate.Split(',')[0], CultureInfo.InvariantCulture), double.Parse(_recyclingBankRequest.Coordinate.Split(',')[1], CultureInfo.InvariantCulture));
                foreach (var item in banks)
                {
                    var bankLocation = new GeoCoordinatePortable.GeoCoordinate(double.Parse(item.Position.Split(',')[0], CultureInfo.InvariantCulture), double.Parse(item.Position.Split(',')[1], CultureInfo.InvariantCulture));
                    if (currentLocation.GetDistanceTo(bankLocation) < (_recyclingBankRequest.Radius * 1000))
                    {
                        response.ResponseObject.Add(item);
                    }
                }
                response.IsSuccess    = true;
                response.ErrorMessage = "Success";
            }
            catch (Exception ex)
            {
                response.IsSuccess    = false;
                response.ErrorMessage = ex.Message;
            }

            return(response);
        }
Exemple #4
0
        public static void ComputeDistance(Route route)
        {
            var coordinates = route.Coordinates
                              .Split('\n')
                              .ToList()
                              .Select(c => c.Split(',').Select(c => double.Parse(c, CultureInfo.InvariantCulture)).ToList())
                              .ToList();
            var distance = 0d;

            for (var index = 1; index < coordinates.Count; index++)
            {
                var start = new GeoCoordinatePortable.GeoCoordinate(coordinates[index - 1][1], coordinates[index - 1][0]);
                var end   = new GeoCoordinatePortable.GeoCoordinate(coordinates[index][1], coordinates[index][0]);

                distance += start.GetDistanceTo(end);
            }
            distance = Math.Round(distance / 1000, 3);
            route.CalculatedDistance = Math.Round(distance * 1.0064, 2);
        }
Exemple #5
0
 public double GetDistance(double xLa, double xLong, double yLa, double yLong)
 {
     GeoCoordinatePortable.GeoCoordinate cordx = new GeoCoordinatePortable.GeoCoordinate(xLa, xLong);
     GeoCoordinatePortable.GeoCoordinate cordy = new GeoCoordinatePortable.GeoCoordinate(yLa, yLong);
     return(cordx.GetDistanceTo(cordy));
 }
        public async Task <SubscriptionMatchGroup> GetSubscriptionMatches(OCM.Core.Data.OCMEntities dataModel, POIManager poiManager, OCM.Core.Data.UserSubscription subscription, Model.CoreReferenceData refData, DateTime?dateFrom = null)
        {
            SubscriptionMatchGroup subscriptionMatchGroup = new SubscriptionMatchGroup();

            var checkFromDate = DateTime.UtcNow.AddMinutes(-CHECK_INTERVAL_MINS); //check from last 5 mins etc

            if (subscription.DateLastNotified != null)
            {
                checkFromDate = subscription.DateLastNotified.Value;                                        //check from date last notified
            }
            else
            {
                checkFromDate = subscription.DateCreated;
            }

            if (dateFrom != null)
            {
                checkFromDate = dateFrom.Value;
            }

            subscriptionMatchGroup.DateFrom = checkFromDate;

            //FIXME: re-test with updated coordinate objects (nettopology etc)
            GeoCoordinatePortable.GeoCoordinate searchPos = null;

            UserSubscriptionFilter filter = null;

            if (subscription.FilterSettings != null)
            {
                try
                {
                    filter = JsonConvert.DeserializeObject <UserSubscriptionFilter>(subscription.FilterSettings);
                }
                catch (Exception)
                {
                    //failed to parse subscription filter
                }
            }

            if (subscription.Latitude != null && subscription.Longitude != null)
            {
                searchPos = new GeoCoordinatePortable.GeoCoordinate((double)subscription.Latitude, (double)subscription.Longitude);
            }

            if (subscription.NotifyEmergencyChargingRequests)
            {
                var emergencyCharging = dataModel.UserChargingRequests.Where(c => c.DateCreated >= checkFromDate && c.IsActive == true && c.IsEmergency == true);
                var subscriptionMatch = new SubscriptionMatch {
                    Category = SubscriptionMatchCategory.ChargingRequestEmergency, Description = "New Emergency Charging Requests"
                };

                foreach (var chargingRequest in emergencyCharging)
                {
                    //filter on location
                    if (searchPos != null)
                    {
                        if (GeoManager.CalcDistance(chargingRequest.Latitude, chargingRequest.Longitude, (double)searchPos.Latitude, (double)searchPos.Longitude, DistanceUnit.KM) < subscription.DistanceKm)
                        {
                            subscriptionMatch.ItemList.Add(new SubscriptionMatchItem {
                                Item = chargingRequest
                            });
                        }
                    }
                    else
                    {
                        subscriptionMatch.ItemList.Add(new SubscriptionMatchItem {
                            Item = chargingRequest
                        });
                    }
                }
                if (subscriptionMatch.ItemList.Any())
                {
                    subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch);
                }
            }

            if (subscription.NotifyGeneralChargingRequests)
            {
                //TODO: subscription not filtered on lat/long will return global charging requests
                var generalCharging   = dataModel.UserChargingRequests.Where(c => c.DateCreated >= checkFromDate && c.IsActive == true && c.IsEmergency == false);
                var subscriptionMatch = new SubscriptionMatch {
                    Category = SubscriptionMatchCategory.ChargingRequestGeneral, Description = "New Charging Requests"
                };
                //filter on location
                foreach (var gc in generalCharging)
                {
                    if (searchPos != null)
                    {
                        if (GeoManager.CalcDistance(gc.Latitude, gc.Longitude, (double)searchPos.Latitude, (double)searchPos.Longitude, DistanceUnit.KM) < subscription.DistanceKm)
                        {
                            subscriptionMatch.ItemList.Add(new SubscriptionMatchItem {
                                Item = gc
                            });
                        }
                    }
                    else
                    {
                        subscriptionMatch.ItemList.Add(new SubscriptionMatchItem {
                            Item = gc
                        });
                    }
                }

                if (subscriptionMatch.ItemList.Any())
                {
                    subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch);
                }
            }

            //check if any POI Edits (pending approval) match this subscription
            if (subscription.NotifyPoiedits)
            {
                var poiEdits = dataModel.EditQueueItems.Where(c => c.DateSubmitted >= checkFromDate && c.PreviousData != null && c.IsProcessed == false);
                if (poiEdits.Any())
                {
                    var subscriptionMatch = new SubscriptionMatch {
                        Category = SubscriptionMatchCategory.EditedPOI, Description = "Proposed POI Edits"
                    };
                    foreach (var p in poiEdits)
                    {
                        try
                        {
                            var updatedPOI = JsonConvert.DeserializeObject <ChargePoint>(p.EditData);
                            if (IsPOISubscriptionFilterMatch(updatedPOI, filter, subscription))
                            {
                                if (searchPos != null)
                                {
                                    if (GeoManager.CalcDistance(updatedPOI.AddressInfo.Latitude, updatedPOI.AddressInfo.Longitude, (double)searchPos.Latitude, (double)searchPos.Longitude, DistanceUnit.KM) < subscription.DistanceKm)
                                    {
                                        subscriptionMatch.ItemList.Add(new SubscriptionMatchItem {
                                            Item = p, POI = updatedPOI
                                        });
                                    }
                                }
                                else
                                {
                                    subscriptionMatch.ItemList.Add(new SubscriptionMatchItem {
                                        Item = p, POI = updatedPOI
                                    });
                                }
                            }
                        }
                        catch (Exception)
                        {
                            ;;
                        }
                    }
                    if (subscriptionMatch.ItemList.Any())
                    {
                        subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch);
                    }
                }
            }

            //check if any new POIs
            if (subscription.NotifyPoiadditions)
            {
                /* var newPOIs = dataModel.ChargePoints.Where(c => c.DateCreated >= checkFromDate && c.SubmissionStatusType.IsLive == true &&
                 *    (searchPos == null ||
                 *       (searchPos != null &&
                 *           c.AddressInfo.SpatialPosition.Distance(searchPos) / 1000 < subscription.DistanceKM
                 *       ))
                 *     ).ToList();*/

                var filterParams = new APIRequestParams {
                    CreatedFromDate = checkFromDate, AllowMirrorDB = true
                };
                if (searchPos != null)
                {
                    filterParams.DistanceUnit = DistanceUnit.KM;
                    filterParams.Distance     = subscription.DistanceKm;
                    filterParams.Latitude     = searchPos.Latitude;
                    filterParams.Longitude    = searchPos.Longitude;
                }
                if (subscription.CountryId != null)
                {
                    filterParams.CountryIDs = new int[] { (int)subscription.CountryId };
                }
                var poiCollection = poiManager.GetPOIList(filterParams);

                if (poiCollection.Any())
                {
                    var subscriptionMatch = new SubscriptionMatch {
                        Category = SubscriptionMatchCategory.NewPOI, Description = "New POIs Added"
                    };
                    foreach (var p in poiCollection)
                    {
                        //var poi = OCM.API.Common.Model.Extensions.ChargePoint.FromDataModel(p);
                        if (IsPOISubscriptionFilterMatch(p, filter, subscription))
                        {
                            subscriptionMatch.ItemList.Add(new SubscriptionMatchItem {
                                POI = p
                            });
                        }
                    }
                    if (subscriptionMatch.ItemList.Any())
                    {
                        subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch);
                    }
                }
            }

            //check if any POI Updates match this subscription
            if (subscription.NotifyPoiupdates)
            {
                var poiUpdates = dataModel.EditQueueItems.Where(c => c.DateProcessed >= checkFromDate && c.IsProcessed == true && c.PreviousData != null);
                if (poiUpdates.Any())
                {
                    var subscriptionMatch = new SubscriptionMatch {
                        Category = SubscriptionMatchCategory.UpdatedPOI, Description = "POIs Updated"
                    };
                    foreach (var p in poiUpdates)
                    {
                        try
                        {
                            var updatedPOI = JsonConvert.DeserializeObject <ChargePoint>(p.EditData);
                            if (IsPOISubscriptionFilterMatch(updatedPOI, filter, subscription))
                            {
                                if (searchPos != null)
                                {
                                    if (GeoManager.CalcDistance(updatedPOI.AddressInfo.Latitude, updatedPOI.AddressInfo.Longitude, (double)searchPos.Latitude, (double)searchPos.Longitude, DistanceUnit.KM) < subscription.DistanceKm)
                                    {
                                        subscriptionMatch.ItemList.Add(new SubscriptionMatchItem {
                                            Item = p, POI = updatedPOI
                                        });
                                    }
                                }
                                else
                                {
                                    subscriptionMatch.ItemList.Add(new SubscriptionMatchItem {
                                        Item = p, POI = updatedPOI
                                    });
                                }
                            }
                        }
                        catch (Exception)
                        {
                            ;;
                        }
                    }
                    if (subscriptionMatch.ItemList.Any())
                    {
                        subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch);
                    }
                }
            }

            //check if any new comments match this subscription
            if (subscription.NotifyComments)
            {
                var newComments = dataModel.UserComments.Where(c => c.DateCreated >= checkFromDate &&
                                                               (searchPos == null ||
                                                                (searchPos != null &&
                                                                 c.ChargePoint.AddressInfo.SpatialPosition.Distance(new NetTopologySuite.Geometries.Point((double)searchPos.Latitude, (double)searchPos.Longitude)) / 1000 < subscription.DistanceKm
                                                                ))
                                                               );
                if (newComments.Any())
                {
                    var subscriptionMatch = new SubscriptionMatch {
                        Category = SubscriptionMatchCategory.NewComment, Description = "New Comments Added"
                    };
                    foreach (var c in newComments)
                    {
                        var poi = OCM.API.Common.Model.Extensions.ChargePoint.FromDataModel(c.ChargePoint, refData);
                        if (IsPOISubscriptionFilterMatch(poi, filter, subscription))
                        {
                            subscriptionMatch.ItemList.Add(new SubscriptionMatchItem {
                                Item = OCM.API.Common.Model.Extensions.UserComment.FromDataModel(c, true), POI = poi
                            });
                        }
                    }
                    if (subscriptionMatch.ItemList.Any())
                    {
                        subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch);
                    }
                }
            }

            //check if any new Media uploads match this subscription
            if (subscription.NotifyMedia)
            {
                var newMedia = dataModel.MediaItems.Where(c => c.DateCreated >= checkFromDate &&
                                                          (searchPos == null ||
                                                           (searchPos != null &&
                                                            c.ChargePoint.AddressInfo.SpatialPosition.Distance(new NetTopologySuite.Geometries.Point((double)searchPos.Latitude, (double)searchPos.Longitude)) / 1000 < subscription.DistanceKm
                                                           ))
                                                          );
                if (newMedia.Any())
                {
                    var subscriptionMatch = new SubscriptionMatch {
                        Category = SubscriptionMatchCategory.NewMediaUpload, Description = "New Photos Added"
                    };
                    foreach (var c in newMedia)
                    {
                        var poi = OCM.API.Common.Model.Extensions.ChargePoint.FromDataModel(c.ChargePoint, refData);
                        if (IsPOISubscriptionFilterMatch(poi, filter, subscription))
                        {
                            subscriptionMatch.ItemList.Add(new SubscriptionMatchItem {
                                Item = OCM.API.Common.Model.Extensions.MediaItem.FromDataModel(c), POI = poi
                            });
                        }
                    }
                    if (subscriptionMatch.ItemList.Any())
                    {
                        subscriptionMatchGroup.SubscriptionMatches.Add(subscriptionMatch);
                    }
                }
            }

            return(subscriptionMatchGroup);
        }