         conditions (mapcat (fn [g] (geometry->conditions g context)) geometries)]
     (debug (format "CONDITIONS: %s" conditions))
     [conditions point-count]))
+
+(defn features->conditions
+  "Converts a list of features into a vector of SpatialConditions"
+  [features mime-type]
+  (validate-features features)
+  (let [iterator (.iterator features)]
+    (loop [conditions []]
+      (if (.hasNext iterator)
+        (let [feature (.next iterator)
+              [feature-conditions _] (feature->conditions feature (winding-opts mime-type))]
+          (if (> (count feature-conditions) 0)
+            (recur (conj conditions (gc/or-conds feature-conditions)))
+            (recur conditions)))
+        conditions))))
 
 (defn error-if
   "Throw a service error with the given message if `f` applied to `item` is true. 

        (errors/throw-service-error :bad-request (format "Cannot transform source CRS [%s] to WGS 84" src-crs-name))))
    geometry))

(defn feature->conditions
  "Process the contents of a Feature to return query conditions along with number of points in
  the processed Feature. The `context` map can be used to pass along additional info."

  "The maximum number of points a shapefile can have"
  {:default 5000 :type Long})

(defn winding-opts
  "Get the opts for a call to `normalize-polygon-winding` based on file type"
  [mime-type]
  (case mime-type
    "application/shapefile+zip" {:boundary-winding :cw}
    "application/vnd.google-earth.kml+xml" {}
    "application/geo+json" {:hole-winding :cw}))

(defn unzip-file
  "Unzip a file (of type File) into a temporary directory and return the directory path as a File"
  [source]
