diff --git a/geojson-types.cabal b/geojson-types.cabal
--- a/geojson-types.cabal
+++ b/geojson-types.cabal
@@ -1,5 +1,5 @@
 name:                geojson-types
-version:             0.1.1
+version:             0.1.2
 synopsis:            GeoJSON data types including JSON/BSON conversion.
 homepage:            https://github.com/alios/geojson-types/
 bug-reports:         https://github.com/alios/geojson-types/issues
@@ -25,7 +25,7 @@
             'Double' to a 'Position', use the '_Position' 'Iso' as a
             'Getter' on that pair:
             .
-            > _Position :: BaseType t => (t, t) -> Position t
+            > _Position :: BaseType t => Iso' (t, t) (Position t)
             >
             > pos :: Position Double
             > pos = (57.324, 7.2342) ^. _Position
@@ -78,10 +78,11 @@
                        ConstraintKinds, 
                        RankNTypes, 
                        TypeFamilies
-  build-depends:       base >=4.8 && <4.9, 
-                       lens >=4.14, 
-                       aeson >=0.11, 
-                       bson >=0.3, 
+  build-depends:       aeson >=0.11,
+                       base >=4.8 && <4.9,
+                       bson >=0.3,
+                       bytestring >= 0.10,
+                       lens >=4.14,
                        text >=1.2
   hs-source-dirs:      src
   default-language:    Haskell2010
diff --git a/src/Data/GeoJSON.hs b/src/Data/GeoJSON.hs
--- a/src/Data/GeoJSON.hs
+++ b/src/Data/GeoJSON.hs
@@ -1,11 +1,19 @@
 module Data.GeoJSON
        ( module Data.GeoJSON.Objects,
          module Data.GeoJSON.Features,
-         module Data.GeoJSON.Classes
+         module Data.GeoJSON.Classes,
+         readFeatureCollection
        ) where
 
 import Data.GeoJSON.Objects
 import Data.GeoJSON.Features
 import Data.GeoJSON.Classes
+import qualified Data.Aeson as Aeson
+import qualified Data.ByteString.Lazy as BL
+import Control.Lens.Operators
 
-       
+
+readFeatureCollection ::
+  BaseType t => FilePath -> IO (Either String (FeatureCollection Aeson.Value t))
+readFeatureCollection f = Aeson.eitherDecode <$>  BL.readFile f
+
diff --git a/src/Data/GeoJSON/Objects.hs b/src/Data/GeoJSON/Objects.hs
--- a/src/Data/GeoJSON/Objects.hs
+++ b/src/Data/GeoJSON/Objects.hs
@@ -32,7 +32,7 @@
          -- ** Line String         
          LineString, _LineString,
          -- ** Linear Ring 
-         LinearRing, _LinearRing,
+         LinearRing, _LinearRing, closeLineString,
          -- ** MultiLineString
          MultiLineString, _MultiLineString,
          -- ** Polygon 
@@ -44,7 +44,7 @@
          -- * Geometry Collection
          GeometryCollection, newCollection, insert,
          -- * Support types
-         HasFlatCoordinates(..), boundingBox,
+         HasFlatCoordinates(..), BoundingBox, boundingBox,
          GeoJSON, BaseType, GeoJSONObject
        ) where
 
@@ -170,6 +170,15 @@
           in if (head ps == last ps) && (length ps >= 4)
              then pure $ LinearRing ls
              else Nothing
+
+-- | create 'LinearRing' from 'LineString' by closing it.
+closeLineString ::
+  BaseType t => GeoJSON LineString t -> Maybe (GeoJSON LinearRing t)
+closeLineString ls =
+  let ps = review _LineString ls
+  in if head ps == last ps
+     then preview _LinearRing ls
+     else preview _LineString (last ps : ps) >>= preview _LinearRing
 
 
 -- | see also: http://geojson.org/geojson-spec.html#multilinestring
