public static SpatialHashSearcher <SegmentIndex> CreateSpatialSearcher(
            MultiLinestring multiLinestring, double?knownAverageSegmentLength = null)
        {
            if (multiLinestring.SegmentCount < _segmentCountThreshold)
            {
                return(null);
            }

            double gridSize;

            if (knownAverageSegmentLength != null)
            {
                gridSize = EstimateOptimalGridSize(knownAverageSegmentLength.Value);
            }
            else
            {
                gridSize =
                    multiLinestring.SegmentCount > 0
                                                ? EstimateOptimalGridSize(multiLinestring.GetLinestrings())
                                                : 100;
            }

            var result = new SpatialHashSearcher <SegmentIndex>(
                multiLinestring.XMin, multiLinestring.YMin,
                gridSize, multiLinestring.SegmentCount, 5);

            Populate(result, multiLinestring);

            return(result);
        }
 private static void Populate(SpatialHashSearcher <int> spatialSearcher,
                              Linestring linestring)
 {
     for (var i = 0; i < linestring.SegmentCount; i++)
     {
         Line3D line = linestring[i];
         spatialSearcher.Add(i, line.XMin, line.YMin, line.XMax, line.YMax);
     }
 }
 private static void Populate(SpatialHashSearcher <int> spatialSearcher,
                              IPointList pointList)
 {
     for (var i = 0; i < pointList.PointCount; i++)
     {
         IPnt pnt = pointList.GetPoint(i);
         spatialSearcher.Add(i, pnt.X, pnt.Y, pnt.X, pnt.Y);
     }
 }
        public static SpatialHashSearcher <int> CreateSpatialSearcher(
            Linestring forLinestring, double gridSize)
        {
            var result = new SpatialHashSearcher <int>(
                forLinestring.XMin, forLinestring.YMin,
                gridSize, forLinestring.SegmentCount, 5);

            Populate(result, forLinestring);

            return(result);
        }
        public static SpatialHashSearcher <int> CreateSpatialSearcher <TP>(
            Multipoint <TP> multipoint, double gridSize) where TP : IPnt
        {
            var result = new SpatialHashSearcher <int>(
                multipoint.XMin, multipoint.YMin,
                gridSize, multipoint.PointCount, 5);

            Populate(result, multipoint);

            return(result);
        }
        public static SpatialHashSearcher <T> CreateSpatialSearcher(
            [NotNull] IList <T> values,
            Func <T, EnvelopeXY> getBoundsFunc,
            double gridSize = double.NaN)
        {
            Assert.ArgumentCondition(values.Count > 0, "Empty value list");

            List <EnvelopeXY> valueEnvelopes =
                values.Select(getBoundsFunc).ToList();

            EnvelopeXY fullExtent;
            double     averageEnvLateralLength;

            GetEnvelopeStatistics(valueEnvelopes, out fullExtent,
                                  out averageEnvLateralLength);

            if (double.IsNaN(averageEnvLateralLength))
            {
                if (double.IsNaN(gridSize))
                {
                    throw new ArgumentException(
                              "Cannot derive grid size from values, please provide a grid size > 0.");
                }

                averageEnvLateralLength = gridSize;
            }

            Assert.NotNull(fullExtent);

            double maxTileCount = (fullExtent.Width * fullExtent.Height) /
                                  (averageEnvLateralLength * averageEnvLateralLength);

            if (double.IsNaN(gridSize))
            {
                gridSize = averageEnvLateralLength * 2;
            }

            double estimatedItemsPerTile = maxTileCount / values.Count;

            var result =
                new SpatialHashSearcher <T>(
                    fullExtent.XMin, fullExtent.YMin, gridSize, (int)maxTileCount,
                    estimatedItemsPerTile);

            // populate
            for (int i = 0; i < values.Count; i++)
            {
                result.Add(values[i], valueEnvelopes[i]);
            }

            return(result);
        }
        public static SpatialHashSearcher <SegmentIndex> CreateSpatialSearcher(
            MultiLinestring multiLinestring, double gridSize)
        {
            if (multiLinestring.SegmentCount < _segmentCountThreshold)
            {
                return(null);
            }

            var result = new SpatialHashSearcher <SegmentIndex>(
                multiLinestring.XMin, multiLinestring.YMin,
                gridSize, multiLinestring.SegmentCount, 5);

            Populate(result, multiLinestring);

            return(result);
        }
        private static void Populate(
            SpatialHashSearcher <SegmentIndex> spatialSearcher,
            MultiLinestring multiLinestring)
        {
            for (int i = 0; i < multiLinestring.Count; i++)
            {
                var linestring = multiLinestring.GetLinestring(i);

                for (var j = 0; j < linestring.SegmentCount; j++)
                {
                    Line3D line = linestring[j];
                    spatialSearcher.Add(new SegmentIndex(i, j),
                                        line.XMin, line.YMin, line.XMax, line.YMax);
                }
            }
        }