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); }
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 }
/// <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); }
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; }
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); }
public IMultiPolygon CreateMultiPolygon(IEnumerable<IPolygon> polygons) { MultiPolygon mp = new MultiPolygon(); mp.Factory = this; foreach (Polygon polygon in polygons) { mp.Add(polygon); } return mp; }