{ "info": { "author": "Mattijn van Hoek", "author_email": "mattijn@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: BSD License" ], "description": "# topojson\n\n[![PyPI version](https://img.shields.io/pypi/v/topojson.svg)](https://pypi.org/project/topojson)\n[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)\n[![build status](http://img.shields.io/travis/mattijn/topojson/master.svg?style=flat)](https://travis-ci.org/mattijn/topojson)\n\n_[Ready for Beta Users! With other words: break it, but please report it]_\n\n#\n\n_Topojson_ encodes geographic data structures into a shared topology. This repository describes the development of a **Python** implementation of the TopoJSON format.\n\n## Usage\n\nThe package can be used in multiple different ways, with the main purpose to create a TopoJSON topology:\n\n```python\nimport topojson\n\ndata = [\n {\"type\": \"Polygon\", \"coordinates\": [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]]},\n {\"type\": \"Polygon\", \"coordinates\": [[[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]]]}\n]\n\ntj = topojson.Topology(data, prequantize=False, topology=True)\ntj.to_json()\n```\n\nWhat results in the following TopoJSON object:\n\n```python\n'{\"type\": \"Topology\", \"objects\": {\"data\": {\"geometries\": [{\"type\": \"Polygon\", \"arcs\": [[-2, 0]]}, {\"type\": \"Polygon\", \"arcs\": [[1, 2]]}], \"type\": \"GeometryCollection\"}}, \"bbox\": [0.0, 0.0, 2.0, 1.0], \"arcs\": [[[1.0, 0.0], [0.0, 0.0], [0.0, 1.0], [1.0, 1.0]], [[1.0, 0.0], [1.0, 1.0]], [[1.0, 1.0], [2.0, 1.0], [2.0, 0.0], [1.0, 0.0]]]}'\n```\n\nMore or less all Python objects containing geographical data are supported through the `__geo_interface__` attribute. This includes at least the Python packages `geojson`, `shapely`, `geopandas`, `pyshp`.\n\nMoreover a `dict` of objects that provide a valid `__geo_interface__`, a `list` of objects that provide a valid `__geo_interface__` and `str` objects with TopoJSON or GeoJSON geographic structures are supported too.\n\nIn the example above the output is parsed to a JSON string (`.to_json()`), but this is not the only thing we can do. Multiple functions are available to serialize the Topology object.\n\n| Functions | Required Packages |\n| ------------------------------- | ----------------------------------------------------------------------- |\n| topojson.Topology().to_json() | Shapely, NumPy |\n| topojson.Topology().to_dict() | Shapely, NumPy |\n| topojson.Topology().to_svg() | Shapely, NumPy |\n| topojson.Topology().to_alt() | Shapely, NumPy, Altair\\* |\n| topojson.Topology().to_gdf() | Shapely, NumPy, GeoPandas\\* |\n| topojson.Topology().to_widget() | Shapely, NumPy, Altair*, Simplification*, ipywidgets\\* (+ labextension) |\n\n\\* optional dependencies\n\nThe TopoJSON format is merely designed to create smaller files than its GeoJSON counterpart. It is capable of doing so through a few options of which the following are currently available: compute topology, quantize the input and/or output, simplify the input and/or output.\n\nThe following parameters can be used to control these options for generating the `Topology()` object. Detailed information can be found in the docstring of the [`topojson.Topology()`](https://github.com/mattijn/topojson/blob/master/topojson/core/topology.py#L18:L79) class.\n\n- topology\n- prequantize\n- topoquantize\n- presimplify\n- toposimplify\n- simplify_with\n- simplify_algorithm\n- winding_order\n\nWhere the `toposimplify` and `topoquantize` are supported by chaining as well. Meaning you could first compute the Topology (which can be cost-intensive) and afterwards apply the simplify and quantize settings on the computed Topology and visualize till pleased.\n\n```python\ntj = topojson.Topology(data, prequantize=False, topology=True)\ntj.toposimplify(1).topoquantize(1e6).to_svg()\n```\n\nOr use the ipywidget approach described more below for an interactive approach.\n\n## Installation\n\nInstallation can be done by:\n\n```\npython3 -m pip install topojson\n```\n\nTopojson depends on the following packages:\n\n- numpy\n- shapely\n\nWindows users: download the dependencies from https://www.lfd.uci.edu/~gohlke/pythonlibs/.\nOS X or Linux users: use `pip` as usual\n\nFurther, optional dependencies are:\n\n- altair (enlarge the experience by visualizing your TopoJSON output)\n- simplification (more and quicker simplification options)\n- geojson (parse string input with GeoJSON data)\n- geopandas (with `fiona` version >=1.8.6!, parse your TopoJSON output directly into a GeoDataFrame - converting it to GeoJSON)\n- ipywidgets + (lab)extension (make your life complete with the interactive experience)\n\n## Get in touch\n\nFor now, just use the Github issues. That can be:\n\n- usage questions\n- bug reports\n- feature suggestions\n- or anything related\n\n## Examples and tutorial notebooks\n\nThe followig examples present different input types parsed to different output types. The input types are not dependent on the used output type and vice versa, they are just possible examples.\n\n### Input Type: `list`\n\nThe list should contain items that supports the `__geo_interface__`\n\n```python\nimport topojson\n\nlist_geoms = [\n {\"type\": \"Polygon\", \"coordinates\": [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]]},\n {\"type\": \"Polygon\", \"coordinates\": [[[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]]]}\n]\n```\n\n#\n\n#### apply Topology and present the output as dict\n\n```python\ntj = topojson.Topology(data, prequantize=False, topology=True)\ntj.to_dict()\n```\n\n```python\n{'type': 'Topology',\n [[1.0, 0.0], [1.0, 1.0]],\n [[1.0, 1.0], [2.0, 1.0], [2.0, 0.0], [1.0, 0.0]]],\n 'objects': {'data': {'geometries': [{'type': 'Polygon', 'arcs': [[-2, 0]]},\n {'type': 'Polygon', 'arcs': [[1, 2]]}],\n 'type': 'GeometryCollection'}},\n 'options': TopoOptions(\n {'prequantize': False,\n 'presimplify': False,\n 'simplify_with': 'shapely',\n 'topology': True,\n 'topoquantize': False,\n 'toposimplify': 0.0001,\n 'winding_order': 'CW_CCW'}\n ),\n 'bbox': (0.0, 0.0, 2.0, 1.0),\n 'arcs': [[[1.0, 0.0], [0.0, 0.0], [0.0, 1.0], [1.0, 1.0]],\n [[1.0, 0.0], [1.0, 1.0]],\n [[1.0, 1.0], [2.0, 1.0], [2.0, 0.0], [1.0, 0.0]]]}\n```\n\n#\n\n### Input Type: `dict`\n\nThe dictionary should be structured like {`key1`: `obj1`, `key2`: `obj2`}.\n\n```python\nimport topojson\n\ndictionary = {\n 0: {\n \"type\": \"Polygon\",\n \"coordinates\": [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]],\n },\n 1: {\n \"type\": \"Polygon\",\n \"coordinates\": [[[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]]],\n }\n}\n```\n\n#\n\n#### apply Topology and present the output as scalable vector graphic\n\n```python\ntj = topojson.Topology(dictionary, prequantize=False, topology=True)\ntj.to_svg()\n```\n\n\"svg\"\n\n#\n\n### Input Type: `GeoDataFrame` from package `geopandas` (if installed)\n\n```python\nimport geopandas\nimport topojson\nfrom shapely import geometry\n%matplotlib inline\n\ngdf = geopandas.GeoDataFrame({\n \"name\": [\"abc\", \"def\"],\n \"geometry\": [\n geometry.Polygon([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]),\n geometry.Polygon([[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]])\n ]\n})\ngdf.plot(column=\"name\")\ngdf.head()\n```\n\n
\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
namegeometry
0abcPOLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))
1defPOLYGON ((1 0, 2 0, 2 1, 1 1, 1 0))
\n
\n\n\"geodataframe\"\n\n#\n\n#### apply Topology and present output as `altair` chart (if installed)\n\n```python\ntj = topojson.Topology(gdf, prequantize=False, topology=True)\ntj.to_alt(color='properties.name:N')\n```\n\n\"altair\"\n\n#\n\n### Input Type: `FeatureCollection` from package `geojson` (if installed)\n\n```python\nfrom geojson import Feature, Polygon, FeatureCollection\n\nfeature_1 = Feature(\n geometry=Polygon([[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]]),\n properties={\"name\":\"abc\"}\n)\nfeature_2 = Feature(\n geometry=Polygon([[[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]]]),\n properties={\"name\":\"def\"}\n)\nfeature_collection = FeatureCollection([feature_1, feature_2])\n```\n\n#\n\n#### apply Topology and present output as `geodataframe` (if `geopandas` is installed)\n\n```python\ntj = topojson.Topology(feature_collection, prequantize=False, topology=True)\ntj.to_gdf()\n```\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
geometryidname
0POLYGON ((1 1, 1 0, 0 0, 0 1, 1 1))Noneabc
1POLYGON ((1 0, 1 1, 2 1, 2 0, 1 0))Nonedef
\n\n\n#\n\nCurrently parsing TopoJSON as string input requires `geopandas` (`fiona` version >=1.8.6) and parsing GeoJSON as string requires the package `geojson`.\n\nThe package `simplification` can be used if you want to adopt the Visvalingam-Whyatt algorithm for simplifying or for having a speedup on the Douglas-Peucker algorithm (compared to the `shapely`-integrated version).\n\nThe `.to_widget()` function depends on `ipywidgets` and can be a bit tricky to get it installed and properly working. But if you do, something like the following will show up:\n\n\"ipywidgets\"\n\nTo install, use the ipywidgets website for installation. \nInitially I ran very often in errors like the following after I thought I'd install everything correctly:\n\n```\n[IPKernelApp] WARNING | No such comm: xxxyyyzzz123etc.\n```\n\nTo solve this error I found out that I'd first had to pip uninstall JupyterLab, then install the lab extension of ipywidgets and then install JupyterLab again. Then when starting JupyterLab for the first time it asks to rebuild to include the ipywidgets lab extension. Click Yes or OK and wait till JupyterLab refresh, afterwards these errors did not appear for me anymore (both Windows and macOS). If you got all installed I suggest starting from `In [5]` in the following [notebook](https://nbviewer.jupyter.org/github/mattijn/topojson/blob/master/notebooks/ipywidgets_interaction.ipynb) to test if all works.\n\nFuther, the many [tests][l1] as part of this package also can be used as example material.\n\n[l1]: https://github.com/mattijn/topojson/tree/master/tests\n\n## Changelog\n\nVersion `1.0rc6`:\n\n- fix linemerging of non-duplicate arcs #50\n- include `__geo_interface__` attributed as input #53\n- include travis testing on GitHub (thanks @Casyfill!)\n- migrate from unittests to pytest (thanks @Casyfill!)\n\nVersion `1.0rc5`:\n\n- change `TopoOptions` in `to_dict` to be serializable #46\n- changed all `int` to `np.int64`, since it is platform specific #49, #45\n\nVersion `1.0rc4`:\n\n- no `linestring` key in topojson\n- serialize `str` of TopoJSON or GeoJSON data\n- add `vw` as algoritm type and update widget\n\nVersion `1.0rc3`:\n\n- changed class object to inherit sequence\n- removed the `topojson.topology` function\n- introducted the `topojson.Topology` class\n- speedups and bug fixes, see PR#15-#36\n- introduced multiple options see #8\n\nVersion `1.0rc2`:\n\n- apply linemerge on non-duplicate arcs\n- fix computing topology without shared boundaries ([#1][i1], [#3][i3])\n- use `geopandas` and `geojson` solely for tests, but recognize them as type ([#2][i2], [#4][i4])\n- use [`simplification`](https://github.com/urschrei/simplification) as option to simplify linestrings\n- include option to snap vertices to grid\n- removed `rdtree` as dependency, use `SRTtree` from `shapely` instead\n\nVersion `1.0rc1`:\n\n- initial release\n\n[i1]: https://github.com/mattijn/topojson/issues/1\n[i2]: https://github.com/mattijn/topojson/issues/2\n[i3]: https://github.com/mattijn/topojson/issues/3\n[i4]: https://github.com/mattijn/topojson/issues/4\n\n## Tests\n\nThere are many tests writen to make sure all type of corner-cases are covered. To make sure all tests will pass, you must have version >=0.5.0 of `geopandas` in combination with `fiona` version >=1.8.6.\nShapely version 1.7a2 is recommended (because of https://github.com/Toblerity/Shapely/pull/733), but all tests pass from version >=1.6.3.\n\n## Development Notes\n\nDevelopment of this packages started by reading:\n\n- https://bost.ocks.org/mike/topology/ and https://github.com/topojson by Mike Bostocks and\n- https://github.com/calvinmetcalf/topojson.py by Calvin Metcalf.\n\nThe reason for development of this package was the willingness:\n\n- To adopt `shapely` (GEOS) and `numpy` for the core-functionalities in deriving the Topology.\n- To provide integration with other geographical packages within the Python ecosystem (eg. `geopandas` and `altair`).\n- Also the possibility of including the many tests available in the JavaScript implementation was hoped-for.\n\nTo create a certain synergy between the JavaScript and Python implementation the same naming conventions was adopted for the processing steps (`extract`, `join`, `cut`, `dedup`, `hashmap`). Even though the actual code differs significant.\n\nSome subtile differences are existing between the JavaScript implementation and the current Python implementation for deriving the Topology. Some of these deviations are briefly mentioned here:\n\n1. The extraction class stores all the different geometrical objects as Shapely LineStrings in `linestrings` and keeps a record of these linestrings available under the key `bookkeeping_geoms`. In the JavaScript implementation there is a differentiation of the geometries between `lines`, `rings` and a seperate object containing all `coordinates`. Since the current approach adopts `shapely` for much of the heavy lifting this extraction is working against us (in the cut-process).\n\n2. In the join class only the geometries that have shared paths are considered to have junctions. This means that the intersection of two crossing lines at a single coordinate is not considered as a junction. This also means that the two ends of a LineString are not automatically considered as being a junction. So if a segment starts or finish on another segment, with that coordinate being the only coordinate in common, it is not considered as a junction.\n\n3. In the computation of a shared path, a junction can be created on an existing coordinate in one of the geometries. Where in the JavaScript implementation this only can be considered when both geometries contain the coordinate.\n\n4. In the process of cutting lines; the rings are rotated in the JavaScript implementation to make sure they start at a junction. This reduces the number of cuts. This rotation is done before cutting. In the current Python implementation this is done differently. First the linestrings are cut using the junction coordinates and afterwards there is tried to apply a linemerge on the non-duplicate arcs of a geometry containing at least one shared arc.\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/mattijn/topojson", "keywords": "topojson python github topology geojson", "license": "", "maintainer": "", "maintainer_email": "", "name": "topojson", "package_url": "https://pypi.org/project/topojson/", "platform": "", "project_url": "https://pypi.org/project/topojson/", "project_urls": { "Homepage": "https://github.com/mattijn/topojson" }, "release_url": "https://pypi.org/project/topojson/1.0rc6/", "requires_dist": [ "numpy", "shapely", "shapely >=1.7a2; extra == \"dev\"", "geojson; extra == \"dev\"", "simplification; extra == \"dev\"", "pyshp; extra == \"dev\"", "fiona >=1.8.6; extra == \"dev\"", "geopandas; extra == \"dev\"", "altair; extra == \"dev\"", "ipywidgets; extra == \"dev\"" ], "requires_python": "", "summary": "topojson - a powerful library to encode geographic data as topology in Python!\ud83c\udf0d", "version": "1.0rc6" }, "last_serial": 5772624, "releases": { "1.0rc1": [ { "comment_text": "", "digests": { "md5": "82e392751820155185ceb2bd55a32fcb", "sha256": "14507e07c3a55ba92afced31a534032a26f0dfe1a735d7fe2bb7abd0bcde7f52" }, "downloads": -1, "filename": "topojson-1.0rc1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "82e392751820155185ceb2bd55a32fcb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 51732, "upload_time": "2019-01-16T20:53:07", "url": "https://files.pythonhosted.org/packages/d7/ca/bcbf553264c3f73231b3fc00e2f3feb544bc0f7b940a62fa9f43162c0888/topojson-1.0rc1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "33ce0b6e9219c969ded8372135315d0b", "sha256": "bff2892f58a0d2114497d6f80b76a96298138a7356b0a86fff33e79d205315eb" }, "downloads": -1, "filename": "topojson-1.0rc1.tar.gz", "has_sig": false, "md5_digest": "33ce0b6e9219c969ded8372135315d0b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3385975, "upload_time": "2019-01-16T20:53:15", "url": "https://files.pythonhosted.org/packages/22/ea/e6a19dfe6a69c701e7e8363000cbf812b5695ae0f37dc302f0b6df09e77a/topojson-1.0rc1.tar.gz" } ], "1.0rc2": [ { "comment_text": "", "digests": { "md5": "f76c79c17d8f80686a1206ec581fc125", "sha256": "515ca476a5d89c32cde85552130c637080054b59eb95f3d0d9eea33984fa9681" }, "downloads": -1, "filename": "topojson-1.0rc2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f76c79c17d8f80686a1206ec581fc125", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 62087, "upload_time": "2019-03-24T17:34:44", "url": "https://files.pythonhosted.org/packages/2c/68/bb8eca89060527c8704b62204e130c009f2fe69dd0019bd7e6ec73349ae2/topojson-1.0rc2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "add607f0f7b4dc2884c89c08fbf7db88", "sha256": "2b774ebdaf164cc7b5474c114e3b82e047378401e316f3538a7095c9d40c5c00" }, "downloads": -1, "filename": "topojson-1.0rc2.tar.gz", "has_sig": false, "md5_digest": "add607f0f7b4dc2884c89c08fbf7db88", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3509719, "upload_time": "2019-03-24T17:34:52", "url": "https://files.pythonhosted.org/packages/2f/9f/a5bcc5bc6fbf68ef23a76bb3b327e01e6366ee36b88a429aaafefb636abf/topojson-1.0rc2.tar.gz" } ], "1.0rc3": [ { "comment_text": "", "digests": { "md5": "de1db7ff19e77f95d78d4867b854d63b", "sha256": "1cf64bc4bd15b5d6d331c561798cc82ab6632188ed04831a90c93d9e86be849c" }, "downloads": -1, "filename": "topojson-1.0rc3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "de1db7ff19e77f95d78d4867b854d63b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 98711, "upload_time": "2019-08-10T22:49:21", "url": "https://files.pythonhosted.org/packages/ab/7f/1f39e6b03108073cb27fe936662eeb79d2d974ad4dcf09da74617ae9f44b/topojson-1.0rc3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bac4f40873e52129fb1a29ad688dfed0", "sha256": "ded7f43a752df330d684c346c9f3baa7f36874ad4c74e8d338c62882743f5576" }, "downloads": -1, "filename": "topojson-1.0rc3.tar.gz", "has_sig": false, "md5_digest": "bac4f40873e52129fb1a29ad688dfed0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4213815, "upload_time": "2019-08-10T22:49:46", "url": "https://files.pythonhosted.org/packages/62/eb/c9ad62ba46f0385ff0990c483935c105b1db5dd81b7c795290deff0e4ba0/topojson-1.0rc3.tar.gz" } ], "1.0rc4": [ { "comment_text": "", "digests": { "md5": "d813b5ca6bd69c917490d6616440dd36", "sha256": "2c07da901515db4176aafbd82b5ece783eb9de482f7b6b3e3cdbe2fa2c86ff3b" }, "downloads": -1, "filename": "topojson-1.0rc4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d813b5ca6bd69c917490d6616440dd36", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 101384, "upload_time": "2019-08-11T20:02:53", "url": "https://files.pythonhosted.org/packages/ea/2f/36575294e5957e5dac06f14fd968450c3fb0b63320ca9f89c90fdbba47cc/topojson-1.0rc4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "35f4f685bd39830a3d5c176ca1485f66", "sha256": "c65a733140c5d01bbc7784f67a668acb5fd4b255b56efbf1a114df0d166343e4" }, "downloads": -1, "filename": "topojson-1.0rc4.tar.gz", "has_sig": false, "md5_digest": "35f4f685bd39830a3d5c176ca1485f66", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4269646, "upload_time": "2019-08-11T20:03:00", "url": "https://files.pythonhosted.org/packages/96/1d/60e1ab41b9acf6aff1f6cbc7992490ce027cffa1abd4fcd7afe4d6c497a8/topojson-1.0rc4.tar.gz" } ], "1.0rc5": [ { "comment_text": "", "digests": { "md5": "5d4e6262ba86996b1ddabcdf35433e6b", "sha256": "52f2e11484101ea18fa49ecde8be21e1a0315a7769b0d6161f8d76f07ad7847a" }, "downloads": -1, "filename": "topojson-1.0rc5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5d4e6262ba86996b1ddabcdf35433e6b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 103490, "upload_time": "2019-08-19T20:40:11", "url": "https://files.pythonhosted.org/packages/15/89/906fbe94ed44ee22df5f56298248c5a2f2d1b7ed2e5d86c12316c5cb3361/topojson-1.0rc5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "66da6ae54d507758188f7de8f85bf995", "sha256": "ad302c80d35abe126084ceb854c5e0bcdd3d25bb3e4d80797432ee48cce58fad" }, "downloads": -1, "filename": "topojson-1.0rc5.tar.gz", "has_sig": false, "md5_digest": "66da6ae54d507758188f7de8f85bf995", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4660593, "upload_time": "2019-08-19T20:40:20", "url": "https://files.pythonhosted.org/packages/e9/25/fe45fd339bb3895f841b743d88fc875b628438e3bafb906e0f93087dbc90/topojson-1.0rc5.tar.gz" } ], "1.0rc6": [ { "comment_text": "", "digests": { "md5": "4a3091a77aa43c484f0ed52fcd403b10", "sha256": "1dea708289c689d679686cff7d8e7f25f4b56b8d7ab417a669e995e090b945b3" }, "downloads": -1, "filename": "topojson-1.0rc6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4a3091a77aa43c484f0ed52fcd403b10", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 104479, "upload_time": "2019-09-02T20:47:21", "url": "https://files.pythonhosted.org/packages/7e/03/b1e7b45cf5068344fe82e354bc30906eb448fbfc2074d34ba2fd186f88a0/topojson-1.0rc6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2db5602f7183a9ff9a8dccb385ff31dd", "sha256": "d4af3424b0aac1c0a33adf157b5dbc9dc49175939c76e68a5d03d1b423a009d2" }, "downloads": -1, "filename": "topojson-1.0rc6.tar.gz", "has_sig": false, "md5_digest": "2db5602f7183a9ff9a8dccb385ff31dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4674073, "upload_time": "2019-09-02T20:47:29", "url": "https://files.pythonhosted.org/packages/bb/53/41edb848c1a1947be01b45c026d3a323cb1537b82243d16e7a02b710cc47/topojson-1.0rc6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4a3091a77aa43c484f0ed52fcd403b10", "sha256": "1dea708289c689d679686cff7d8e7f25f4b56b8d7ab417a669e995e090b945b3" }, "downloads": -1, "filename": "topojson-1.0rc6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4a3091a77aa43c484f0ed52fcd403b10", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 104479, "upload_time": "2019-09-02T20:47:21", "url": "https://files.pythonhosted.org/packages/7e/03/b1e7b45cf5068344fe82e354bc30906eb448fbfc2074d34ba2fd186f88a0/topojson-1.0rc6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2db5602f7183a9ff9a8dccb385ff31dd", "sha256": "d4af3424b0aac1c0a33adf157b5dbc9dc49175939c76e68a5d03d1b423a009d2" }, "downloads": -1, "filename": "topojson-1.0rc6.tar.gz", "has_sig": false, "md5_digest": "2db5602f7183a9ff9a8dccb385ff31dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4674073, "upload_time": "2019-09-02T20:47:29", "url": "https://files.pythonhosted.org/packages/bb/53/41edb848c1a1947be01b45c026d3a323cb1537b82243d16e7a02b710cc47/topojson-1.0rc6.tar.gz" } ] }