public CountryInfo(Continent continent, string administrativeName, IGeometry geomentryData, Uri smallFlag, Uri largeFlag, bool longitudeWrap, int zIndex, double toleranceLow, double toleranceHi) { Continent = continent; AdministrativeName = administrativeName; if (geomentryData is Polygon) { var delta = ((Polygon)geomentryData).GetArea().Value; GeomentryData = new List <GeoPolygon> { ConvertPolygon((Polygon)geomentryData, false, longitudeWrap) }; } else if (geomentryData is MultiPolygon) { var polygons = ((MultiPolygon)geomentryData).Geometries .Cast <Polygon>() .Where(p => p.GetArea().Value > 0) .Select(p => new { Polygon = p, Area = p.GetArea().Value, Bounds = p.GetBounds() }) .ToList(); var countryBounds = geomentryData.GetBounds(); var area = polygons.MaxBy(a => a.Area); var dist = Math.Sqrt( Math.Pow(countryBounds.MaxLon - countryBounds.MinLon - area.Bounds.MaxLon + area.Bounds.MinLon, 2) + Math.Pow(countryBounds.MaxLat - countryBounds.MinLat - area.Bounds.MaxLat + area.Bounds.MinLat, 2) ); var total = polygons.Sum(a => a.Area); GeomentryData = polygons .Select(p => ConvertPolygon(p.Polygon, p.Area / total < (toleranceLow + toleranceHi * GetDistance(area.Bounds, p.Bounds) / dist), longitudeWrap)) .ToList(); } else { GeomentryData = new List <GeoPolygon>(); } var bounds = GeomentryData.Where(p => !p.Ignored); Bounds = new GeoBounds( bounds.Min(p => p.Bounds.Left), bounds.Min(p => p.Bounds.Top), bounds.Max(p => p.Bounds.Right), bounds.Max(p => p.Bounds.Bottom)); SmallFlag = smallFlag; LargeFlag = largeFlag; Borders = new List <IBorderInfo>(); ZIndex = zIndex; IsSmall = GeomentryData.Max(g => g.Area) < SmallCountryAreaThreshold; }