gistools/lib.rs
1#![cfg_attr(not(feature = "std"), no_std)]
2#![deny(missing_docs)]
3#![cfg_attr(docsrs, feature(doc_cfg))]
4#![warn(clippy::collapsible_if)]
5// NOTE: Once coverage stabilizes, we can simplify this https://github.com/rust-lang/rust/issues/84605
6#![cfg_attr(feature = "nightly", feature(coverage_attribute))]
7//! # GIS Tools π πΊοΈ
8//!
9//! ```text
10//! ___ ___
11//! /\ \ ___ /\ \
12//! /::\ \ /\ \ /::\ \
13//! /:/\:\ \ \:\ \ /:/\ \ \
14//! /:/ \:\ \ /::\__\ _\:\~\ \ \
15//! /:/__/_\:\__\ __/:/\/__/ /\ \:\ \ \__\
16//! \:\ /\ \/__/ /\/:/ / \:\ \:\ \/__/
17//! \:\ \:\__\ \::/__/ \:\ \:\__\
18//! \:\/:/ / \:\__\ \:\/:/ /
19//! \::/ / \/__/ \::/ /
20//! \/__/ \/__/
21//! ___ ___ ___ ___ ___
22//! /\ \ /\ \ /\ \ /\__\ /\ \
23//! \:\ \ /::\ \ /::\ \ /:/ / /::\ \
24//! \:\ \ /:/\:\ \ /:/\:\ \ /:/ / /:/\ \ \
25//! /::\ \ /:/ \:\ \ /:/ \:\ \ /:/ / _\:\~\ \ \
26//! /:/\:\__\ /:/__/ \:\__\ /:/__/ \:\__\ /:/__/ /\ \:\ \ \__\
27//! /:/ \/__/ \:\ \ /:/ / \:\ \ /:/ / \:\ \ \:\ \:\ \/__/
28//! /:/ / \:\ /:/ / \:\ /:/ / \:\ \ \:\ \:\__\
29//! \/__/ \:\/:/ / \:\/:/ / \:\ \ \:\/:/ /
30//! \::/ / \::/ / \:\__\ \::/ /
31//! \/__/ \/__/ \/__/ \/__/
32//! ```
33//!
34//! ## Install
35//!
36//! ```bash
37//! cargo add gis-tools
38//! ```
39//!
40//! ## About
41//!
42//! A collection of geospatial tools primarily designed for WGS84, Web Mercator, and S2.
43//!
44//! This library is designed to be **lightweight** with minimal dependencies. All code that doesn't
45//! require STD will avoid it, so all readers and writers are accessible to the browser or embedded
46//! systems if needed.
47//!
48//! ## Features
49//!
50//! Notable features of GIS Tools are:
51//!
52//! * π Lightweight, fast, and memory efficient. `no_std` builds for Rust.
53//! * πΊοΈ Full toolkit support for WGS84, Web Mercator, and S2 projections. Other projections are
54//! coerced under the hood for your benefit.
55//! * π± A large list of projections can be converted to/from one of the above 3 via Transformers.
56//! * π¦ Build Vector Tiles, Raster Tiles, and Gridded Data Tiles. Vector supports 3 output formats
57//! (Mapbox Vector Tile, Open S2 Tiles, and Flat Open S2 Tiles).
58//! * β
Most data structures support all projections, but primarily focus the big 3 states above.
59//! Also handle large data sets through working with the filesystem and mmap buffers.
60//! * π Contains **23** native GIS readers. The list of readers are: CSV, GBFS, GeoTIFF, GPX, GRIB2,
61//! GTFS, JPEG and JPEG2000, (Geo|S2)JSON, LineDelimted GeoJSON, GeoJSON Text Sequences, LAS, LAZ,
62//! NadGrids, NetCDF, OSM, (S2)PMTiles, Shapefiles, raster and vector tiles, WKT, and XML.
63//! * π¦Ί Secure code where the only external dependencies are [libm](https://github.com/rust-lang/libm), [half](https://docs.rs/half/latest/half/), [regex](https://github.com/rust-lang/regex), [serde](https://github.com/serde-rs/serde), [serde_json](https://github.com/serde-rs/json), and some optional std [memmap2](https://github.com/RazrFalcon/memmap2-rs), [image](https://github.com/image-rs/image), and [flate2](https://github.com/rust-lang/flate2-rs).
64//! * π§² Full suite of tools for points, lines, polygons, greater-circle-arcs, predicates, and more.
65//! * π Space specific tools for planets and satellite orbits.
66//!
67//! ## Goals
68//!
69//! Making GIS data easy to parse and work with. One of the biggest issues in GIS right now is how
70//! segmented various niche tools are. The other issue is how most solutions to read GIS data are
71//! half baked, deprecated, or partially parse results that may also need to be transformed one more
72//! time to use them.
73//!
74//! This library exists to make GIS tools simple to use, various data types are fast to parse,
75//! and a gaurentee that the parsed data is compatible with said tools. Stored geometry projections
76//! will be transformed to be either WGS84 or S2 Projections so you don't have to worry about those
77//! complexities.
78//!
79//! Lastly the goal is for all code to be accessible to both the browser and locally. An example is
80//! the Shapefile reader where it can pull from online data or handle extremely large file locally
81//! in parallel locally as well.
82//!
83//! ## Usage
84//!
85//! The Documentation is very thorough in this library. Therefore the best thing to do is follow
86//! the links provided as needed.
87//!
88//! ### Readers
89//!
90//! All the following readers implement the [`crate::parsers::FeatureReader`] trait. This is
91//! useful because each tool and writer use this trait to work with any reader to ensure consistency
92//! of the projection and structure without needing you to worry about the setup. It also allows you
93//! to directly read in [`s2json::VectorFeature`] data using the `iter` or `par_iter` functions.
94//!
95//! - [`crate::readers::GISReader`]: Read in any GIS file type supported by this library.
96//! - [`crate::readers::CSVReader`]: Parse (Geo|S2)JSON from a file that is in the CSV format
97//! - [`crate::readers::GBFSReader`]: Parse General Bikeshare Feed Specification (GBFS) data
98//! - [`crate::readers::GeoTIFFReader`]: This class reads a GeoTIFF file and returns a list of GeoTIFF images.
99//! - [`crate::readers::GPXReader`]: The GPX Reader is an XML-based GPS Exchange Format (GPX) reader.
100//! - [`crate::readers::GRIB2Reader`]: This class reads a GRIB2 file and returns a list of GRIB2 products.
101//! - [`crate::readers::GTFSScheduleReader`]: Schedule class that pulls in all of the GTFS schedule files and parses them into a single object
102//! - [`crate::readers::JSONReader`]: Parse (Geo|S2)JSON. Can handle millions of features.
103//! - [`crate::readers::NewLineDelimitedJSONReader`]: Parse (Geo|S2)JSON from a file that is in a newline-delimited format
104//! - [`crate::readers::SequenceJSONReader`]: Parse GeoJSON from a file that is in the `geojson-text-sequences` format.
105//! - [`crate::readers::JSONCollectionReader`]: Data parsed using the [`crate::readers::ToGisJSON`] trait can be coerced into this struct
106//! - [`crate::readers::LASReader`]: Reads LAS data. Supports up to the LAS 1.4 specification.
107//! - [`crate::readers::LAZReader`]: Reads LAS zipped data. Supports LAS 1.4 specification.
108//! - [`crate::readers::NadGridReader`]: Loads/reads a binary NTv2 file (.gsb)
109//! - [`crate::readers::NetCDFReader`]: Read the NetCDF v3.x file format
110//! - [`crate::readers::OSMReader`]: Parses OSM PBF files
111//! - [`crate::readers::PMTilesReader`]: A V3.0 PMTiles reader for reading standard WebMercator Tile data and V1.0 S2 Tile data.
112//! - [`crate::readers::S2TilesReader`]: An S2 Tile Reader to store tile and metadata in a cloud optimized format.
113//! - [`crate::readers::ShapeFileReader`]: Reads data from a Shapefile
114//! - [`crate::readers::RasterTileFetcher`]: Read an entire archive of raster tiles, where the max zoom data is iterated upon
115//! - [`crate::readers::WKTGeometryReader`]: Parse a collection of WKT geometries from a string
116//!
117//! ### Tools
118//!
119//! #### Data Tools
120//!
121//! - [`crate::tools::Delaunator`]: An incredibly fast and robust Typescript library for Delaunay triangulation of 2D points.
122//! - [`crate::tools::Orthodrome`]: Represents an Orthodrome, which is the shortest path between two points on a sphere.
123//! - [`crate::tools::polylabels()`]: Find the labels for a collection of vector polygons
124//! - [`crate::tools::polylabel()`]: Find the label for a vector polygon
125//!
126//! #### Geometry Tools
127//!
128//! Points
129//!
130//! - [`crate::geometry::AverageOfPoints`]: Get the average of a collection of [`s2json::VectorPoint`].
131//! - [`crate::geometry::bearing()`]: Get the bearing in degrees between two points
132//! - [`crate::geometry::CenterOfPoints`]: Get the center of a bounding box from a collection of [`s2json::VectorPoint`]
133//! - [`crate::geometry::ClampWGS84Point`]: Traint to ensure a WGS84 point is valid
134//! - [`crate::geometry::clamp_wgs84_point()`]: Updates a WGS84 point's x and y values as needed to be valid WGS84
135//! - [`crate::geometry::destination()`]: Get the destination given a start point, bearing, and distance
136//! - [`crate::geometry::NearestPoint`]: Get the nearest of a collection of [`s2json::VectorPoint`].
137//! - [`crate::geometry::ToPoints`]: Convert any geometry shape to a [`s2json::VectorMultiPoint`]
138//!
139//! Lines
140//!
141//! - [`crate::geometry::Along`]: Trait to get a point along a linestring. Or use [`crate::geometry::along_line`] directly
142//! - [`crate::geometry::along_line()`]: Given a linestring in degrees and a distance, create a point along the line
143//! - [`crate::geometry::clean_linestrings`]: Removes superfluous/collinear points from a collection of linestrings
144//! - [`crate::geometry::clean_linestring`]: Removes superfluous/collinear points from a linestring
145//! - [`crate::geometry::intersection_of_segments`]: Find the intersection of two line segments
146//! - [`crate::geometry::intersection_of_segments_robust`]: Find the intersection of two linestrings using a robust algorithm
147//! - [`crate::geometry::LengthOfLines`]: Get the total euclidean distance of a line or lines. Feel free to use [`euclidean_distance`] or [`haversine_distance`] directly for segments.
148//! - [`crate::geometry::euclidean_distance`]: Get the euclidean distance between two points. Requires the points to implement [`s2json::GetXY`] and [`s2json::GetZ`] traits
149//! - [`crate::geometry::haversine_distance`]: Get the haversine distance between two points. Requires the points to implement [`s2json::GetXY`] trait
150//! - [`crate::geometry::point_on_line`]: Check to see if a point is on a line. Uses predicates to ensure the point is truly on the line
151//! - [`crate::geometry::point_to_line_distance`]: Check to see how far away the point is from the line. Supports both Euclidean and Haversine methods
152//! - [`crate::geometry::ToLines`]: Given a Geometry, attempt to Return a VectorLineString.
153//!
154//! Polygons
155//!
156//! - [`crate::geometry::Area`]: Get the area of the polygon. Lines return 0 if not closed. Other geometries return 0.
157//! - [`crate::geometry::clean_polygons`]: Ensures the collection of polygon ring order is correct, removes duplicate points, and runs a dekink to be thorough.
158//! - [`crate::geometry::clean_polygon`]: Ensures the polygon ring order is correct, removes duplicate points, and runs a dekink to be thorough.
159//! - [`crate::geometry::dekink_polygons`]: Given a collection of polygons, if any of the polygons are kinked, dekink them
160//! - [`crate::geometry::dekink_polygon`]: Given a polygon, if it is kinked, dekink it
161//! - [`crate::geometry::Inside`]: Check if a point is inside a geometry.
162//! - [`crate::geometry::point_in_polygon`]: Check if a point is inside a polygon
163//! - [`crate::geometry::point_in_polyline`]: Check if a point is inside a polyline
164//! - [`crate::geometry::polyline_in_polyline`]: Check if a polyline/hole is inside another polyline/outer ring
165//! - [`crate::geometry::polygons_intersections`]: Find all intersections within a collection of polygons using a robust algorithm
166//!
167//! Clip
168//!
169//! - [`crate::geometry::clip_point`]: Clip a point to an axis and range
170//! - [`crate::geometry::clip_multi_point`]: Clip points to an axis and range
171//! - [`crate::geometry::clip_line_string`]: Clip a linestring to an axis and range
172//! - [`crate::geometry::clip_multi_line_string`]: Clip a multilinestring to an axis and range
173//! - [`crate::geometry::clip_polygon`]: Clip a polygon to an axis and range
174//! - [`crate::geometry::clip_multi_polygon`]: Clip a multipolygon to an axis and range
175//!
176//! #### Interpolation Tools
177//!
178//! - [`crate::util::average_interpolation`]: Finds the average point in the reference data to the given point and returns its value.
179//! - [`crate::util::idw_interpolation`]: Given a reference of data, interpolate a point using inverse distance weighting
180//! - [`crate::util::lanczos_interpolation`]: Perform interpolation using the Lanczos filter. This method uses a kernel-based approach to weigh contributions from nearby points, providing a balance between smoothing and sharpness.
181//! - [`crate::util::nearest_interpolation`]: Finds the nearest point in the reference data to the given point and returns its value.
182//!
183//! ### Writers
184//!
185//! Writers are tools for writing to certain formats, build tiles, etc.
186//!
187//! All writer tools use the [`crate::parsers::Writer`] trait to write data to. Some of the writers
188//! have another level of indirection for writing tiles and use both/either the [`crate::writers::TileWriter`]
189//! and [`crate::writers::TemporalTileWriter`] traits.
190//!
191//! - [`crate::writers::to_json`]: Given a writer and an array of readers, write the input features to the writer as a JSON object
192//! - [`crate::writers::to_jsonld`]: Given a writer and an array of readers, write the input features to the writer as JSON-LD
193//! - [`crate::writers::PMTilesWriter`]: The File reader is to be used by the local filesystem.
194//! - [`crate::writers::S2TilesWriter`]: An S2 Tile Writer to store tile and metadata in a cloud optimized format.
195//! - [`crate::writers::FileTileWriter`]: A Folder-File tile writer
196//! - [`crate::writers::LocalTileWriter`]: A Local Memory Tile Write Store
197//! - [`crate::writers::TileBuilder`]: Create vector tiles, raster tiles, or gridded tiles.
198//!
199//! ### Geometry
200//!
201//! #### Longitude Latitude
202//!
203//! - [`crate::geometry::LonLat`]: A container for a longitude latitude point in degrees.
204//!
205//! #### Predicates
206//!
207//! - [`crate::geometry::orient2d()`]: Highly accurate returns a negative value if the points a, b, and c occur in counterclockwise order (c lies to the left of the directed line defined by points a and b).
208//! - [`crate::geometry::orient2dfast()`]: Returns a positive value if the points a, b, and c occur in counterclockwise order (c lies to the left of the directed line defined by points a and b).
209//! - [`crate::geometry::incirclefast()`]: An in-circle test fast test, lacks the same accuracy as incircle
210//!
211//! #### S1
212//!
213//! - [`crate::geometry::S1Angle`]: This struct represents a one-dimensional angle
214//! - [`crate::geometry::S1ChordAngle`]: S1ChordAngle represents the angle subtended by a chord
215//!
216//! #### S2
217//!
218//! - [`crate::geometry::S2CellId`]: An S2CellId is a 64-bit unsigned integer that uniquely identifies a cell in the S2 cell decomposition.
219//! - [`crate::geometry::S2Cap`]: S2Cap represents a disc-shaped region defined by a center and radius.
220//! - [`crate::geometry::ConvertVectorFeatureS2`]: Underlying conversion mechanic to move S2 Geometry to GeoJSON Geometry
221//! - [`crate::geometry::S2Point`]: An S2Point represents a point on the unit sphere as a 3D vector.
222//!
223//! #### WGS84 & Web Mercator
224//!
225//! - [`crate::geometry::ConvertFeature`]: Underlying conversion mechanic to move GeoJSON Feature to GeoJSON Vector Feature
226//! - [`crate::geometry::ConvertVectorFeatureWM`]: Underlying conversion mechanic to move GeoJSON Geometry to S2 Geometry
227//!
228//! #### External
229//!
230//! - [`s2json::BBox`]: Bounding Box for 2D data
231//! - [`s2json::BBox3D`]: Bounding Box for 3D data
232//! - [`s2json::VectorPoint`]: Wrapper of a 3D point with an m-value
233//! - [`s2json::VectorGeometry`]: WGS84, Web Mercator, and S2 GeoJSON Vector Geometry Wrapper
234//! - [`s2json::VectorFeature`]: WGS84, Web Mercator, and S2 GeoJSON Vector Feature Wrapper
235//! - [`s2json::Point`]: Wrapper of a 2D point
236//! - [`s2json::Point3D`]: Wrapper of a 3D point
237//! - [`s2json::Geometry`]: WGS84 GeoJSON Geometry Wrapper
238//! - [`s2json::Feature`]: WGS84 GeoJSON Feature Wrapper
239//!
240//! ### Parsers
241//!
242//! #### Image
243//!
244//! - [`crate::parsers::image_decoder`]: Decode any image type into an RGBA buffer
245//! - [`crate::parsers::decode_jpeg_data`]: Decode a JPEG image into an RGBA buffer. Used by GeoTIFF
246//! - [`crate::parsers::RGBA`]: RGBA data in 0->1 range floats These values remove gamma-corrected values so that you can apply maths on them This means the RGBA values are in linear space
247//!
248//! #### Readers
249//!
250//! - [`crate::parsers::Buffer`]: This works as a wrapper around a byte buffer.
251//! - [`crate::parsers::Reader`]: Reader interface. Implemented to read data from either a buffer or a filesystem
252//! - [`crate::parsers::BufferReader`]: A basic buffer reader for reading data from a buffer
253//! - [`crate::parsers::FileReader`]: A file reader for reading data from a file
254//! - [`crate::parsers::MMapReader`]: A file reader for reading data from a file using memory mapping
255//!
256//! #### WKT
257//!
258//! - [`crate::parsers::parse_wkt_object`]: Parses a WKT object
259//!
260//! #### Writers
261//!
262//! - [`crate::parsers::Writer`]: The defacto interface for all writers.
263//! - [`crate::parsers::BufferWriter`]: Buffer writer is used on smaller datasets that are easy to write in memory. Faster then the Filesystem
264//! - [`crate::parsers::FileWriter`]: A writer that operates on the filesystem storing data in a file
265//!
266//! #### XML
267//!
268//! - [`crate::parsers::xml_count_substring`]: Count the number of times a substring appears in a string
269//! - [`crate::parsers::xml_find_tag_by_name`]: Find the first tag with the given name
270//! - [`crate::parsers::xml_find_tag_by_path`]: Find the first tag with the given path
271//! - [`crate::parsers::xml_find_tags_by_name`]: All tags with the given name
272//! - [`crate::parsers::xml_find_tags_by_path`]: Find all tags with the given path
273//! - [`crate::parsers::xml_get_attribute`]: Get the value of an attribute
274//! - [`crate::parsers::xml_index_of_match_end`]: Find the index of the last match
275//! - [`crate::parsers::xml_index_of_match`]: Find the index of the first match
276//! - [`crate::parsers::xml_remove_comments`]: Remove XML comments from a string
277//! - [`crate::parsers::xml_remove_tags_by_name`]: Remove tags given a name
278//!
279//! ### Proj
280//!
281//! - [`crate::proj::Transformer`]: A Transformer class contains all projections necessary for converting coordinates from one projection to another.
282//! - [`crate::proj::TransformCoordinates`]: Projection trait to modify a Point's values. Used by the Transformer
283//! - [`crate::proj::Coords`]: A generic 4-dimensional point/vector
284//!
285//! ### Space
286//!
287//! #### Planet Constants
288//!
289//! Earth:
290//! [`crate::space::EARTH_RADIUS`], [`crate::space::EARTH_RADIUS_EQUATORIAL`], [`crate::space::EARTH_RADIUS_POLAR`], [`crate::space::EARTH_CIRCUMFERENCE`], [`crate::space::EARTH_LOWEST_ALTITUDE`], [`crate::space::EARTH_HIGHEST_ALTITUDE`]
291//!
292//! Jupiter:
293//! [`crate::space::JUPITER_RADIUS`], [`crate::space::JUPITER_RADIUS_EQUATORIAL`], [`crate::space::JUPITER_RADIUS_POLAR`], [`crate::space::JUPITER_CIRCUMFERENCE`]
294//!
295//! Mars:
296//! [`crate::space::MARS_RADIUS`], [`crate::space::MARS_RADIUS_EQUATORIAL`], [`crate::space::MARS_RADIUS_POLAR`], [`crate::space::MARS_CIRCUMFERENCE`], [`crate::space::MARS_LOWEST_ALTITUDE`], [`crate::space::MARS_HIGHEST_ALTITUDE`]
297//!
298//! Mercury:
299//! [`crate::space::MERCURY_RADIUS`], [`crate::space::MERCURY_RADIUS_EQUATORIAL`], [`crate::space::MERCURY_RADIUS_POLAR`], [`crate::space::MERCURY_CIRCUMFERENCE`], [`crate::space::MERCURY_LOWEST_ALTITUDE`], [`crate::space::MERCURY_HIGHEST_ALTITUDE`]
300//!
301//! Moon:
302//! [`crate::space::MOON_RADIUS`], [`crate::space::MOON_RADIUS_EQUATORIAL`], [`crate::space::MOON_RADIUS_POLAR`], [`crate::space::MOON_CIRCUMFERENCE`], [`crate::space::MOON_LOWEST_ALTITUDE`], [`crate::space::MOON_HIGHEST_ALTITUDE`]
303//!
304//! Neptune:
305//! [`crate::space::NEPTUNE_RADIUS`], [`crate::space::NEPTUNE_RADIUS_EQUATORIAL`], [`crate::space::NEPTUNE_RADIUS_POLAR`], [`crate::space::NEPTUNE_CIRCUMFERENCE`]
306//!
307//! Pluto:
308//! [`crate::space::PLUTO_RADIUS`], [`crate::space::PLUTO_RADIUS_EQUATORIAL`], [`crate::space::PLUTO_RADIUS_POLAR`], [`crate::space::PLUTO_CIRCUMFERENCE`], [`crate::space::PLUTO_LOWEST_ALTITUDE`], [`crate::space::PLUTO_HIGHEST_ALTITUDE`]
309//!
310//! Saturn:
311//! [`crate::space::SATURN_RADIUS`], [`crate::space::SATURN_RADIUS_EQUATORIAL`], [`crate::space::SATURN_RADIUS_POLAR`], [`crate::space::SATURN_CIRCUMFERENCE`]
312//!
313//! Venus:
314//! [`crate::space::VENUS_RADIUS`], [`crate::space::VENUS_RADIUS_EQUATORIAL`], [`crate::space::VENUS_RADIUS_POLAR`], [`crate::space::VENUS_CIRCUMFERENCE`], [`crate::space::VENUS_LOWEST_ALTITUDE`], [`crate::space::VENUS_HIGHEST_ALTITUDE`]
315//!
316//! ### Data Structures
317//!
318//! - [`crate::data_structures::Cache`]: A cache of values with a max size to ensure that too much old data is not stored.
319//! - [`crate::data_structures::BoxIndex`]: A BoxIndex is a 2D spatial data structure that can be used to quickly find objects within a bounding box.
320//! - [`crate::data_structures::FlatQueue`]: A priority queue implemented using a binary heap.
321//! - [`crate::data_structures::PointCluster`]: A cluster store to index points at each zoom level
322//! - [`crate::data_structures::PointGrid`]: A cluster store to build grid data of grid_size x grid_size. The resultant tiles are filled. Useful for building raster tiles or other grid like data (temperature, precipitation, wind, etc).
323//! - [`crate::data_structures::PointIndex`]: An index of cells with radius queries Assumes the data is compatible with S2JSON MValues with serde_json serialization
324//! - [`crate::data_structures::PriorityQueue`]: A priority queue is a data structure that stores elements in a specific order.
325//! - [`crate::data_structures::Tile`]: Tile Class to contain the tile information for splitting or simplifying
326//! - [`crate::data_structures::TileStore`]: TileStore Class is a tile-lookup system that splits and simplifies as needed for each tile request
327//! - [`crate::data_structures::TransformVectorGeometry`]: A trait for transforming a geometry from the 0->1 coordinate system to a tile coordinate system
328//!
329//! ### Utilities
330//!
331//! - [`crate::util::decompress_fflate`]: Expands compressed GZIP, Zlib/DEFLATE, or DEFLATE_RAW data, automatically detecting the format
332//! - [`crate::util::decompress_lzw`]: The decompressed data
333//! - [`crate::util::compress_data`]: Compresses data using the specified format
334//! - [`crate::util::decompress_data`]: Decompress data using the specified format
335//! - [`crate::util::iter_zip_folder`]: Iterates through the items in a zip file
336//! - [`crate::util::Date`]: Convenience Date structure to model like a Javascript Date object.
337//! - [`crate::util::fetch_url`]: fetch mechanic for raw data
338
339extern crate alloc;
340#[cfg(feature = "std")]
341extern crate std;
342
343/// Data Storage Tools
344pub mod data_store;
345/// Data structures
346pub mod data_structures;
347/// Geometry Tools
348pub mod geometry;
349/// GIS Core Tools
350pub mod parsers;
351/// Projection Tools
352pub mod proj;
353/// GIS Readers
354pub mod readers;
355/// Space Tools
356pub mod space;
357/// Generic Geospatial Tools
358pub mod tools;
359/// Utility Tools
360pub mod util;
361/// GIS Writers
362pub mod writers;