reverse-geocoding 0.1.0.2 → 0.1.1.0
raw patch · 2 files changed
+19/−4 lines, 2 files
Files
reverse-geocoding.cabal view
@@ -1,5 +1,5 @@ name: reverse-geocoding-version: 0.1.0.2+version: 0.1.1.0 synopsis: Simple reverse geocoding using OpenStreeMap description: Simple reverse geocoding using OpenStreeMap homepage: https://github.com/jcristovao/reverse-geocoding
src/Data/Geolocation/Reverse/Providers.hs view
@@ -9,16 +9,18 @@ ( ReverseGeoJsonKey , ReverseGeoParser , ReverseGeoProvider-- , openStreetMap+ , openStreetMap -- ^ Only one supported right now ) where import Control.Applicative +import Data.Char import Data.Monoid+import Data.Maybe import Data.Aeson import Data.Aeson.Types+import Control.Monad (join) import qualified Data.Text as T import Data.Geolocation.Reverse.Types@@ -43,9 +45,22 @@ <> "&lon=" <> show lon +getPostCodeText :: Suburb -> Maybe Suburb+getPostCodeText (Suburb txt) = let+ rest = T.dropWhile (\c -> isDigit c || isSpace c || (c == '-')) txt+ in if T.null rest then Nothing else Just (Suburb rest)++(<||>) :: Parser (Maybe a) -> Parser (Maybe a) -> Parser (Maybe a)+pa <||> pb = do+ a <- pa+ if isJust a then pa else pb++-- Not all records have suburb defined, but some have it written in the post code+-- This function tries to extract if from the post code if available.+openStreetMapParser :: Object -> Parser ParsedLocationInfo openStreetMapParser o = ParsedLocationInfo <$> o .: "country_code" <*> o .: "city"- <*> o .:? "suburb"+ <*> ((o .:? "suburb") <||> fmap (join . fmap getPostCodeText) ( o .:? "postcode")) <*> ((o .:? "road") <|> (o .:? "street")) <*> o .:? "postcode"