{ "info": { "author": "Karim Bahgat", "author_email": "karim.bahgat.norway@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "Intended Audience :: Science/Research", "License :: OSI Approved", "Programming Language :: Python", "Topic :: Scientific/Engineering :: GIS" ], "description": "# PyCRS\n\n[![Build Status](https://travis-ci.org/karimbahgat/PyCRS.svg?branch=master)](https://travis-ci.org/karimbahgat/PyCRS)\n\nPyCRS is a pure Python GIS package for reading, writing, and converting between various\ncommon coordinate reference system (CRS) string and data source formats. \n\n![](https://github.com/karimbahgat/pycrs/raw/master/testrenders/logo.png \"PyCRS\")\n\n**Version: 1.0.1**\n\n- [GitHub Repository](http://github.com/karimbahgat/PyCRS)\n- [API Documentation](https://karimbahgat.github.io/PyCRS/)\n\n\n## Table of Contents\n\n- [Introduction](#introduction)\n- [Status](#status)\n- [Platforms](#platforms)\n- [Dependencies](#dependencies)\n- [Installation](#installation)\n- [Examples](#examples)\n - [Creating a CS Instance](#creating-a-cs-instance)\n - [Loading from an external source](#loading-from-an-external-source)\n - [Loading from a Shapefile](#loading-from-a-shapefile)\n - [Loading from a GeoJSON](#loading-from-a-geojson)\n - [Loading from a URL](#loading-from-a-url)\n - [Parsing from a text string](#parsing-from-a-text-string)\n - [Parsing from proj4 string](#parsing-from-proj4-string)\n - [Parsing from ESRI WKT string](#parsing-from-esri-wkt-string)\n - [Parsing from OGC WKT string](#parsing-from-ogc-wkt-string)\n - [Parsing from unknown string](#parsing-from-unknown-string)\n - [Looking up a coordinate system code](#looking-up-a-coordinate-system-code)\n - [Looking up EPSG codes](#looking-up-epsg-codes)\n - [Looking up ESRI codes](#looking-up-esri-codes)\n - [Looking up SR codes](#looking-up-sr-codes)\n - [Inspecting the CS Instance](#inspecting-the-cs-instance)\n - [Geographic CS](#geographic-crs)\n - [Projected CS](#projected-crs)\n - [Converting to other CRS formats](#converting-to-other-crs-formats)\n - [Converting to Proj4](#converting-to-proj4)\n - [Converting to ESRI WKT](#converting-to-esri-wkt)\n - [Converting to OGC WKT](#converting-to-ogc-wkt)\n- [Recipes](#recipes)\n\t- [Modifying the CS Instance](#modifying-the-cs-instance)\n - [Coordinate Transformations](#coordinate-transformations)\n - [Writing a Shapefile .prj file](#writing-a-shapefile-.prj-file)\n- [Testing](#testing)\n- [License](#license)\n- [Credits](#credits)\n\n\n## Introduction\n\nPython should have a standalone GIS library focused solely on coordinate reference system metadata.\nThat is, a library focused on the various formats used to store and represent crs definitions, including\nOGC WKT, ESRI WKT, Proj4, and various short-codes defined by organizations like EPSG, ESRI, and SR-ORG.\nCorrectly parsing and converting between these formats is essential in many types of GIS work.\nFor instance when trying to use PyProj to transform coordinates from a non-proj4 crs format. Or\nwhen wanting to convert the crs from a GeoJSON file to a .prj file. Or when simply adding a crs definition\nto a file that was previously missing one. \n\nWhen I created PyCRS, the only way to read and convert between crs formats was to use the extensive Python\nGDAL suite and its srs submodule, but the requirements of some applications might exclude the use of\nGDAL. There have also been some online websites/services, but these only allow partial lookups or\none-way conversion from one format to another. I therefore hope that PyCRS will make it easier for\nlightweight applications to read a broader range of data files and correctly interpret and possibly transform\ntheir crs definitions. Written entirely in Python I also hope it will help clarify the differences\nbetween the various formats, and make it easier for more people to help keep it up-to-date and bug-free. \n\n\n## Status\n\nCurrently, the supported formats are OGC WKT (v1), ESRI WKT, Proj4, and any EPSG, ESRI, or SR-ORG code\navailable from spatialreference.org. In the future I hope to add support for OGC URN identifier strings,\nand GeoTIFF file tags.\n\nThere are still some cases where PyCRS does not perfectly parse or convert between all crs formats,\nbased on (hopefully mostly cosmetic) differences from the results of other parsers like GDAL.\nIn the source repository there is a tester.py script, which uses a barrage of commonly\nused crs as listed on http://www.remotesensing.org/geotiff/proj_list/. Currently, the overall success rate\nfor loading as well as converting between the three main formats is 80-90%, and visual inspections of \nrendering the world with each crs generally look correct. However, whether the converted crs strings\nare logically equivalent to each other from a mathematical standpoint is something that needs a more detailed\nquality check. \n\n\n## Platforms\n\nPython 2 and 3. \n\n\n## Dependencies\n\nPure Python, no dependencies. \n\n\n## Installation\n\nPyCRS is installed with pip from the commandline:\n\n pip install pycrs\n\nIt also works to just place the \"pycrs\" package folder in an importable location like \n\"PythonXX/Lib/site-packages\".\n\n\n## Examples\n\nBegin by importing the pycrs module:\n\n >>> import pycrs\n\n\n### Creating a CS Instance\n\nPyCRS uses different types of CS classes to represent and handle all coordinate reference systems.\nTo create one you can either load it from a source, parse it from a string,\nlook up from a CRS code, or build it from scratch. Let's review these different ways of creating\na CS type instance. \n\n\n#### Loading from an external source\n\nIf you know the crs information is located in some external source, PyCRS provides some convenient\nfunctions for loading these, all located in the \"pycrs.load\" module. \n\n##### Loading from a Shapefile\n\nIn most situations this will mean reading the ESRI .prj file that accomponies\na shapefile. PyCRS has a convenience function for doing that:\n\n >>> crs = pycrs.load.from_file(\"testfiles/natearth.prj\")\n\n##### Loading from a GeoJSON\n\nThe same function also supports reading the crs from GeoJSON files:\n\n >>> crs = pycrs.load.from_file(\"testfiles/cshapes.geo.json\")\n\n##### Loading from a URL\n\nIf your crs is not defined in a file, but rather as plain text on a webpage, there is also a function for that:\n\n >>> crs = pycrs.load.from_url(\"http://spatialreference.org/ref/esri/54030/ogcwkt/\")\n\n\n#### Parsing from a text string\n\nIn many cases however, you may already have the string representation in your code. This could be if you\nare interoperating with other libraries, or you have already read it from some external source.\nIn these cases, you can create the CS type instance by using the functions available in the \"pycrs.parse\"\nmodule.\n\n##### Parsing from proj4 string or dict\n\nTo create the CS type instance from a proj4 string, you can do like this:\n\n >>> proj4 = \"+proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs\"\n >>> crs = pycrs.parse.from_proj4(proj4)\n\nOr if your proj4 string is represented as a dict:\n\n >>> proj4_as_dict = dict(proj='robin', lon_0=0, x_0=0, y_0=0, ellps='WGS84', datum='WGS84', units='m')\n >>> crs = pycrs.parse.from_proj4(proj4_as_dict)\n\n##### Parsing from ESRI WKT string\n\nThe ESRI WKT format is the format typically found in a shapefile's .prj file.\nIf you have already loaded it from a file, you can parse it like this:\n\n >>> esri_wkt = 'PROJCS[\"World_Robinson\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[\"Robinson\"],PARAMETER[\"False_Easting\",0],PARAMETER[\"False_Northing\",0],PARAMETER[\"Central_Meridian\",0],UNIT[\"Meter\",1]]'\n >>> crs = pycrs.parse.from_esri_wkt(esri_wkt)\n\n##### Parsing from OGC WKT string\n\nThe Open Geospatial Consortium (OGC) WKT format is a newer variant of the ESRI WKT.\nThere are only minor differences, but will likely be more supported in the future. \nIf you already have it as a string, you can parse it like this:\n\n >>> ogc_wkt = 'PROJCS[\"World_Robinson\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"WGS_1984\",SPHEROID[\"WGS_1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[\"Robinson\"],PARAMETER[\"False_Easting\",0],PARAMETER[\"False_Northing\",0],PARAMETER[\"Central_Meridian\",0],UNIT[\"Meter\",1],AUTHORITY[\"EPSG\",\"54030\"]]'\n >>> crs = pycrs.parse.from_ogc_wkt(ogc_wkt)\n\n##### Parsing from unknown string\n\nFinally, if you do not know the format of the crs string, you can also let PyCRS autodetect\nand parse the crs type for you:\n\n >>> for unknown in [proj4, esri_wkt, ogc_wkt]:\n ... crs = pycrs.parse.from_unknown_text(unknown)\n\n\n#### Looking up a coordinate system code\n\nAnother common way to store a coordinate system is through a lookup code that is available for\nmany of the more commonly used ones. Multiple different agencies have defined their own sets of\ncodes.\n\n##### Looking up EPSG codes\n\nTo look up codes defined by EPSG:\n\n >>> crs = pycrs.parse.from_epsg_code(4326)\n\n##### Looking up ESRI codes\n\nTo look up codes defined by ESRI:\n\n >>> crs = pycrs.parse.from_esri_code(54030)\n\n##### Looking up SR codes\n\nTo look up codes defined by spatialreference.org:\n\n >>> crs = pycrs.parse.from_sr_code(42)\n \n\n\n### Inspecting the CS Instance\n\nOnce you have loaded, parsed, looked up, or created a coordinate reference system, you end up with one of the \nCS type instances in the pycrs.cs module. All CS types are subclasses of pycrs.CS:\n\n\t>>> isinstance(crs, pycrs.CS)\n\tTrue\n\t\nPyCRS currently only supports the two most common types of CS, geographic or projected. \n\n#### Geographic CS\n\nA geographic reference system keeps coordinates in the latitude-longitude space, and the reason we specify\nit is because there are different ways of defining the shape of the earth. As an example, let's load the commonly\nused WGS84 geographic coordinate system:\n\n >>> crs = pycrs.parse.from_epsg_code(4326)\n\t\nIf it loaded correctly you should now have a pycrs.GeogCS instance, which you can also check through the `cs_type` attribute:\n\n\t>>> isinstance(crs, pycrs.GeogCS)\n\tTrue\n >>> crs.cs_type\n 'Geographic'\n\nThrough the GeogCS instance, we can further access its subcomponents and parameters.\nFor instance, if we wanted to check the datum we could do:\n\n >>> datum = crs.datum\n >>> isinstance(datum, pycrs.elements.datums.WGS84)\n True\n\nOr the inverse flattening factor of the ellipsoid:\n\n >>> ellips = crs.datum.ellips\n >>> ellips.inv_flat.value\n 298.257223563\n\nFor more ideas on how to inspect the GeogCS instance, the following overview gives an idea of the\ncomposition and attributes of a geographic CS:\n\n- pycrs.GeogCS\n\t- `name` -> string\n\t- `datum` -> a datum from pycrs.elements.datums\n\t\t- `name` -> pycrs.elements.datums.DatumName\n\t\t\t- `proj4` -> string\n\t\t\t- `esri_wkt` -> string\n\t\t\t- `ogc_wkt` -> string\n\t\t- `ellips` -> an ellipsoid from pycrs.elements.ellipsoids\n\t\t\t- `name` -> pycrs.elements.ellipsoids.EllipsoidName\n\t\t\t\t- `proj4` -> string\n\t\t\t\t- `esri_wkt` -> string\n\t\t\t\t- `ogc_wkt` -> string\n\t\t\t- `semimaj_ax` -> pycrs.elements.parameters.SemiMajorRadius\n\t\t\t\t- `value` -> float\n\t\t\t- `semimin_ax` -> (optional) pycrs.elements.parameters.SemiMinorRadius\n\t\t\t\t- `value` -> float\n\t\t\t- `flat` -> (optional) pycrs.elements.parameters.Flattening\n\t\t\t\t- `value` -> float\n\t\t\t- `inv_flat` -> (optional) pycrs.elements.parameters.InverseFlattening\n\t\t\t\t- `value` -> float\n\t\t- `datumshift` -> (optional) pycrs.elements.parameters.DatumShift or None\n\t- `prime_mer` -> pycrs.elements.parameters.PrimeMeridian\n\t\t- `value` -> float\n\t- `angunit` -> an angular unit from pycrs.elements.units, eg Degree\n\t\t- `unitname` -> pycrs.elements.units.UnitName\n\t\t\t- `proj4` -> string\n\t\t\t- `esri_wkt` -> string\n\t\t\t- `ogc_wkt` -> string\n\t\t- `unitmultiplier` -> pycrs.elements.units.UnitMultiplier\n\t\t\t- `value` -> float\n\t- `twin_ax` -> tuple\n\t\t- 1: a named compass direction (east-west) from pycrs.elements.directions\n\t\t- 2: a named compass direction (north-south) from pycrs.elements.directions\n\n#### Projected CS\n\nA projected reference system keeps coordinates in projected x-y space. In addition to\ndefining the shape of the earth through a child GeogCS, the projected reference system\ndefines some additional parameters in order to transform the coordinates to a wide\nvariety of map types. Let's take the commonly used World Robinson projected coordinate\nsystem as our example:\n\n >>> crs = pycrs.parse.from_esri_code(54030)\n\t\nIf it loaded correctly you should now have a pycrs.ProjCS instance, which you can also check through the `cs_type` attribute:\n\n\t>>> isinstance(crs, pycrs.ProjCS)\n\tTrue\n >>> crs.cs_type\n 'Projected'\n\nThrough the ProjCS instance, we can further access its subcomponents and parameters.\nFor instance, if we wanted to check the named projection we could do:\n\n >>> proj = crs.proj\n >>> isinstance(proj, pycrs.elements.projections.Robinson)\n True\n\nOr check the type of coordinate unit:\n\n >>> unit = crs.unit\n >>> isinstance(unit, pycrs.elements.units.Meter)\n True\n\nFor more ideas on how to inspect the ProjCS instance, the following overview gives an idea of the\ncomposition and attributes of a projected CS:\n\n- pycrs.ProjCS\n\t- `name` -> string\n\t- `geogcs` -> pycrs.GeogCS (See the section on geographic CS...)\n\t- `proj` -> a projection from pycrs.elements.projections\n\t\t- `name` -> pycrs.elements.projections.ProjName\n\t\t\t- `proj4` -> string\n\t\t\t- `esri_wkt` -> string\n\t\t\t- `ogc_wkt` -> string\n\t- `params` -> list\n\t\t- 1: named parameters from pycrs.elements.parameters\n\t\t- 2: named parameters from pycrs.elements.parameters\n\t\t- 3: ...\n\t\t- n: named parameters from pycrs.elements.parameters\n\t- `unit` -> a unit from pycrs.elements.units\n\t\t- `unitname` -> pycrs.elements.units.UnitName\n\t\t\t- `proj4` -> string\n\t\t\t- `esri_wkt` -> string\n\t\t\t- `ogc_wkt` -> string\n\t\t- `unitmultiplier` -> pycrs.elements.units.UnitMultiplier\n\t\t\t- `value` -> float\n\t- `twin_ax` -> tuple\n\t\t- 1: a named compass direction (east-west) from pycrs.elements.directions\n\t\t- 2: a named compass direction (north-south) from pycrs.elements.directions\n\n \n\n### Converting to other CRS formats\n\nOnce you have read the crs of the original data source, you may want to convert it to some other crs format.\nPyCRS allows converting to the following CRS formats:\n\n#### Converting to Proj4\n\n\t# as a string\n >>> crs.to_proj4()\n '+proj=robin +datum=WGS84 +ellps=WGS84 +a=6378137.0 +rf=298.257223563 +pm=0 +lon_0=0 +x_0=0 +y_0=0 +units=m +axis=enu +no_defs'\n\t\n\t# or as a dict\n\t>>> isinstance(crs.to_proj4(as_dict=True), dict)\n\tTrue\n\n#### Converting to ESRI WKT\n\n >>> crs.to_esri_wkt()\n 'PROJCS[\"Unknown\", GEOGCS[\"Unknown\", DATUM[\"D_WGS_1984\", SPHEROID[\"WGS_1984\", 6378137.0, 298.257223563]], PRIMEM[\"Greenwich\", 0], UNIT[\"Degree\", 0.017453292519943295], AXIS[\"Lon\", EAST], AXIS[\"Lat\", NORTH]], PROJECTION[\"Robinson\"], PARAMETER[\"Central_Meridian\", 0], PARAMETER[\"False_Easting\", 0], PARAMETER[\"False_Northing\", 0], UNIT[\"Meter\", 1.0], AXIS[\"X\", EAST], AXIS[\"Y\", NORTH]]'\n\n#### Converting to OGC WKT\n\n >>> crs.to_ogc_wkt()\n 'PROJCS[\"Unknown\", GEOGCS[\"Unknown\", DATUM[\"WGS_1984\", SPHEROID[\"WGS_1984\", 6378137.0, 298.257223563]], PRIMEM[\"Greenwich\", 0], UNIT[\"degree\", 0.017453292519943295], AXIS[\"Lon\", EAST], AXIS[\"Lat\", NORTH]], PROJECTION[\"Robinson\"], PARAMETER[\"Central_Meridian\", 0], PARAMETER[\"false_easting\", 0], PARAMETER[\"false_northing\", 0], UNIT[\"Meters\", 1.0], AXIS[\"X\", EAST], AXIS[\"Y\", NORTH]]'\n\n\n\n---\n\t\n## Recipes\n\n### Modifying the CS Instance\n\nIn most case you will only ever need to load a CRS and convert it to some format. \nSometimes, however, you may want to tweak the parameters of your CS type instance.\nKnowing the composition of your CS type instance, this is as easy as setting/replacing the\ndesired attributes. \n\nLet's demonstrate some examples using the World Robinson projection:\n\n >>> crs = pycrs.parse.from_esri_code(54030) # Robinson projection from esri code\n >>> crs.to_ogc_wkt()\n 'PROJCS[\"Unknown\", GEOGCS[\"Unknown\", DATUM[\"WGS_1984\", SPHEROID[\"WGS_1984\", 6378137.0, 298.257223563]], PRIMEM[\"Greenwich\", 0], UNIT[\"degree\", 0.017453292519943295], AXIS[\"Lon\", EAST], AXIS[\"Lat\", NORTH]], PROJECTION[\"Robinson\"], PARAMETER[\"Central_Meridian\", 0], PARAMETER[\"false_easting\", 0], PARAMETER[\"false_northing\", 0], UNIT[\"Meters\", 1.0], AXIS[\"X\", EAST], AXIS[\"Y\", NORTH]]'\n\nHere is a map of the default Robinson projection:\n\n![](https://github.com/karimbahgat/pycrs/raw/master/testrenders/docs_orig.png \"Defualt Robinson\")\n\nLet's say we wanted to switch its datum from WGS84 to NAD83, we could do it\nlike so:\n\n >>> crs.geogcs.datum = pycrs.elements.datums.NAD83()\n >>> crs.to_ogc_wkt()\n 'PROJCS[\"Unknown\", GEOGCS[\"Unknown\", DATUM[\"North_American_Datum_1983\", SPHEROID[\"GRS_1980\", 6378137.0, 298.257222101]], PRIMEM[\"Greenwich\", 0], UNIT[\"degree\", 0.017453292519943295], AXIS[\"Lon\", EAST], AXIS[\"Lat\", NORTH]], PROJECTION[\"Robinson\"], PARAMETER[\"Central_Meridian\", 0], PARAMETER[\"false_easting\", 0], PARAMETER[\"false_northing\", 0], UNIT[\"Meters\", 1.0], AXIS[\"X\", EAST], AXIS[\"Y\", NORTH]]'\n\nOr let's say we wanted to switch its prime meridian, so that the longitude axis is centered\ncloser to the Pacific instead of over Greenwhich:\n\n >>> crs.geogcs.prime_mer.value = 160.0\n >>> crs.to_ogc_wkt()\n 'PROJCS[\"Unknown\", GEOGCS[\"Unknown\", DATUM[\"North_American_Datum_1983\", SPHEROID[\"GRS_1980\", 6378137.0, 298.257222101]], PRIMEM[\"Greenwich\", 160], UNIT[\"degree\", 0.017453292519943295], AXIS[\"Lon\", EAST], AXIS[\"Lat\", NORTH]], PROJECTION[\"Robinson\"], PARAMETER[\"Central_Meridian\", 0], PARAMETER[\"false_easting\", 0], PARAMETER[\"false_northing\", 0], UNIT[\"Meters\", 1.0], AXIS[\"X\", EAST], AXIS[\"Y\", NORTH]]'\n\nAnd here is what that map would look like (the odd-looking lines is just a rendering issue due to\npolygons that cross the meridian):\n\n![](https://github.com/karimbahgat/pycrs/raw/master/testrenders/docs_tweak2.png \"Modified Robinson\")\n\nOr if we just switch the projection type alltogether:\n\n >>> crs.proj = pycrs.elements.projections.Sinusoidal()\n >>> crs.to_ogc_wkt()\n 'PROJCS[\"Unknown\", GEOGCS[\"Unknown\", DATUM[\"North_American_Datum_1983\", SPHEROID[\"GRS_1980\", 6378137.0, 298.257222101]], PRIMEM[\"Greenwich\", 160], UNIT[\"degree\", 0.017453292519943295], AXIS[\"Lon\", EAST], AXIS[\"Lat\", NORTH]], PROJECTION[\"Sinusoidal\"], PARAMETER[\"Central_Meridian\", 0], PARAMETER[\"false_easting\", 0], PARAMETER[\"false_northing\", 0], UNIT[\"Meters\", 1.0], AXIS[\"X\", EAST], AXIS[\"Y\", NORTH]]'\n\t\n![](https://github.com/karimbahgat/pycrs/raw/master/testrenders/docs_tweak3.png \"Modified Sinusoidal\")\t\n\n### Coordinate Transformations\n\nA common reason for wanting to convert between CRS formats, is if you want to transform coordinates\nfrom one coordinate system to another. In Python this is typically done with the PyProj module,\nwhich only takes proj4 format. Using PyCRS we can easily define the original coordinate system that\nwe want to convert and get its proj4 representation:\n\n >>> fromcrs = pycrs.parse.from_epsg_code(4326) # WGS84 projection from epsg code\n >>> fromcrs_proj4 = fromcrs.to_proj4()\n\nWe can then use PyCRS to define our target projection from the format of your choice, before converting\nit to the proj4 format that PyProj expects:\n\n >>> tocrs = pycrs.parse.from_esri_code(54030) # Robinson projection from esri code\n >>> tocrs_proj4 = tocrs.to_proj4()\n\nWith the source and target projections defined in the proj4 crs format, we are ready to transform our\ndata coordinates with PyProj: \n\n >>> import pyproj\n >>> fromproj = pyproj.Proj(fromcrs_proj4)\n >>> toproj = pyproj.Proj(tocrs_proj4)\n >>> lng,lat = -76.7075, 37.2707 # Williamsburg, Virginia :)\n >>> pyproj.transform(fromproj, toproj, lng, lat)\n (-6766170.001635834, 3985755.032695593)\n\n### Writing a Shapefile .prj file\n\nAfter you transform your data coordinates you may also wish to save the data back to file along with the new\ncrs. With PyCRS you can do this in a variety of crs format. For instance, to write a shapefile .prj file:\n\n >>> with open(\"testfiles/shapefile.prj\", \"w\") as writer:\n ... _ = writer.write(tocrs.to_esri_wkt())\n\n\n\n---\n\n## Testing\n\nThe testing suite is still a work in progress and is spread across multiple files.\nThe files testdocs.py (the official doctests) and testbatch.py (tests and renders a batch of projections)\ncan be run from the prompt:\n\n python testdocs.py\n python testbatch.py\n\nThe test files have a few dependent python packages that will need to be installed to fully work:\n\n- [pyproj](https://github.com/jswhit/pyproj) - cartographic projection and coordinate system transformation, python wrapper PROJ.4 C library\n- [PyAgg](https://github.com/karimbahgat/PyAgg) - Aggdraw wrapper for lightweight drawing\n- [PyGeoj](https://github.com/karimbahgat/PyGeoj) - geojson reader/writer\n \n\n\n\n\n\n\n## License\n\nThis code is free to share, use, reuse,\nand modify according to the MIT license, see license.txt\n\n\n\n## Credits\n\n- Karim Bahgat\n- Micah Cochrain\n- Mike Kittridge\n- Roger Lew\n- Gregory Halvorsen\n- M Clark\n- David Hoese\n", "description_content_type": "", "docs_url": "https://pythonhosted.org/PyCRS/", "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/karimbahgat/PyCRS", "keywords": "GIS spatial CRS projection coordinate system format", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "PyCRS", "package_url": "https://pypi.org/project/PyCRS/", "platform": "", "project_url": "https://pypi.org/project/PyCRS/", "project_urls": { "Homepage": "http://github.com/karimbahgat/PyCRS" }, "release_url": "https://pypi.org/project/PyCRS/1.0.1/", "requires_dist": null, "requires_python": "", "summary": "GIS package for reading, writing, and converting between CRS formats.", "version": "1.0.1" }, "last_serial": 4910212, "releases": { "0.1.2": [ { "comment_text": "", "digests": { "md5": "118fddbc876ea98ad2dd11fc452d03b0", "sha256": "7b09269848568112cd3316d8e807ad3eb2242470f43671f2ef3c046116eabf5c" }, "downloads": -1, "filename": "PyCRS-0.1.2.zip", "has_sig": false, "md5_digest": "118fddbc876ea98ad2dd11fc452d03b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30734, "upload_time": "2015-08-05T13:39:12", "url": "https://files.pythonhosted.org/packages/2f/9b/45dea9087f31e28da2ad269d948f4b35b41ab773c181e95af6af5fbd87e8/PyCRS-0.1.2.zip" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "22260778c9fbe6964498db1abf4af05f", "sha256": "5daecb2254c19aa05ad4097f06b93d37a0a0f7eba996a182c02999cf1dc28caf" }, "downloads": -1, "filename": "PyCRS-0.1.3.zip", "has_sig": false, "md5_digest": "22260778c9fbe6964498db1abf4af05f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31345, "upload_time": "2016-06-25T11:53:06", "url": "https://files.pythonhosted.org/packages/cb/95/c37771b79e53c44fe3d790212b6cf3c804ef6e36dafdeaf0424ed0d963e9/PyCRS-0.1.3.zip" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "61a394d76337964ae14979f38f8d40c2", "sha256": "7ed77739979800318c8b06793ad18063b2a12001dd3e1335d5c668055f6c1e8f" }, "downloads": -1, "filename": "PyCRS-1.0.0.tar.gz", "has_sig": false, "md5_digest": "61a394d76337964ae14979f38f8d40c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31792, "upload_time": "2019-02-04T07:25:42", "url": "https://files.pythonhosted.org/packages/01/55/190dfdb7318ffb1625167ee64e31e07d8397ae0517f2c9546809393bc7ea/PyCRS-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "e2eede6b65afd2f235bc0988ed4ac63d", "sha256": "f6fd88d5b6b1bcd4615c0f9867eab8a8285537119a75d6ead19191b76a0e02c1" }, "downloads": -1, "filename": "PyCRS-1.0.1.tar.gz", "has_sig": false, "md5_digest": "e2eede6b65afd2f235bc0988ed4ac63d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32147, "upload_time": "2019-03-07T13:21:38", "url": "https://files.pythonhosted.org/packages/35/5a/a617774dc1d18bd02866f207ddd07ca4d6a8b9239c8b0e9dfba66260198b/PyCRS-1.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e2eede6b65afd2f235bc0988ed4ac63d", "sha256": "f6fd88d5b6b1bcd4615c0f9867eab8a8285537119a75d6ead19191b76a0e02c1" }, "downloads": -1, "filename": "PyCRS-1.0.1.tar.gz", "has_sig": false, "md5_digest": "e2eede6b65afd2f235bc0988ed4ac63d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32147, "upload_time": "2019-03-07T13:21:38", "url": "https://files.pythonhosted.org/packages/35/5a/a617774dc1d18bd02866f207ddd07ca4d6a8b9239c8b0e9dfba66260198b/PyCRS-1.0.1.tar.gz" } ] }