/// <summary>
 /// Converts a <see cref="IPoint"/> to a <see cref="DSPoint"/>
 /// </summary>
 /// <param name="geometry">The <see cref="IPoint"/> to convert</param>
 /// <param name="factory">The factory to create the <see cref="DSPoint"/></param>
 /// <param name="setUserData">Sets the <see cref="DSGeometry.UserData"/> to <paramref name="geometry"/>.UserData</param>
 /// <returns>The converted geometry</returns>
 public static DSPoint ToDotSpatial(this IPoint geometry, DSGeometryFactory factory = null, bool setUserData = false)
 {
     var useFactory = factory ?? Default;
     return FromPoint(geometry, useFactory, setUserData);
 }
 /*
 private static DSCoordinateSequence FromCoordinateSequence(ICoordinateSequence coordinateSequence, DSCoordinateSequenceFactory factory)
 {
     var coordinates = ConvertCoordinates(coordinateSequence.ToCoordinateArray());
     return factory.Create(coordinates);
 }
  */
 private static DSPoint FromPoint(IPoint geometry, DSGeometryFactory factory, bool setUserData)
 {
     var coord = FromCoordinate(geometry.Coordinate);
     var result = factory.CreatePoint(coord);
     if (setUserData)
         result.UserData = geometry.UserData;
     return result;
 }
 private static DSPolygon FromPolygon(IPolygon geometry, DSGeometryFactory factory, bool setUserData)
 {
     var shell = (DSLinearRing)FromLineString(geometry.Shell, factory, setUserData);
     DSLinearRing[] holes = null;
     if (geometry.Holes != null && geometry.Holes.Length > 0)
     {
         holes = new DSLinearRing[geometry.Holes.Length];
         for (var i = 0; i < holes.Length; i++)
             holes[i] = (DSLinearRing)FromLineString(geometry.Holes[i], factory, setUserData);
     }
     var result = factory.CreatePolygon(shell, holes);
     if (setUserData)
         result.UserData = geometry.UserData;
     return result;
 }
 private static DSMultiPoint FromMultiPoint(IMultiPoint geometry, DSGeometryFactory factory, bool setUserData)
 {
     var result = factory.CreateMultiPoint(FromCoordinates(geometry.Coordinates));
     if (setUserData)
         result.UserData = geometry.UserData;
     return result;
 }
        private static DSMultiPolygon FromMultiPolygon(IMultiPolygon geometry, DSGeometryFactory factory, bool setUserData)
        {
            var dsPolygons = new DotSpatial.Topology.IPolygon[geometry.NumGeometries];

            for (var i = 0; i < dsPolygons.Length; i++)
                dsPolygons[i] = FromPolygon((IPolygon)geometry.GetGeometryN(i), factory, setUserData);

            var result = factory.CreateMultiPolygon(dsPolygons);
            if (setUserData)
                result.UserData = geometry.UserData;
            return result;
        }
 private static DSLineString FromLineString(ILineString geometry, DSGeometryFactory factory, bool setUserData)
 {
     var coordinates = FromCoordinates(geometry.Coordinates);
     var result = (geometry is ILinearRing)
                      ? factory.CreateLinearRing(coordinates)
                      : factory.CreateLineString(coordinates);
     if (setUserData)
         result.UserData = geometry.UserData;
     return result;
 }
        private static DSMultiLineString FromMultiLineString(IMultiLineString geometry, DSGeometryFactory factory, bool setUserData)
        {
            var dsLineStrings = new DotSpatial.Topology.IBasicLineString[geometry.NumGeometries];

            for (var i = 0; i < dsLineStrings.Length; i++)
                dsLineStrings[i] = FromLineString((ILineString)geometry.GetGeometryN(i), factory, setUserData);

            var result = factory.CreateMultiLineString(dsLineStrings);
            if (setUserData)
                result.UserData = geometry.UserData;
            return result;
        }
        private static DSGeometryCollection FromGeometryCollection(IGeometryCollection geometry, DSGeometryFactory factory, bool setUserData)
        {
            var dsGeometries = new DotSpatial.Topology.IGeometry[geometry.NumGeometries];

            for (var i = 0; i < dsGeometries.Length; i++)
                dsGeometries[i] = FromGeometry(geometry.GetGeometryN(i), factory, setUserData);

            var result = factory.CreateGeometryCollection(dsGeometries);
            if (setUserData)
                result.UserData = geometry.UserData;
            return result;
        }
        private static DSGeometry FromGeometry(IGeometry geometry, DSGeometryFactory factory, bool setUserData)
        {
            if (geometry == null)
                throw new ArgumentNullException("geometry");

            if (factory == null)
                throw new ArgumentNullException("factory");

            switch (geometry.OgcGeometryType)
            {
                case OgcGeometryType.Point:
                    return FromPoint((IPoint)geometry, factory, setUserData);
                case OgcGeometryType.LineString:
                    return FromLineString((ILineString)geometry, factory, setUserData);
                case OgcGeometryType.Polygon:
                    return FromPolygon((IPolygon)geometry, factory, setUserData);
                case OgcGeometryType.MultiPoint:
                    return FromMultiPoint((IMultiPoint)geometry, factory, setUserData);
                case OgcGeometryType.MultiLineString:
                    return FromMultiLineString((IMultiLineString)geometry, factory, setUserData);
                case OgcGeometryType.MultiPolygon:
                    return FromMultiPolygon((IMultiPolygon)geometry, factory, setUserData);
                case OgcGeometryType.GeometryCollection:
                    return FromGeometryCollection((IGeometryCollection)geometry, factory, setUserData);
                default:
                    throw new ArgumentException();
            }
        }
 /// <summary>
 /// Converts a <see cref="System.Collections.Generic.IList{IGeometry}"/> to a <see cref="System.Collections.Generic.IList{DSGeometry}"/>
 /// </summary>
 /// <param name="geometries">The <see cref="System.Collections.Generic.IList{IGeometry}"/> to convert</param>
 /// <param name="factory">The factory to create the <see cref="System.Collections.Generic.IList{DSGeometry}"/></param>
 /// <param name="setUserData">Sets the <see cref="DSGeometry.UserData"/> to <paramref name="geometries"/>.UserData</param>
 /// <returns>The converted geometry</returns>
 public static IList<DSGeometry> ToDotSpatial(this IList<IGeometry> geometries, DSGeometryFactory factory = null, bool setUserData = false)
 {
     var useFactory = factory ?? Default;
     return geometries.Select(geometry => FromGeometry(geometry, useFactory, setUserData)).ToList();
 }
 /// <summary>
 /// Converts a <see cref="IGeometryCollection"/> to a <see cref="DSGeometryCollection"/>
 /// </summary>
 /// <param name="geometry">The <see cref="IGeometryCollection"/> to convert</param>
 /// <param name="factory">The factory to create the <see cref="DSGeometryCollection"/></param>
 /// <param name="setUserData">Sets the <see cref="DSGeometry.UserData"/> to <paramref name="geometry"/>.UserData</param>
 /// <returns>The converted geometry</returns>
 public static DSGeometryCollection ToDotSpatial(this IGeometryCollection geometry, DSGeometryFactory factory = null, bool setUserData = false)
 {
     var useFactory = factory ?? Default;
     return FromGeometryCollection(geometry, useFactory, setUserData);
 }
 /// <summary>
 /// Converts a <see cref="IMultiLineString"/> to a <see cref="DSMultiLineString"/>
 /// </summary>
 /// <param name="geometry">The <see cref="IMultiLineString"/> to convert</param>
 /// <param name="factory">The factory to create the <see cref="DSMultiLineString"/></param>
 /// <param name="setUserData">Sets the <see cref="DSGeometry.UserData"/> to <paramref name="geometry"/>.UserData</param>
 /// <returns>The converted geometry</returns>
 public static DSMultiLineString ToDotSpatial(this IMultiLineString geometry, DSGeometryFactory factory = null, bool setUserData = false)
 {
     var useFactory = factory ?? Default;
     return FromMultiLineString(geometry, useFactory, setUserData);
 }