Example #1
0
        /// <summary>
        /// Initializes the grid by loading or creating cardinal direction points.
        /// </summary>
        private void Init()
        {
            var directionPoints = new Dictionary <DirectionEnum, IGeoLocation>();

            // load existing cardinal direction points from DB
            foreach (var directionPoint in Home.CardinalDirectionPoints.Where(x => x.UnitDistance == unitDistance))
            {
                directionPoints[directionPoint.Direction] = directionPoint;
            }

            // add any missing direction points
            foreach (DirectionEnum direction in Enum.GetValues(typeof(DirectionEnum)))
            {
                if (directionPoints.ContainsKey(direction))
                {
                    continue;
                }

                directionPoints[direction] = ComputeOffset(direction);

                var newPoint = new CardinalDirectionPoint()
                {
                    OriginId     = Home.Id,
                    UnitDistance = unitDistance,
                    Direction    = direction,
                    Latitude     = directionPoints[direction].Latitude,
                    Longitude    = directionPoints[direction].Longitude
                };

                dbContext.CardinalDirectionPoints.InsertOnSubmit(newPoint);
            }

            // save any possible new points
            dbContext.SubmitChanges();

            // set deltas
            deltaLat = (directionPoints[DirectionEnum.North].Latitude - directionPoints[DirectionEnum.South].Latitude) / 2.0;
            deltaLon = (directionPoints[DirectionEnum.East].Longitude - directionPoints[DirectionEnum.West].Longitude) / 2.0;
        }
Example #2
0
        public double CalculateArea(ComputeAreaInputs rangeOptions)
        {
            var range = new RangeGrid(rangeOptions.OriginName, rangeOptions.RangeMins, rangeOptions.UnitDistance);

            range.Process();
            var border = range.GetBorder(rangeOptions.SmoothPct);

            var area = GeometryApi.ComputeArea(border, apiKey);

            using (var dbContext = new RangerDataContext())
            {
                var existingRegion = dbContext
                                     .Regions
                                     .SingleOrDefault(x => x.OriginId == range.Home.Id && x.RangeMins == rangeOptions.RangeMins && x.UnitDistance == rangeOptions.UnitDistance);

                if (existingRegion == null)
                {
                    var newRegion = new Region()
                    {
                        OriginId     = range.Home.Id,
                        RangeMins    = rangeOptions.RangeMins,
                        UnitDistance = rangeOptions.UnitDistance,
                        Area         = area,
                        BorderNodes  = border.Length
                    };

                    dbContext.Regions.InsertOnSubmit(newRegion);
                }
                else
                {
                    existingRegion.Area        = area;
                    existingRegion.BorderNodes = border.Length;
                }

                dbContext.SubmitChanges();
            }

            return(area);
        }