úÎaÖ]±@      !"#$%&'()*+,-./0123456789:;<=>?None See Section 2.3 Feature Collection Objects of the GeoJSON spec See Section 2.2 Feature Objects of the GeoJSON spec. See Section 4 Bounding Boxes of the GeoJSON spec,  The length of the list/Qarray must be 2*n where n is the dimensionality of the position type for the CRS D with min values first followed by the max values, wich both the min/3max sets following the same axis order as the CRS, E e.g for WGS84: minLongitude, minLatitude, maxLongitude, maxLatitude \ The spec mentions that it can be part of a geometry object too but doesnt give an example, \ This implementation will ignore bboxes on Geometry objects, they can be added if required. According to section 2.2 Feature Objects of the GeoJSON spec, the  properties object S can be any JSON object, or a null value, we may as well just make it a Type Alias R for JSValue, even though it has a wider scope (Integer, Rational, String etc...) a to take advantage of the solid JSON code out there to handle generic objects and the null value See Section 3 #Coordinate Reference System Objects in the GeoJSON Spec  NoCRS is required because no crs9 attribute in a GeoJSON feature is NOT the same thing as  a null crs attribute. no crs7 value implies the default CRS, while a null CRS means X you cannot assume a CRS, null will mapped to NoCRS while a non-existent attribute will $ be mapped to a Nothing Maybe value See section 2.1 Geometry Objects in the GeoJSON Spec. 3see Section 2.1.1 Position in the GeoJSON Spec, J I make the assumption here that the only position types we will use will  involve easting northing (+- Altitude) or lonlat (+ - Altitude) 8( WithoutCRSG is a catch all for indeterminate CRSs and for expression of positions " before a CRS has been determined >Ithe GeoPosition is a bit special in that when you convert it to GeoJSON, E it will lose the CRS info attached to it and cannot be read back in D from the GeoJSON. Hence it is ineligible for the JSON type class, S so this function will strip it down to a GeoPositionWithoutCRS, which is eligible ?'The default CRS according to Section 3 #Coordinate Reference System Objects is WGS84 which I believe,  from http:spatialreference.orgrefepsg4326 -> [JSON](http:spatialreference.orgrefepsg4326json/  WGS84 in JSON)  is represented thus: @  !"#$%&'()*+,-./0123456789:;<=>?@  !"#$%&'()*+,-./0123456789:;<=>?@=<;:983765412/0-.+,)*'($&%#"!   >?  #"! $&%'()*+,-./0123765489:;<=>?None@@A generic function that can be used to read in the GeoJSON for: P GeoPoint, GeoMultiPoint, GeoLine, GeoMultiLine, GeoPolygon and GeoMultiPolygon G Takes in a String for the GeoJSON geometry type, the type constructor : for the datatype and the JSON object containing both the 'type' val and the  coordinates val A]The inverse to the above, you just give it the type string and the value for the coordinates $ and it will create the JSON object B,get an optional value out of a JSON object: COThe other way around, given an optional value, will return the attributes that & should be added to the makeObj input DBEncodes and Decodes FeatureCollection objects to and from GeoJSON =encode bigAssFeatureCollection == bigAssFeatureCollectionJSONTrue@decode bigAssFeatureCollectionJSON == Ok bigAssFeatureCollectionTrueQencode bigAssFeatureCollectionWithNoBBox == bigAssFeatureCollectionWithNoBBoxJSONTrueTdecode bigAssFeatureCollectionWithNoBBoxJSON == Ok bigAssFeatureCollectionWithNoBBoxTrueKencode emptyFeatureCollectionWithBBox == emptyFeatureCollectionWithBBoxJSONTrueNdecode emptyFeatureCollectionWithBBoxJSON == Ok emptyFeatureCollectionWithBBoxTrue;encode emptyFeatureCollection == emptyFeatureCollectionJSONTrue>decode emptyFeatureCollectionJSON == Ok emptyFeatureCollectionTrueE8encodes and decodes Feature objects to and from GeoJSON #encode bigFeature == bigFeatureJSONTrue&decode bigFeatureJSON == Ok bigFeatureTrue=encode featureWithNoProperties == featureWithNoPropertiesJSONTrue@decode featureWithNoPropertiesJSON == Ok featureWithNoPropertiesTrue-encode featureWithNoId == featureWithNoIdJSONTrue0decode featureWithNoIdJSON == Ok featureWithNoIdTrue1encode featureWithNoBBox == featureWithNoBBoxJSONTrue4decode featureWithNoBBoxJSON == Ok featureWithNoBBoxTrue9encode featureWithNoGeometry == featureWithNoGeometryJSONTrue<decode featureWithNoGeometryJSON == Ok featureWithNoGeometryTrueF3encode and decodes CRS Objects to and from GeoJSON %encode testLinkCRS == testLinkCRSJSONTrue(decode testLinkCRSJSON == Ok testLinkCRSTrue'encode testNamedCRS == testNamedCRSJSONTrue*decode testNamedCRSJSON == Ok testNamedCRSTrueencode testEPSG == testEPSGJSONTrue"decode testEPSGJSON == Ok testEPSGTrue encode NoCRS"null"decode "null" == Ok NoCRSTrueG9encodes and decodes Geometry Objects to and from GeoJSON 9 (refer to source to see the values for the test values) encode NoGeometry"null"*decode "null" :: Result GeospatialGeometry Ok NoGeometry%encode lShapedPoly == lShapedPolyJSONTrue(decode lShapedPolyJSON == Ok lShapedPolyTrue!encode emptyPoly == emptyPolyJSONTrue$decode emptyPolyJSON == Ok emptyPolyTrue+encode emptyMultiPoly == emptyMultiPolyJSONTrue.decode emptyMultiPolyJSON == Ok emptyMultiPolyTrue5encode singleLineMultiLine == singleLineMultiLineJSONTrue8decode singleLineMultiLineJSON == Ok singleLineMultiLineTrue!encode multiLine == multiLineJSONTrue$decode multiLineJSON == Ok multiLineTrue-encode emptyCollection == emptyCollectionJSONTrue0decode emptyCollectionJSON == Ok emptyCollectionTrue/encode bigassCollection == bigassCollectionJSONTrue2decode bigassCollectionJSON == Ok bigassCollectionTrue@AHIJBCDEFGKLMNOP@AHIJBCDEFGKLMNOPQ      !"#$%&'(())**++,,--./0123456789:;<=>?@ABCDEFGHIJKL geojson-0.0.2Data.Geospatial Text.GeoJSONGeoFeatureCollection GeoFeaturebboxgeometry properties featureIdBoundingBoxWithoutCRSGeoPropertyObject GeoPropertyPropertyObject IntPropertyDoubleProperty FloatPropertyStringProperty FeatureID CRSObject LinkedCRSEPSGNamedCRSNoCRSProjectionType FormatStringHrefCodeNameGeospatialGeometry Collection MultiLineLine MultiPolygonPolygon MultiPointPoint NoGeometry GeoPolyLine LineStringPoly GeoMultiLineGeoLineGeoMultiPolygon GeoPolygon GeoMultiPointGeoPoint GeoPositionEastingNorthingAltEastingNorthing LonLatAltLonLatGeoPositionWithoutCRSAltitudeNorthingEasting LongitudeLatitudestripCRSFromPosition defaultCRSreadGeometryGeoJSONmakeGeometryGeoJSON optValFromObj optAttributes$fJSONGeoFeatureCollection$fJSONGeoFeature$fJSONCRSObject$fJSONGeospatialGeometrygeometryFromJSONcrsPropertyFromObjcrsObjectFromJSON$fJSONGeoMultiLine $fJSONGeoLine$fJSONGeoMultiPolygon$fJSONGeoPolygon$fJSONGeoMultiPoint$fJSONGeoPoint