コード例 #1
0
        public static MultiPolygon FixWeatherPolygon(MultiPolygon multiPolygon)
        {
            var newMultiPolygon = new MultiPolygon();

            if (multiPolygon.Count == 0 || multiPolygon == null)
            {
                return(newMultiPolygon);
            }

            multiPolygon.ForEach(x => newMultiPolygon.Add(new Polygon {
                x[1], x[0]
            }));
            newMultiPolygon.Add(newMultiPolygon[newMultiPolygon.Count - 1]);
            return(newMultiPolygon);
        }
コード例 #2
0
        public static void Run()
        {
            //ExStart: CreateMultiPolygon
            LinearRing firstRing = new LinearRing();

            firstRing.AddPoint(8.5, -2.5);
            firstRing.AddPoint(-8.5, 2.5);
            firstRing.AddPoint(8.5, -2.5);
            Polygon firstPolygon = new Polygon(firstRing);

            LinearRing secondRing = new LinearRing();

            secondRing.AddPoint(7.6, -3.6);
            secondRing.AddPoint(-9.6, 1.5);
            secondRing.AddPoint(7.6, -3.6);
            Polygon secondPolygon = new Polygon(secondRing);

            MultiPolygon multiPolygon = new MultiPolygon();

            multiPolygon.Add(firstPolygon);
            multiPolygon.Add(secondPolygon);
            //ExEnd: CreateMultiPolygon
        }
コード例 #3
0
        /// <summary>
        /// Groups the rings into polygons.
        /// </summary>
        /// <param name="rings"></param>
        /// <returns></returns>
        private Geometry GroupRings(List <KeyValuePair <bool, LineairRing> > rings)
        {
            Geometry geometry = null;

            bool[][] containsFlags = new bool[rings.Count][]; // means [x] contains [y]
            for (int x = 0; x < rings.Count; x++)
            {
                containsFlags[x] = new bool[rings.Count];
                for (int y = 0; y < x; y++)
                {
                    containsFlags[x][y] =
                        rings[x].Value.Contains(rings[y].Value);
                }
            }
            bool[]       used         = new bool[rings.Count];
            MultiPolygon multiPolygon = null;

            while (used.Contains(false))
            { // select a ring not contained by any other.
                LineairRing outer    = null;
                int         outerIdx = -1;
                for (int idx = 0; idx < rings.Count; idx++)
                {
                    if (!used[idx] && this.CheckUncontained(rings, containsFlags, used, idx))
                    { // this ring is not contained in any other used rings.
                        if (!rings[idx].Key)
                        {
                            OsmSharp.Logging.Log.TraceEvent("OsmSharp.Osm.Interpreter.SimpleGeometryInterpreter", TraceEventType.Error,
                                                            "Invalid multipolygon relation: an 'inner' ring was detected without an 'outer'.");
                        }
                        outerIdx  = idx;
                        outer     = rings[idx].Value;
                        used[idx] = true;
                        break;
                    }
                }
                if (outer != null)
                { // an outer ring was found, find inner rings.
                    List <LineairRing> inners = new List <LineairRing>();
                    // select all rings contained by inner but not by any others.
                    for (int idx = 0; idx < rings.Count; idx++)
                    {
                        if (!used[idx] && containsFlags[outerIdx][idx] &&
                            this.CheckUncontained(rings, containsFlags, used, idx))
                        {
                            inners.Add(rings[idx].Value);
                            used[idx] = true;
                        }
                    }

                    bool unused = !used.Contains(false);
                    if (multiPolygon == null &&
                        inners.Count == 0 &&
                        unused)
                    { // there is just one lineair ring.
                        geometry = outer;
                        break;
                    }
                    else if (multiPolygon == null &&
                             unused)
                    { // there is just one polygon.
                        Polygon polygon = new Polygon(
                            outer, inners);
                        geometry = polygon;
                        break;
                    }
                    else
                    { // there have to be other polygons.
                        {
                            multiPolygon = new MultiPolygon();
                            geometry     = multiPolygon;
                        }
                        Polygon polygon = new Polygon(
                            outer, inners);
                        multiPolygon.Add(polygon);
                    }
                }
                else
                { // unused rings left but they cannot be designated as 'outer'.
                    OsmSharp.Logging.Log.TraceEvent("OsmSharp.Osm.Interpreter.SimpleGeometryInterpreter", TraceEventType.Error,
                                                    "Invalid multipolygon relation: Unassigned rings left.");
                    break;
                }
            }
            return(geometry);
        }
