Use a numeric feature ID instead of directly copying the string ID from the shapefile

N.B. Please leave merging the branch to me (Urmila) - without running the appropriate migration script immediately afterwards (which I am still working on), staging will be broken.
You can enable pattern matching to make this more succinct:

    def numericId: Int = feature.getID match {
      case FeatureNumericIdPattern(idString) => Try(....)
      case _ => 

though you'd have to modify the pattern match slightly.... to `.+(\d+)$` as then it will pattern match on the whole string.

Another possibility, which lets you only throw once, is:

    FeatureNumericIdPattern.findFirstIn(feature.getID).flatMap { idString => Try(idString.toInt).toOption }
        .getOrElse(throw new ....)

Then it throws when either number cannot be found or the conversion fails.  Though if it's really just a number shouldn't matter.