public BaseTileBasedDataProcessor(MapWriterConfiguration configuration) : base()
        {
            this.boundingbox = configuration.BboxConfiguration;
            this.zoomIntervalConfiguration = configuration.ZoomIntervalConfiguration;
            this.tileGridLayouts           = new TileGridLayout[this.zoomIntervalConfiguration.NumberOfZoomIntervals];
            this.bboxEnlargement           = configuration.BboxEnlargement;
            this.preferredLanguages        = configuration.PreferredLanguages;
            this.skipInvalidRelations      = configuration.SkipInvalidRelations;

            this.outerToInnerMapping            = new TLongObjectHashMap <>();
            this.innerWaysWithoutAdditionalTags = new TLongHashSet();
            this.tilesToCoastlines = new Dictionary <>();

            this.countWays          = new float[this.zoomIntervalConfiguration.NumberOfZoomIntervals];
            this.countWayTileFactor = new float[this.zoomIntervalConfiguration.NumberOfZoomIntervals];

            this.histogramPoiTags = new TShortIntHashMap();
            this.histogramWayTags = new TShortIntHashMap();

            // compute horizontal and vertical tile coordinate offsets for all
            // base zoom levels
            for (int i = 0; i < this.zoomIntervalConfiguration.NumberOfZoomIntervals; i++)
            {
                TileCoordinate upperLeft = new TileCoordinate((int)MercatorProjection.longitudeToTileX(this.boundingbox.minLongitude, this.zoomIntervalConfiguration.getBaseZoom(i)), (int)MercatorProjection.latitudeToTileY(this.boundingbox.maxLatitude, this.zoomIntervalConfiguration.getBaseZoom(i)), this.zoomIntervalConfiguration.getBaseZoom(i));
                this.tileGridLayouts[i] = new TileGridLayout(upperLeft, computeNumberOfHorizontalTiles(i), computeNumberOfVerticalTiles(i));
            }
        }
        /// <summary>
        /// Create a new ZoomIntervalConfiguration from the given string representation. Checks for validity.
        /// </summary>
        /// <param name="confString">
        ///            the string representation of a zoom interval configuration </param>
        /// <returns> a new zoom interval configuration </returns>
        public static ZoomIntervalConfiguration fromString(string confString)
        {
            string[] splitted = confString.Split(",", true);
            if (splitted.Length % 3 != 0)
            {
                throw new System.ArgumentException("invalid zoom interval configuration, amount of comma-separated values must be a multiple of 3");
            }
//JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java:
//ORIGINAL LINE: sbyte[][] intervals = new sbyte[splitted.Length / 3][3];
            sbyte[][] intervals = RectangularArrays.ReturnRectangularSbyteArray(splitted.Length / 3, 3);
            for (int i = 0; i < intervals.Length; i++)
            {
                intervals[i][0] = sbyte.Parse(splitted[i * 3]);
                intervals[i][1] = sbyte.Parse(splitted[i * 3 + 1]);
                intervals[i][2] = sbyte.Parse(splitted[i * 3 + 2]);
            }

            return(ZoomIntervalConfiguration.newInstance(intervals));
        }