コード例 #4
0
        public async Task AddInstance(Instance instance)
        {
            IJobController instanceController = null;
            var            geofences          = GeofenceController.Instance.GetGeofences(instance.Geofences);

            if (geofences == null)
            {
                // Failed to get geofence, skip?
                _logger.LogError($"[{instance.Name}] Failed to get geofences for instance, make sure it is assign at least one");
                return;
            }
            switch (instance.Type)
            {
            case InstanceType.CirclePokemon:
            case InstanceType.CircleRaid:
            case InstanceType.SmartCircleRaid:
                try
                {
                    var coords = new List <Coordinate>();
                    foreach (var geofence in geofences)
                    {
                        var area = geofence?.Data?.Area;
                        if (area is null)
                        {
                            _logger.LogError($"[{instance.Name}] Failed to get teleport circles, skipping...");
                            continue;
                        }
                        var coordsArray = (List <Coordinate>)
                                          (
                            area is List <Coordinate>
                            ?area
                            : JsonSerializer.Deserialize <List <Coordinate> >(Convert.ToString(area))
                                          );
                        coords.AddRange(coordsArray);
                    }
                    var minLevel = instance.MinimumLevel;
                    var maxLevel = instance.MaximumLevel;
                    switch (instance.Type)
                    {
                    case InstanceType.CirclePokemon:
                        instanceController = new CircleInstanceController(instance.Name, coords, CircleType.Pokemon, instance.Data.CircleRouteType, minLevel, maxLevel, instance.Data.AccountGroup, instance.Data.IsEvent);
                        break;

                    case InstanceType.CircleRaid:
                        instanceController = new CircleInstanceController(instance.Name, coords, CircleType.Raid, CircleRouteType.Default, minLevel, maxLevel, instance.Data.AccountGroup, instance.Data.IsEvent);
                        break;

                    case InstanceType.SmartCircleRaid:
                        // TODO: SmartCircleRaidInstanceController
                        break;
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError($"[{instance.Name}] Error: {ex}");
                }
                break;

            case InstanceType.AutoQuest:
            case InstanceType.PokemonIV:
            case InstanceType.Bootstrap:
            case InstanceType.FindTTH:
                try
                {
                    var multiPolygons = new List <MultiPolygon>();
                    var coordinates   = new List <List <Coordinate> >();
                    foreach (var geofence in geofences)
                    {
                        var area = geofence?.Data?.Area;
                        if (area is null)
                        {
                            _logger.LogError($"[{instance.Name}] Failed to get geofence area, skipping...");
                            continue;
                        }
                        var coordsArray = (List <List <Coordinate> >)
                                          (
                            area is List <List <Coordinate> >
                            ?area
                            : JsonSerializer.Deserialize <List <List <Coordinate> > >(json: Convert.ToString(area))
                                          );
                        coordinates.AddRange(coordsArray);

                        var areaArrayEmptyInner = new List <MultiPolygon>();
                        foreach (var coords in coordsArray)
                        {
                            var        multiPolygon = new MultiPolygon();
                            Coordinate first        = null;
                            for (var i = 0; i < coords.Count; i++)
                            {
                                var coord = coords[i];
                                if (i == 0)
                                {
                                    first = coord;
                                }
                                multiPolygon.Add(new Polygon(coord.Latitude, coord.Longitude));
                            }
                            if (first != null)
                            {
                                multiPolygon.Add(new Polygon(first.Latitude, first.Longitude));
                            }
                            areaArrayEmptyInner.Add(multiPolygon);
                        }
                        multiPolygons.AddRange(areaArrayEmptyInner);
                    }
                    var minLevel = instance.MinimumLevel;
                    var maxLevel = instance.MaximumLevel;
                    switch (instance.Type)
                    {
                    case InstanceType.AutoQuest:
                        var timezone       = instance.Data.Timezone;
                        var timezoneOffset = 0;
                        if (!string.IsNullOrEmpty(timezone))
                        {
                            var tz = TimeZoneService.Instance.Timezones.ContainsKey(timezone) ? TimeZoneService.Instance.Timezones[timezone] : null;
                            if (tz != null)
                            {
                                var tzData = TimeZoneService.Instance.Timezones[timezone];
                                timezoneOffset = instance.Data.EnableDst
                                            ? tzData.Dst * 3600
                                            : tzData.Utc * 3600;
                            }
                        }
                        var spinLimit       = instance.Data.SpinLimit ?? 3500;
                        var retryLimit      = instance.Data.QuestRetryLimit ?? 5;
                        var ignoreBootstrap = instance.Data.IgnoreS2CellBootstrap;
                        instanceController = new AutoInstanceController(instance.Name, multiPolygons, AutoType.Quest, timezoneOffset, minLevel, maxLevel, spinLimit, retryLimit, ignoreBootstrap, instance.Data.AccountGroup, instance.Data.IsEvent);
                        break;

                    case InstanceType.PokemonIV:
                        var ivList       = IVListController.Instance.GetIVList(instance.Data.IVList)?.PokemonIDs ?? new List <uint>();
                        var ivQueueLimit = instance.Data.IVQueueLimit ?? 100;
                        instanceController = new IVInstanceController(instance.Name, multiPolygons, ivList, minLevel, maxLevel, ivQueueLimit, instance.Data.AccountGroup, instance.Data.IsEvent);
                        break;

                    case InstanceType.Bootstrap:
                        var circleSize        = instance.Data.CircleSize ?? 70;
                        var fastBootstrapMode = instance.Data.FastBootstrapMode;
                        instanceController = new BootstrapInstanceController(instance.Name, coordinates, minLevel, maxLevel, circleSize, fastBootstrapMode, instance.Data.AccountGroup, instance.Data.IsEvent);
                        break;

                    case InstanceType.FindTTH:
                        instanceController = new SpawnpointFinderInstanceController(instance.Name, coordinates, minLevel, maxLevel, instance.Data.AccountGroup, instance.Data.IsEvent);
                        break;
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError($"[{instance.Name}] Error: {ex}");
                }
                break;
            }
            lock (_instancesLock)
            {
                _instances[instance.Name] = instanceController;
            }
            await Task.CompletedTask;
        }
コード例 #5
0
        private Geometry GroupRings(List <KeyValuePair <bool, LineairRing> > rings)
        {
            Geometry geometry1 = (Geometry)null;

            bool[][] containsFlags = new bool[rings.Count][];
            KeyValuePair <bool, LineairRing> ring;

            for (int index1 = 0; index1 < rings.Count; ++index1)
            {
                containsFlags[index1] = new bool[rings.Count];
                for (int index2 = 0; index2 < index1; ++index2)
                {
                    bool[] flagArray = containsFlags[index1];
                    int    index3    = index2;
                    ring = rings[index1];
                    LineairRing lineairRing1 = ring.Value;
                    ring = rings[index2];
                    LineairRing lineairRing2 = ring.Value;
                    int         num          = lineairRing1.Contains(lineairRing2) ? 1 : 0;
                    flagArray[index3] = num != 0;
                }
            }
            bool[]       used         = new bool[rings.Count];
            MultiPolygon multiPolygon = (MultiPolygon)null;

            while (((IEnumerable <bool>)used).Contains <bool>(false))
            {
                LineairRing outline = (LineairRing)null;
                int         index   = -1;
                for (int ringIdx = 0; ringIdx < rings.Count; ++ringIdx)
                {
                    if (!used[ringIdx] && this.CheckUncontained(rings, containsFlags, used, ringIdx))
                    {
                        ring = rings[ringIdx];
                        if (!ring.Key)
                        {
                            Log.TraceEvent("OsmSharp.Osm.Interpreter.SimpleGeometryInterpreter", TraceEventType.Error, "Invalid multipolygon relation: an 'inner' ring was detected without an 'outer'.");
                        }
                        index         = ringIdx;
                        ring          = rings[ringIdx];
                        outline       = ring.Value;
                        used[ringIdx] = true;
                        break;
                    }
                }
                if (outline != null)
                {
                    List <LineairRing> lineairRingList1 = new List <LineairRing>();
                    for (int ringIdx = 0; ringIdx < rings.Count; ++ringIdx)
                    {
                        if (!used[ringIdx] && containsFlags[index][ringIdx] && this.CheckUncontained(rings, containsFlags, used, ringIdx))
                        {
                            List <LineairRing> lineairRingList2 = lineairRingList1;
                            ring = rings[ringIdx];
                            LineairRing lineairRing = ring.Value;
                            lineairRingList2.Add(lineairRing);
                            used[ringIdx] = true;
                        }
                    }
                    bool flag = !((IEnumerable <bool>)used).Contains <bool>(false);
                    if (((multiPolygon != null ? 0 : (lineairRingList1.Count == 0 ? 1 : 0)) & (flag ? 1 : 0)) != 0)
                    {
                        geometry1 = (Geometry)outline;
                        break;
                    }
                    if (multiPolygon == null & flag)
                    {
                        geometry1 = (Geometry) new Polygon(outline, (IEnumerable <LineairRing>)lineairRingList1);
                        break;
                    }
                    multiPolygon = new MultiPolygon();
                    geometry1    = (Geometry)multiPolygon;
                    Polygon geometry2 = new Polygon(outline, (IEnumerable <LineairRing>)lineairRingList1);
                    multiPolygon.Add(geometry2);
                }
                else
                {
                    Log.TraceEvent("OsmSharp.Osm.Interpreter.SimpleGeometryInterpreter", TraceEventType.Error, "Invalid multipolygon relation: Unassigned rings left.");
                    break;
                }
            }
            return(geometry1);
        }
コード例 #6
0
        public IMultiPolygon CreateMultiPolygon(IEnumerable<IPolygon> polygons)
        {
            MultiPolygon mp = new MultiPolygon();
            mp.Factory = this;

            foreach (Polygon polygon in polygons)
            {
                mp.Add(polygon);
            }

            return mp;
        }