!~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~       (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone68geojson(h is a catch all for indeterminate CRSs and for expression of positions before a CRS has been determined1geojsonSee 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.) 123456789:;<=>)>  <=;:987123456 (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone(NgeojsonSee Section 3 #Coordinate Reference System Objects in the GeoJSON Spec O 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 O5 while a non-existent attribute will be mapped to a   valueYgeojson'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:Zgeojsonencode CRS Objects to GeoJSON[geojsondecode CRS Objects from GeoJSONAeson doesnt decode "null" to  unfortunately NOPQRUVWXY NOPQRYUVWX (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone2\geojsonsee 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)ageojsonthe \ 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 GeoPositionWithoutCRS, which is eligible\]^_`a\]^_`a (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone>bgeojsonAA 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 valcgeojsonThe inverse to the above, you just give it the type string and the value for the coordinates and it will create the JSON objectdgeojson+get an optional value out of a JSON object:egeojsontThe other way around, given an optional value, will return the attributes that should be added to the makeObj inputbcdebcde (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone68@F>fghmfghm> (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone68Cxgeojson7Split GeoMultiPoint coordinates into multiple GeoPointsygeojson/Merge multiple GeoPoints into one GeoMultiPointpqrwxypqrwxy (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanSafeE|}|} (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone68s.~geojsonRWhen converting a Sequence to a LinearRing there are some things that can go wrongThe sequence can be too short9The head may not be equal to the last element in the listgeojsonNWhen 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)geojson/a LinearRing has at least 3 (distinct) elementsgeojson+returns the element at the head of the ringgeojsondreturns the number of elements in the list, including the replicated element at the end of the list.geojsonOThis function converts it into a list and appends the given element to the end.geojsonkcreates 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...geojson\The expensive version of fromList that checks whether the head and last elements are equal.geojsonKcreate a sequence from a LinearRing by combining values. LinearRing 1 2 3  ,4,1" --> Seq [(1,2),(2,3),(3,4),(4,1)]geojsonQcreate a sequence from a LinearRing. LinearRing 1 2 3 [4,1] --> Seq [1,2,3,4,1)]geojsonmcreates a LinearRing out of a sequence of elements, if there are enough elements (needs at least 3) elementsfromSeq (x:y:z:ws@(_:_)) = _Success # LinearRing x y z (fromListDropLast ws) fromSeq xs = _Failure # return (ListTooShort (length xs))geojsonCreates a LinearRing makeLinearRing x y z xs creates a  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.geojsonzWhen traversing this Structure, the Applicative context of the last element will be appended to the end to close the loopgeojsonThis instance of Foldable will run through the entire ring, closing the loop by also passing the initial element in again at the end.geojsonThe first elementgeojsonThe second elementgeojsonThe third elementgeojsonQThe rest of the optional elements (WITHOUT the first element repeated at the end)~~  (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone68uG  (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone68ygeojson;Split GeoMultiPolygon coordinates into multiple GeoPolygonsgeojson3Merge multiple GeoPolygons into one GeoMultiPolygon  (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone68 geojsonWWhen converting a Sequence to a LineString, here is a list of things that can go wrong:The sequence was empty!The sequence only had one elementgeojsonSWhen converting a List to a LineString, here is a list of things that can go wrong:The list was emptyThe list only had one elementgeojson$a LineString has at least 2 elementsgeojson-returns the element at the head of the stringgeojson&returns the last element in the stringgeojsondreturns the number of elements in the list, including the replicated element at the end of the list.geojsonOThis function converts it into a list and appends the given element to the end.geojsonicreates a LineString out of a list of elements, if there are enough elements (needs at least 2) elementsgeojsonIcreate a sequence from a LineString by combining values. LineString 1 2  ,3,4! --> Sequence [(1,2),(2,3),(3,4)]geojsonQcreate a sequence from a LineString. LineString 1 2 [3,4] --> Sequence [1,2,3,4]geojsonmcreates a LineString out of a sequence of elements, if there are enough elements (needs at least 2) elementsgeojsonCreates a LineString makeLineString x y zs creates a  homomorphic to the list  [x, y] ++ zsgeojson&This will run through the line string.geojsonThe first elementgeojsonThe second elementgeojson!The rest of the optional elements  (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone68  (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone68Rgeojson5Split GeoMultiLine coordinates into multiple GeoLinesgeojson-Merge multiple GeoLines into one GeoMultiLine (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone68UgeojsonSee section 2.1 Geometry Objects in the GeoJSON Spec.geojson%decodes Geometry Objects from GeoJSON Aeson doesnt decode "null" into  unfortunatelygeojson#encodes Geometry Objects to GeoJSON0>fghmpqrwxy0fgh>pqrxymw (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone68ggeojsonSee Section 2.2 Feature Objects9 of the GeoJSON spec. Parameterised on the property type geojson"Encodes Feature objects to GeoJSON geojson$Decodes Feature objects from GeoJSON    (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNone! geojsonSee Section 2.3 Feature Collection Objects of the GeoJSON specgeojson+Encode FeatureCollection objects to GeoJSONgeojson-Decode FeatureCollection objects from GeoJSON     (C) 2014-2018 HS-GeoJSON Project#BSD-style (see the file LICENSE.md) Andrew NewmanNonev 13456789:;<=>NOPQRUVWXY\]^_`afghmpqrwxy   v456\]^_`fgh>  pqrxy;:987NOPQR1  aYmw3 <=UVWX  !"##$%&'()*+,-./0123456789:;<=>??@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrsstuvwxyz{||}~                     $geojson-3.0.2-EPVsD9NPi28BsQllOFS3Xl#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.SeqHelperData.LinearRing,Data.Geospatial.Internal.Geometry.GeoPolygon1Data.Geospatial.Internal.Geometry.GeoMultiPolygonData.LineString)Data.Geospatial.Internal.Geometry.GeoLine.Data.Geospatial.Internal.Geometry.GeoMultiLine!Data.Geospatial.Internal.Geometry#Data.Geospatial.Internal.GeoFeature-Data.Geospatial.Internal.GeoFeatureCollectionData.GeospatialGeoPositionWithoutCRSGeoEmpty GeoPointXY GeoPointXYZ GeoPointXYZM PointXYZM_xyzmX_xyzmY_xyzmZ_xyzmMPointXYZ_xyzX_xyzY_xyzZPointXY_xyX_xyY DoubleArrayAltitudeNorthingEasting LongitudeLatitude$fEqDoubleArray$fShowDoubleArray$fGenericDoubleArray$fNFDataDoubleArray$fFromJSONDoubleArray$fToJSONDoubleArray $fShowPointXY $fEqPointXY$fGenericPointXY$fNFDataPointXY$fShowPointXYZ $fEqPointXYZ$fGenericPointXYZ$fNFDataPointXYZ$fShowPointXYZM $fEqPointXYZM$fGenericPointXYZM$fNFDataPointXYZM$fShowGeoPositionWithoutCRS$fEqGeoPositionWithoutCRS$fGenericGeoPositionWithoutCRS$fNFDataGeoPositionWithoutCRSBoundingBoxWithoutCRSunBoundingBoxWithoutCrs FeatureID FeatureIDTextFeatureIDNumberProjectionType FormatStringHrefCodeNameHasGeoPositionWithoutCRSgeoPositionWithoutCRS retrieveXY$fFromJSONGeoPositionWithoutCRS$fToJSONGeoPositionWithoutCRS/$fHasGeoPositionWithoutCRSGeoPositionWithoutCRS$fToJSONFeatureID$fFromJSONFeatureID$fToJSONBoundingBoxWithoutCRS$fFromJSONBoundingBoxWithoutCRS$fShowFeatureID $fEqFeatureID$fGenericFeatureID$fNFDataFeatureID$fEqBoundingBoxWithoutCRS$fShowBoundingBoxWithoutCRS$fGenericBoundingBoxWithoutCRS$fNFDataBoundingBoxWithoutCRS CRSObjectNoCRSNamedCRSEPSG LinkedCRS$fShowCRSObject $fEqCRSObject_NoCRS _NamedCRS_EPSG _LinkedCRS defaultCRS$fToJSONCRSObject$fFromJSONCRSObject GeoPositionLonLat LonLatAltEastingNorthingEastingNorthingAltstripCRSFromPositionreadGeometryGeoAesonmakeGeometryGeoAeson optValFromObj optAttributesGeoPoint _unGeoPoint$fShowGeoPoint $fEqGeoPoint$fGenericGeoPoint$fNFDataGeoPoint unGeoPoint$fFromJSONGeoPoint$fToJSONGeoPoint GeoMultiPoint_unGeoMultiPoint$fShowGeoMultiPoint$fEqGeoMultiPoint$fGenericGeoMultiPoint$fNFDataGeoMultiPointunGeoMultiPointsplitGeoMultiPointmergeGeoPoints$fFromJSONGeoMultiPoint$fToJSONGeoMultiPoint sequenceHead sequenceTailSequenceToLinearRingErrorSequenceTooShortFirstNotEqualToLastListToLinearRingError ListTooShortHeadNotEqualToLast LinearRingringHead ringLengthfromLinearRingfromListfromListWithEqCheck combineToSeqtoSeqfromSeqmakeLinearRing$fFromJSONLinearRing$fToJSONLinearRing$fTraversableLinearRing$fFoldableLinearRing$fFunctorLinearRing$fShowListToLinearRingError$fShowSequenceToLinearRingError$fEqLinearRing$fShowLinearRing$fGenericLinearRing$fNFDataLinearRing$fEqListToLinearRingError$fEqSequenceToLinearRingError GeoPolygon _unGeoPolygon$fShowGeoPolygon$fEqGeoPolygon$fGenericGeoPolygon$fNFDataGeoPolygon unGeoPolygon$fFromJSONGeoPolygon$fToJSONGeoPolygonGeoMultiPolygon_unGeoMultiPolygonsplitGeoMultiPolygonmergeGeoPolygons$fShowGeoMultiPolygon$fEqGeoMultiPolygon$fGenericGeoMultiPolygon$fNFDataGeoMultiPolygonunGeoMultiPolygon$fFromJSONGeoMultiPolygon$fToJSONGeoMultiPolygonSequenceToLineStringError SequenceEmptySingletonSequenceListToLineStringError ListEmpty SingletonList LineStringlineStringHeadlineStringLastlineStringLengthfromLineStringmakeLineString$fFromJSONLineString$fToJSONLineString$fTraversableLineString$fFoldableLineString$fFunctorLineString$fShowLineString$fShowListToLineStringError$fShowSequenceToLineStringError$fEqLineString$fGenericLineString$fNFDataLineString$fEqListToLineStringError$fEqSequenceToLineStringErrorGeoLine _unGeoLine $fShowGeoLine $fEqGeoLine$fGenericGeoLine$fNFDataGeoLine unGeoLine$fFromJSONGeoLine$fToJSONGeoLine GeoMultiLine_unGeoMultiLine$fShowGeoMultiLine$fEqGeoMultiLine$fGenericGeoMultiLine$fNFDataGeoMultiLineunGeoMultiLinesplitGeoMultiLine mergeGeoLines$fFromJSONGeoMultiLine$fToJSONGeoMultiLineGeospatialGeometry NoGeometryPoint MultiPointPolygon MultiPolygonLine MultiLine Collection$fShowGeospatialGeometry$fEqGeospatialGeometry$fGenericGeospatialGeometry$fNFDataGeospatialGeometry _NoGeometry_Point _MultiPoint_Polygon _MultiPolygon_Line _MultiLine _Collection$fFromJSONGeospatialGeometry$fToJSONGeospatialGeometry GeoFeature_bbox _geometry _properties _featureIdreWrapGeometry$fShowGeoFeature$fEqGeoFeature$fGenericGeoFeature$fNFDataGeoFeaturebbox featureIdgeometry properties$fToJSONGeoFeature$fFromJSONGeoFeatureGeoFeatureCollection _boundingbox _geofeatures$fShowGeoFeatureCollection$fEqGeoFeatureCollection boundingbox geofeatures$fToJSONGeoFeatureCollection$fFromJSONGeoFeatureCollectionbaseGHC.BaseNothingMaybe$aeson-1.3.1.1-7JlrwYHW7OR9ca4RRZ9oOfData.Aeson.Types.InternalNull