U!      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~   (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNoneSee Section 4 Bounding Boxes of the GeoJSON spec, The length of the list/array must be 2*n where n is the dimensionality of the position type for the CRS with min values first followed by the max values, wich both the min/max sets following the same axis order as the CRS, 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. ( h is a catch all for indeterminate CRSs and for expression of positions before a CRS has been determined   (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone"KSee Section 3 #Coordinate Reference System Objects in the GeoJSON Spec  is required because no crsA attribute in a GeoJSON feature is NOT the same thing as a null crs attribute. no crse value implies the default CRS, while a null CRS means you cannot assume a CRS, null will mapped to 5 while a non-existent attribute will be mapped to a   value'The default CRS according to Section 3 #Coordinate Reference System Objects! is WGS84 which I believe, from  *http://spatialreference.org/ref/epsg/4326/# which translates to this in JSON:  /http://spatialreference.org/ref/epsg/4326/json/) is represented thus:encode CRS Objects to GeoJSON decode CRS Objects from GeoJSONAeson doesnt decode "null" to  unfortunately   (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone+!see Section 2.1.1 Position in the GeoJSON Spec, I make the assumption here that the only position types we will use will involve easting or northing (+ve or -ve Altitude) or lon or lat (+ve or -ve Altitude)&the ! is a bit special in that when you convert it to GeoJSON, it will lose the CRS info attached to it and cannot be read back in from the GeoJSON. Hence it is ineligible for the FromJSON7 type class, so this function will strip it down to a  , which is eligible!"#$%&!"#$%&!"#$% (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone7"'AA generic function that can be used to read in the GeoJSON for: GeoPoint,  GeoMultiPoint, GeoLine,  GeoMultiLine,  GeoPolygon and GeoMultiPolygon 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(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)+get an optional value out of a JSON object:*tThe other way around, given an optional value, will return the attributes that should be added to the makeObj input'()*'()* (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone8+,-0+,-0+,- (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone<-97Split GeoMultiPoint coordinates into multiple GeoPoints:/Merge multiple GeoPoints into one GeoMultiPoint34589:34589:345 (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNoneK[ =SWhen converting a List to a LineString, here is a list of things that can go wrong:The list was emptyThe list only had one element@$a LineString has at least 2 elementsA-returns the element at the head of the stringB&returns the last element in the stringCdreturns the number of elements in the list, including the replicated element at the end of the list.DOThis function converts it into a list and appends the given element to the end.Eicreates a LineString out of a list of elements, if there are enough elements (needs at least 2) elementsFCreates a LineString makeLineString x y zs creates a @ homomorphic to the list  [x, y] ++ zsJThis instance of Foldable will run through the entire ring, closing the loop by also passing the initial element in again at the end.FThe first elementThe second element!The rest of the optional elements =>?@ABCDEF @=>?DEFABC=>?@ (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNoneMLPQRUPQRUPQR  (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNoneP^5Split GeoMultiLine coordinates into multiple GeoLines_-Merge multiple GeoLines into one GeoMultiLineXYZ]^_XYZ]^_XYZ  (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNones bNWhen converting a List to a LinearRing there are some things that can go wrongThe list can be too shortThe head may not be equal to the last element in the list (NB this is not currently checked due to performance concerns, and it also doesnt make much sense since its likely to contain doubles)e/a LinearRing has at least 3 (distinct) elementsf+returns the element at the head of the ringgdreturns the number of elements in the list, including the replicated element at the end of the list.hOThis function converts it into a list and appends the given element to the end.ikcreates a LinearRing out of a list of elements, if there arent enough elements (needs at least 4) elements}This version doesnt check equality of the head and tail in case you wish to use it for elements with no Eq instance defined.Also its a list, finding the last element could be expensive with large lists. So just follow the spec and make sure the ring is closed.Ideally the Spec would be modified to remove the redundant last element from the Polygons/LineRings. Its just going to waste bandwidth...?And be aware that the last element of the list will be dropped.^Unfortunately it doesn't check that the last element is the same as the first at the moment...j\The expensive version of fromList that checks whether the head and last elements are equal.kCreates a LinearRing makeLinearRing x y z xs creates a e homomorphic to the list [x, y, z] ++ xs the list xs{ should NOT contain the first element repeated, i.e the loop does not need to be closed, makeLinearRing will close it off..Repeating the first element is just redundant.4Does a fold but ignores the last element of the listnzWhen traversing this Structure, the Applicative context of the last element will be appended to the end to close the loopoThis instance of Foldable will run through the entire ring, closing the loop by also passing the initial element in again at the end.kThe first elementThe second elementThe third elementQThe rest of the optional elements (WITHOUT the first element repeated at the end) bcdefghijk ebcdhijkfgbcde  (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNoneu uvwzuvwzuvw  (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNonex;Split GeoMultiPolygon coordinates into multiple GeoPolygons3Merge multiple GeoPolygons into one GeoMultiPolygon}~}~}~  (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone}5See section 2.1 Geometry Objects in the GeoJSON Spec.%decodes Geometry Objects from GeoJSON Aeson doesnt decode "null" into  unfortunately#encodes Geometry Objects to GeoJSON/+,-034589:PQRUXYZ]^_uvwz}~/+,-3459:uvw}~PQRXYZ^_08zU] (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNoneSee Section 2.2 Feature Objects9 of the GeoJSON spec. Parameterised on the property type"Encodes Feature objects to GeoJSON$Decodes Feature objects from GeoJSON  (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNoneoSee Section 2.3 Feature Collection Objects of the GeoJSON spec+Encode FeatureCollection objects to GeoJSON-Decode FeatureCollection objects from GeoJSON (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone+^ !"#$%&+,-034589:PQRUXYZ]^_uvwz}~^  !"#$%+,-3459:uvw}~PQRXYZ^_&08zU] !"#$%&'()*+,-./0123456789:;<<=>?@ABCCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__`abcde f f g h i j k l m n o p q r s t u T v w x y z { | } ~               O r$geojson-1.3.2-EXDqnVYeimxKRH8IBur2hH#Data.Geospatial.Internal.BasicTypesData.Geospatial.Internal.CRS$Data.Geospatial.Internal.GeoPosition'Data.Geospatial.Internal.Geometry.Aeson*Data.Geospatial.Internal.Geometry.GeoPoint/Data.Geospatial.Internal.Geometry.GeoMultiPointData.LineString)Data.Geospatial.Internal.Geometry.GeoLine.Data.Geospatial.Internal.Geometry.GeoMultiLineData.LinearRing,Data.Geospatial.Internal.Geometry.GeoPolygon1Data.Geospatial.Internal.Geometry.GeoMultiPolygon!Data.Geospatial.Internal.Geometry#Data.Geospatial.Internal.GeoFeature-Data.Geospatial.Internal.GeoFeatureCollectionData.GeospatialBoundingBoxWithoutCRS FeatureID FeatureIDTextFeatureIDNumberProjectionType FormatStringHrefCodeNameGeoPositionWithoutCRSAltitudeNorthingEasting LongitudeLatitude$fToJSONFeatureID$fFromJSONFeatureID$fShowFeatureID $fEqFeatureID CRSObjectNoCRSNamedCRSEPSG LinkedCRS$fShowCRSObject $fEqCRSObject_NoCRS _NamedCRS_EPSG _LinkedCRS defaultCRS$fToJSONCRSObject$fFromJSONCRSObject GeoPositionLonLat LonLatAltEastingNorthingEastingNorthingAltstripCRSFromPositionreadGeometryGeoAesonmakeGeometryGeoAeson optValFromObj optAttributesGeoPoint _unGeoPoint$fShowGeoPoint $fEqGeoPoint unGeoPoint$fFromJSONGeoPoint$fToJSONGeoPoint GeoMultiPoint_unGeoMultiPoint$fShowGeoMultiPoint$fEqGeoMultiPointunGeoMultiPointsplitGeoMultiPointmergeGeoPoints$fFromJSONGeoMultiPoint$fToJSONGeoMultiPointListToLineStringError ListEmpty SingletonList LineStringlineStringHeadlineStringLastlineStringLengthfromLineStringfromListmakeLineString$fFromJSONLineString$fToJSONLineString$fTraversableLineString$fFoldableLineString$fFunctorLineString$fShowLineString$fShowListToLineStringError$fEqLineString$fEqListToLineStringErrorGeoLine _unGeoLine $fShowGeoLine $fEqGeoLine unGeoLine$fFromJSONGeoLine$fToJSONGeoLine GeoMultiLine_unGeoMultiLine$fShowGeoMultiLine$fEqGeoMultiLineunGeoMultiLinesplitGeoMultiLine mergeGeoLines$fFromJSONGeoMultiLine$fToJSONGeoMultiLineListToLinearRingError ListTooShortHeadNotEqualToLast LinearRingringHead ringLengthfromLinearRingfromListWithEqCheckmakeLinearRing$fFromJSONLinearRing$fToJSONLinearRing$fTraversableLinearRing$fFoldableLinearRing$fFunctorLinearRing$fShowLinearRing$fShowListToLinearRingError$fEqLinearRing$fEqListToLinearRingError GeoPolygon _unGeoPolygon$fShowGeoPolygon$fEqGeoPolygon unGeoPolygon$fFromJSONGeoPolygon$fToJSONGeoPolygonGeoMultiPolygon_unGeoMultiPolygonsplitGeoMultiPolygonmergeGeoPolygons$fShowGeoMultiPolygon$fEqGeoMultiPolygonunGeoMultiPolygon$fFromJSONGeoMultiPolygon$fToJSONGeoMultiPolygonGeospatialGeometry NoGeometryPoint MultiPointPolygon MultiPolygonLine MultiLine Collection$fShowGeospatialGeometry$fEqGeospatialGeometry _NoGeometry_Point _MultiPoint_Polygon _MultiPolygon_Line _MultiLine _Collection$fFromJSONGeospatialGeometry$fToJSONGeospatialGeometry GeoFeature_bbox _geometry _properties _featureId$fShowGeoFeature$fEqGeoFeaturebbox featureIdgeometry properties$fToJSONGeoFeature$fFromJSONGeoFeatureGeoFeatureCollection _boundingbox _geofeatures$fShowGeoFeatureCollection$fEqGeoFeatureCollection boundingbox geofeatures$fToJSONGeoFeatureCollection$fFromJSONGeoFeatureCollectionbaseGHC.BaseNothingMaybe$aeson-1.2.4.0-An4M4vjYpGJJEPVT11VCVzData.Aeson.Types.InternalNull foldrDropLast