Example #1
0
 public virtual IShape GetBuffered(double distance, SpatialContext ctx)
 {
     if (ctx.IsGeo)
     {
         //first check pole touching, triggering a world-wrap rect
         if (maxY + distance >= 90)
         {
             return(ctx.MakeRectangle(-180, 180, Math.Max(-90, minY - distance), 90));
         }
         else if (minY - distance <= -90)
         {
             return(ctx.MakeRectangle(-180, 180, -90, Math.Min(90, maxY + distance)));
         }
         else
         {
             //doesn't touch pole
             double latDistance    = distance;
             double closestToPoleY = (maxY - minY > 0) ? maxY : minY;
             double lonDistance    = DistanceUtils.CalcBoxByDistFromPt_deltaLonDEG(
                 closestToPoleY, minX, distance); //lat,lon order
                                                  //could still wrap the world though...
             if (lonDistance * 2 + Width >= 360)
             {
                 return(ctx.MakeRectangle(-180, 180, minY - latDistance, maxY + latDistance));
             }
             return(ctx.MakeRectangle(
                        DistanceUtils.NormLonDEG(minX - lonDistance),
                        DistanceUtils.NormLonDEG(maxX + lonDistance),
                        minY - latDistance, maxY + latDistance));
         }
     }
     else
     {
         IRectangle worldBounds = ctx.WorldBounds;
         double     newMinX     = Math.Max(worldBounds.MinX, minX - distance);
         double     newMaxX     = Math.Min(worldBounds.MaxX, maxX + distance);
         double     newMinY     = Math.Max(worldBounds.MinY, minY - distance);
         double     newMaxY     = Math.Min(worldBounds.MaxY, maxY + distance);
         return(ctx.MakeRectangle(newMinX, newMaxX, newMinY, newMaxY));
     }
 }