예제 #1
0
        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;
        }