From e0008cebef2deebcb2c9758990190abc14c87df9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Kom=C3=A1rek?= Date: Wed, 9 Oct 2024 09:31:16 +0200 Subject: [PATCH] Updated readme (#199) The readme was updated to reflect recent changes. It is now using the Coordinates API, which is the recommended way of using the epsg.io service. --- README.md | 135 +++++------------------------ static/img/epsg-logo-small.png | Bin 0 -> 12500 bytes static/img/maptiler-logo-small.png | Bin 0 -> 10210 bytes 3 files changed, 21 insertions(+), 114 deletions(-) create mode 100644 static/img/epsg-logo-small.png create mode 100644 static/img/maptiler-logo-small.png diff --git a/README.md b/README.md index 5242533..06c0035 100644 --- a/README.md +++ b/README.md @@ -1,126 +1,33 @@ -# EPSG.io -This service allows you to discover and transform coordinate systems from all over the world. Created and maintained by the [MapTiler team](https://www.maptiler.com/). +# EPSG.io -## Installation +![EPSG logo](./static/img/epsg-logo-small.png) -``` -$ virtualenv venv -$ source venv/bin/activate -$ pip install -r requirements.txt -``` -Copy the content of "index" directory from the .zip from the latest project release. +[EPSG.io](https://epsg.io/) is a tool for discovering and accessing global coordinate systems, finding their parameters, and selecting relevant transformations. Created and maintained by the [MapTiler team](https://www.maptiler.com/), it serves as a _custom_ interface to the [EPSG database](https://en.wikipedia.org/wiki/EPSG_Geodetic_Parameter_Dataset). -Start the server with: +The service offers a list of projections, coordinate systems, bounding boxes, and transformation options for improved precision in coordinate transformations. -``` -$ export FLASK_APP=app.py -$ export FLASK_ENV=development -$ flask run -``` +For detailed documentation, visit [epsg.io/docs](https://epsg.io/docs). -or use the gunicorn startup scripts (`./epsgio start`) +## Discovering coordinate systems, ellipsoids, transformations, units +Coordinate systems, ellipsoids, transformations, and units can be discovered directly via the search field at [EPSG.io](https://epsg.io/). The interface supports searching by EPSG codes (e.g., `3857`) or by part of the system's name (e.g., `pseudo-mercator`). Try [epsg.io/2056](https://epsg.io/2056) as an example. +## Export formats for all software +[EPSG.io](https://epsg.io/) offers coordinate reference system definitions in formats compatible with a wide range of geospatial software, including PROJ, GeoServer, Proj4.js, PostGIS, ESRI ArcGIS, and OGC WKT. For example, see [epsg.io/2056-1676.wkt2](https://epsg.io/2056-1676.wkt2). -## Create your own index from EPSG export +## EPSG.io endpoints +Using [EPSG.io](https://epsg.io/) endpoints allows users to discover coordinate systems, ellipsoids, units, and other objects, and retrieve specific coordinate definitions in various formats. For more details, visit [epsg.io/docs](https://epsg.io/docs). -Note: This is not required, as you can easily download the ready-to-use index from releases. +## Coordinates API -1. Download the newest EPSG database from [http://epsg-registry.org] - * a. After `login` it will able to `export registry` as `Export GML 3.2.1 with EPSG metadata` -2. Make sure that these files(folder) are in one folder - * a. folder `extra_codes_proj4_4.8.0.2` - * b. file `CRS_exceptions.csv` - * c. file `CRS_exceptions.py` - * d. file `gml_parser.py` - * e. file `GmlDictionary.xml` (downloaded EPSG database from http://epsg-registry.org) -3. Start indexing via `python gml_parser.py` -4. Move created `gml.sqlite` into `gml` folder +![MapTiler logo](./static/img/maptiler-logo-small.png) -## Types of URLs: - * [http://epsg.io/] > main page - * [http://epsg.io/1623] > transformation or crs - * [http://epsg.io/5514-1623] > crs with transformation - * [http://epsg.io/5514-1623.wkt] > page with wkt of crs 5514 with transformation 1623 - * [http://epsg.io/5514-1623/map] > page with map of crs 5514 with transformation 1623 - * [http://epsg.io/8901-primem] > other type then transformation or crs (prime meridia, datum,...) - * [http://epsg.io/ogp-op-1623] > gml:id from OGC XML - * [http://epsg.io/urn:ogc:def:coordinateOperation:EPSG::1623] > gml:identifier from OGC XML +[EPSG.io](https://epsg.io/) is a custom, open service provided by [MapTiler](https://www.maptiler.com/), free of charge. The **Coordinate transformation and search service** is powered by the [MapTiler Cloud Coordinates API](https://docs.maptiler.com/cloud/api/coordinates/). In addition to being compatible with [EPSG.io](https://epsg.io/), it introduces the [/transform](https://docs.maptiler.com/cloud/api/coordinates/#transform-coordinates) endpoint for coordinate transformations and [/search](https://docs.maptiler.com/cloud/api/coordinates/#search-coordinate-systems) API endpoint for searching through coordinate systems and its components. -CRS and Transformations are just codes (5514, 1623, 4326, 27700) -Other are codes with suffix like: - * for datums e.g. `9315-datum` - * for prime meridian e.g. `8901-primem` - * for ellipsoid e.g. `7004-ellipsoid` - * for method e.g. `9840-method` - * for coordinate system e.g. `6422-cs` - * for axis e.g. `106-axis` - * for area e.g. `1262-area` - * for units e.g. `9001-units` - -## API for results - -For result page exist a export in JSON and JSONP -for example - -[http://epsg.io/?q=czech&format=json&trans=1&callback=jsonpFunction] - -where: - * `format=json` for export in json **(obligatory)** - * `trans=1` for more detailed transformation in each coordinate reference system (optional) - * `callback=jsonpFunction` for jsonp where "jsonpFunction" is name of Javascript function (optional) - -## API for /trans - -### For one point -[http://epsg.io/trans?x=50&y=17&z=0&s_srs=4326&t_srs=5514&callback=jsonpFunction] - -where everything is optional: - * `x`, `y`, `z` are coordinates of point, which going to be transformed (default is 0,0,0) - * `s_srs` represent source coordinate reference system (default is EPSG:4326) - * `t_srs` represent target coordinate reference system (default is EPSG:4326) - * `callback=jsonpFunction` is for jsonp where "jsonpFunction" is name of JavaScript function - -e.g. [http://epsg.io/trans] will transform point on coordinates 0,0,0 from EPSG:4326 to EPSG:4326 - -### For many points -[http://epsg.io/trans?data=17,50;17,50,300;17.132,50.456&s_srs=4326&&t_srs=5514] - -Where -* data=x,y;x,y,z;x.x,y.y (for example) -* Delimiter between points is `;` -* Delimiter between x,y,z is `,` -* Delimiter between decimal is `.` - -## Types of queries - - * `kind:` - - value | meaning | value | meaning - --- | --- | --- | --- - CRS(default) | All coordinate reference systems | ELLIPSOID | Ellipsoid - PROJCRS | Projected coordinate systems | PRIMEM | Prime meridian - GEOGCRS|Geodetic coordinate systems|METHOD|Method - GEOG3DCRS|Geodetic 3D coordinate systems|CS|Coordinate systems - GCENCRS|Geocentric coordinate systems|VERTCS|Vertical coordinate system - VERTCRS|Vertical coordinate systems|SPHERCS|Spherical coordinate system - ENGCRS|Engineering coordinate systems|CARTESCS|Cartesian coordinate system - COMPOUNDCRS|Compound coordinate systems|ELLIPCS|Ellipsoidal coordinate system - COORDOP|All operations|AXIS|Axis - COPTRANS|Transformations|AREA|Area - COPCONOP|Compound operations|UNIT|Unit - COPCON|Conversions|ANGUNIT|Angle unit - DATUM|All datums|SCALEUNIT|Scale unit - VERTDAT|Vertical datums|LENUNIT|Length unit - ENGDAT|Engineering datums|TIMEUNIT|Time unit - GEODDAT|Geodetic datums|| - - - * `deprecated:` 0(default), 1 - * `code:` number of EPSG (5514, 4326,...) - * `name:` string of name (wgs 84, jtsk, s-jtks) - * `area:` string area of use (czech republic, world) - * `area_trans:` string area of use of transformation - * `alt_title:` alternative title (wgs84,...) - -combinations: 8901 kind:PRIMEM, 1623 kind:COORDOP, code:1625 kind:COORDOP deprecated:1,... +The **Coordinates API** from MapTiler offers: +* API for **coordinate transformations** +* API for **searching** and **discovering** coordinate reference systems +* **Stable, reliable service** for integration into applications +* Option to use a dedicated MapTiler API key, enabling cost management across **multiple apps** +* **Batch transformations** for up to 50 points +For detailed API documentation, visit [docs.maptiler.com/cloud/api/coordinates/](https://docs.maptiler.com/cloud/api/coordinates/). \ No newline at end of file diff --git a/static/img/epsg-logo-small.png b/static/img/epsg-logo-small.png new file mode 100644 index 0000000000000000000000000000000000000000..1cce7eb0c888ef5063718a40d1d8b6d40e31b51a GIT binary patch literal 12500 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 EAHYD|VE_OC literal 0 HcmV?d00001 diff --git a/static/img/maptiler-logo-small.png b/static/img/maptiler-logo-small.png new file mode 100644 index 0000000000000000000000000000000000000000..58ffa5e26d9230c98b53a5d5a5c34e1621416e4f GIT binary patch literal 10210 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 uLX