geoapify


Namegeoapify JSON
Version 0.1.2 PyPI version JSON
download
home_pagehttps://github.com/kinsvater/geoapify
SummaryPython client for geopify.com REST API.
upload_time2022-09-23 06:47:42
maintainer
docs_urlNone
authorPaul Kinsvater
requires_python>=3.7,<4.0
licenseMIT
keywords geoapify geocoding
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Python client for the Geoapify API data services

This client is in an early stage. We just started and we will contribute several new features, many more geoapify
endpoints, and else in the near future.

## How to install

Install the latest release from public PyPI by

```shell
pip install geoapify
```

or directly from the current master branch if you need to try any features not yet published:

```shell
pip install git+https://github.com/kinsvater/geoapify.git
```

## Examples

### Batch geocoding example

Below we geocode multiple addresses in a single batch. There are two ways how we can provide the location data as input.
Either we use a list of strings, one string per address. These are then taken as free text searches. Or we provide a
structured input by specifying attributes of every address in a dictionary. See the
[Geoapify API documentation](https://apidocs.geoapify.com/) for a complete list of address attributes accepted by the
geocoding services. In both ways, we can also provide structured attributes as optional `parameters`. E.g., below we
asked for results in French.

```python
from geoapify import Client

client = Client(api_key='<your-api-key>', parameters={'lang': 'fr'})  # see the geoapify.com API docs for more options

addresses = ['Hülser Markt 1, 47839 Krefeld',
             'DB Schenker, Essen, Germany',
             'JCI Beteiligungs GmbH, Am Schimmersfeld 5, Ratingen']

res = client.batch.geocode(locations=addresses, simplify_output=True)
```

Alternatively you can provide a list of dictionaries, with every address in a structured form. And if you still need
the free text search for some, you can do this with the `'text'` attribute. Here is the same example, with the first
two address translated to structured form:

```python
addresses = [{'city': 'Krefeld', 'street': 'Hülser Markt', 'housenumber': 1, 'postcode': '47839'},
             {'name': 'DB Schenker', 'city': 'Essen', 'country': 'Germany'},
             {'text': 'JCI Beteiligungs GmbH, Am Schimmersfeld 5, Ratingen'}]
```

```python
# Showing the first of three result sets: res[0]
{
    "query": {
        "text": "Hülser Markt 1, 47839 Krefeld",
        "parsed": {
            "housenumber": "1",
            "street": "hülser markt",
            "postcode": "47839",
            "city": "krefeld",
            "expected_type": "building",
        },
    },
    "datasource": {
        "sourcename": "openstreetmap",
        "attribution": "© OpenStreetMap contributors",
        "license": "Open Database License",
        "url": "https://www.openstreetmap.org/copyright",
    },
    "name": "Metzgerei Etteldorf",
    "housenumber": "1",
    "street": "Hülser Markt",
    "suburb": "Hüls",
    "city": "Krefeld",
    "state": "Rhénanie-du-Nord-Westphalie",
    "postcode": "47839",
    "country": "Allemagne",
    "country_code": "de",
    "lon": 6.510696417033254,
    "lat": 51.373026800000005,
    "formatted": "Metzgerei Etteldorf, Hülser Markt 1, 47839 Krefeld, Allemagne",
    "address_line1": "Metzgerei Etteldorf",
    "address_line2": "Hülser Markt 1, 47839 Krefeld, Allemagne",
    "category": "commercial.food_and_drink.butcher",
    "result_type": "amenity",
    "rank": {
        "importance": 0.31100000000000005,
        "popularity": 5.585340759145855,
        "confidence": 1,
        "confidence_city_level": 1,
        "confidence_street_level": 1,
        "match_type": "inner_part",
    },
    "place_id": "516b5e6500f40a1a40590a449957bfaf4940f00102f9010ecff70d00000000c002019203134d65747a676572656920457474656c646f7266",
}
```

### Use the `geoapify` CLI for large jobs

This packages comes with the `geoapify` command line interface. It is useful for executing batch jobs as a daemon or
with little overhead in a terminal.

Before we start, we need to first create a JSON file to store all the inputs. See the
`geoapify.batch.parse_*` functions to bring your inputs into the right format and check the docstrings of
the CLI:

```shell
geoapify post-batch-jobs --help
```

See the following example how to generate a JSON input file for the batch geocoding service using Python:

```python
from geoapify.batch import parse_geocoding_inputs, write_data_to_json_file

addresses = ['Hülser Markt 1, 47839 Krefeld',
             'DB Schenker, Essen, Germany',
             'JCI Beteiligungs GmbH, Am Schimmersfeld 5, Ratingen']

data = {
    'api': '/v1/geocode/search',  # see the Geoapify API docs for other APIs that work with batch processing
    'inputs': parse_geocoding_inputs(locations=addresses),
    'batch_len': 2,  # optional - will put first two addresses in batch 1, last address in batch 2
    'id': 'my-batch-geocoding-job'  # optional - a reference which will be reused in the output file
}

write_data_to_json_file(data=data, file_path='<path-data-in>')  # use as input for post-batch-jobs
```

Assuming, we have created such data for input, we can post batch processing jobs by

```shell
geoapify post-batch-jobs <path-data-in> <path-post-data-out> --api-key <your-key>
```

You can omit the `--api-key` option if you set your `GEOAPIFY_KEY` environment variable. 

The `post-batch-jobs` should finish rather quickly. Next we can start monitoring progress now or anytime later:

```shell
geoapify monitor-batch-jobs <path-post-data-out> <path-results-data-out> --api-key <your-key>
```

This will monitor the progress of all batch jobs and store results to disk when they all finish. You can abort
this step any time and restart later - provided the jobs still are in cache of the Geoapify servers.

### Place Details example

There is also a batch version of the Place Details API. Below we use the single location version and choose
two different kinds of features in our request. There are many more kinds of features - see the Geoapify docs. But
note that not every location is covered by every kind of feature.

```python
from geoapify import Client

client = Client(api_key='<your-api-key>')

res = client.place_details(latitude=50.8512746, longitude=4.3649087,  # or use place_id (also in geocoding results)
                           features=['details', 'building'])  # defaults to just the 'details' if not specified
res['features']
```

```python
[
    {
        "type": "Feature",
        "properties": {
            "feature_type": "details",
            "name": "Kruppstraße",
            "restrictions": {"max_speed": 30},
            "categories": ["highway", "highway.residential"],
            "datasource": {
                "sourcename": "openstreetmap",
                "attribution": "© OpenStreetMap contributors",
                "license": "Open Database Licence",
                "url": "https://www.openstreetmap.org/copyright",
                "raw": {
                    "lit": "yes",
                    "name": "Kruppstraße",
                    "oneway": "yes",
                    "osm_id": 256731283,
                    "highway": "residential",
                    "surface": "asphalt",
                    "z_order": 330,
                    "maxspeed": 30,
                    "osm_type": "w",
                    "sidewalk": "right",
                    "postal_code": 45128,
                    "lane_markings": "no",
                    "sidewalk:right:surface": "paving_stones",
                },
            },
            "street": "Kruppstraße",
            "city": "Essen",
            "state": "North Rhine-Westphalia",
            "postcode": "45128",
            "country": "Germany",
            "country_code": "de",
            "formatted": "Kruppstraße, 45128 Essen, Germany",
            "address_line1": "Kruppstraße",
            "address_line2": "45128 Essen, Germany",
            "lat": 51.4500523,
            "lon": 7.0093601,
            "place_id": "515b17c8fd580a1c40594bde458c9eb94940f00102f90193684d0f0000000092030c4b7275707073747261c39f65",
        },
        "geometry": {
            "type": "LineString",
            "coordinates": [[7.0108501, 51.450249699], [7.0093601, 51.450052299]],
        },
    },
    {
        "type": "Feature",
        "properties": {
            "feature_type": "building",
            "categories": ["building", "building.office", "office", "office.company"],
            "datasource": {
                "sourcename": "openstreetmap",
                "attribution": "© OpenStreetMap contributors",
                "license": "Open Database Licence",
                "url": "https://www.openstreetmap.org/copyright",
                "raw": {
                    "name": "DB Schenker",
                    "office": "company",
                    "osm_id": -7407547,
                    "building": "office",
                    "osm_type": "r",
                    "wikidata": "Q474287",
                    "addr:city": "Essen",
                    "wikipedia": "de:Schenker AG",
                    "roof:shape": "flat",
                    "addr:street": "Kruppstraße",
                    "roof:colour": "black",
                    "addr:country": "DE",
                    "addr:postcode": 45128,
                    "roof:material": "tar_paper",
                    "building:colour": "black",
                    "building:levels": 6,
                    "addr:housenumber": 4,
                    "building:material": "metal",
                },
            },
            "housenumber": "4",
            "street": "Kruppstraße",
            "city": "Essen",
            "state": "North Rhine-Westphalia",
            "postcode": "45128",
            "country": "Germany",
            "country_code": "de",
            "formatted": "DB Schenker, Kruppstraße 4, 45128 Essen, Germany",
            "address_line1": "DB Schenker",
            "address_line2": "Kruppstraße 4, 45128 Essen, Germany",
            "lat": 51.4503917,
            "lon": 7.010418352964237,
            "name": "DB Schenker",
            "wiki_and_media": {"wikidata": "Q474287", "wikipedia": "de:Schenker AG"},
            "building": {
                "levels": 6,
                "type": "office",
                "material": "metal",
                "color": "black",
                "roof": {"shape": "flat", "color": "black"},
            },
            "area": 2622,
            "place_id": "51b6ee06a1420a1c40591c45b8dea6b94940f00101f901bb0771000000000092030b444220536368656e6b6572",
        },
        "geometry": {
            "type": "Polygon",
            "coordinates": [
                [
                    [7.0093446, 51.450494299],
                    [7.0093605, 51.450446299],
                    [7.0093658, 51.450437399],
                    # many more coordinates
                    [7.0093446, 51.450494299],
                ],
                [
                    [7.0098872, 51.450365899],
                    [7.0098989, 51.450384999],
                    [7.0099838, 51.450464199],
                    # many more coordinates
                    [7.0098872, 51.450365899],
                ],
            ],
        },
    },
]
```

## References and further reading

- [geoapify.com API documentation](https://apidocs.geoapify.com/)
- [Towards Data Science - Deduplicate and clean-up millions of location records](https://towardsdatascience.com/deduplicate-and-clean-up-millions-of-location-records-abcffb308ebf)

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/kinsvater/geoapify",
    "name": "geoapify",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7,<4.0",
    "maintainer_email": "",
    "keywords": "geoapify,geocoding",
    "author": "Paul Kinsvater",
    "author_email": "paul.kinsvater@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/18/45/48ecbd664a80ba1e822eaa2fb4e96c90b48d163d377e9e187c79b9cad46a/geoapify-0.1.2.tar.gz",
    "platform": null,
    "description": "# Python client for the Geoapify API data services\n\nThis client is in an early stage. We just started and we will contribute several new features, many more geoapify\nendpoints, and else in the near future.\n\n## How to install\n\nInstall the latest release from public PyPI by\n\n```shell\npip install geoapify\n```\n\nor directly from the current master branch if you need to try any features not yet published:\n\n```shell\npip install git+https://github.com/kinsvater/geoapify.git\n```\n\n## Examples\n\n### Batch geocoding example\n\nBelow we geocode multiple addresses in a single batch. There are two ways how we can provide the location data as input.\nEither we use a list of strings, one string per address. These are then taken as free text searches. Or we provide a\nstructured input by specifying attributes of every address in a dictionary. See the\n[Geoapify API documentation](https://apidocs.geoapify.com/) for a complete list of address attributes accepted by the\ngeocoding services. In both ways, we can also provide structured attributes as optional `parameters`. E.g., below we\nasked for results in French.\n\n```python\nfrom geoapify import Client\n\nclient = Client(api_key='<your-api-key>', parameters={'lang': 'fr'})  # see the geoapify.com API docs for more options\n\naddresses = ['H\u00fclser Markt 1, 47839 Krefeld',\n             'DB Schenker, Essen, Germany',\n             'JCI Beteiligungs GmbH, Am Schimmersfeld 5, Ratingen']\n\nres = client.batch.geocode(locations=addresses, simplify_output=True)\n```\n\nAlternatively you can provide a list of dictionaries, with every address in a structured form. And if you still need\nthe free text search for some, you can do this with the `'text'` attribute. Here is the same example, with the first\ntwo address translated to structured form:\n\n```python\naddresses = [{'city': 'Krefeld', 'street': 'H\u00fclser Markt', 'housenumber': 1, 'postcode': '47839'},\n             {'name': 'DB Schenker', 'city': 'Essen', 'country': 'Germany'},\n             {'text': 'JCI Beteiligungs GmbH, Am Schimmersfeld 5, Ratingen'}]\n```\n\n```python\n# Showing the first of three result sets: res[0]\n{\n    \"query\": {\n        \"text\": \"H\u00fclser Markt 1, 47839 Krefeld\",\n        \"parsed\": {\n            \"housenumber\": \"1\",\n            \"street\": \"h\u00fclser markt\",\n            \"postcode\": \"47839\",\n            \"city\": \"krefeld\",\n            \"expected_type\": \"building\",\n        },\n    },\n    \"datasource\": {\n        \"sourcename\": \"openstreetmap\",\n        \"attribution\": \"\u00a9 OpenStreetMap contributors\",\n        \"license\": \"Open Database License\",\n        \"url\": \"https://www.openstreetmap.org/copyright\",\n    },\n    \"name\": \"Metzgerei Etteldorf\",\n    \"housenumber\": \"1\",\n    \"street\": \"H\u00fclser Markt\",\n    \"suburb\": \"H\u00fcls\",\n    \"city\": \"Krefeld\",\n    \"state\": \"Rh\u00e9nanie-du-Nord-Westphalie\",\n    \"postcode\": \"47839\",\n    \"country\": \"Allemagne\",\n    \"country_code\": \"de\",\n    \"lon\": 6.510696417033254,\n    \"lat\": 51.373026800000005,\n    \"formatted\": \"Metzgerei Etteldorf, H\u00fclser Markt 1, 47839 Krefeld, Allemagne\",\n    \"address_line1\": \"Metzgerei Etteldorf\",\n    \"address_line2\": \"H\u00fclser Markt 1, 47839 Krefeld, Allemagne\",\n    \"category\": \"commercial.food_and_drink.butcher\",\n    \"result_type\": \"amenity\",\n    \"rank\": {\n        \"importance\": 0.31100000000000005,\n        \"popularity\": 5.585340759145855,\n        \"confidence\": 1,\n        \"confidence_city_level\": 1,\n        \"confidence_street_level\": 1,\n        \"match_type\": \"inner_part\",\n    },\n    \"place_id\": \"516b5e6500f40a1a40590a449957bfaf4940f00102f9010ecff70d00000000c002019203134d65747a676572656920457474656c646f7266\",\n}\n```\n\n### Use the `geoapify` CLI for large jobs\n\nThis packages comes with the `geoapify` command line interface. It is useful for executing batch jobs as a daemon or\nwith little overhead in a terminal.\n\nBefore we start, we need to first create a JSON file to store all the inputs. See the\n`geoapify.batch.parse_*` functions to bring your inputs into the right format and check the docstrings of\nthe CLI:\n\n```shell\ngeoapify post-batch-jobs --help\n```\n\nSee the following example how to generate a JSON input file for the batch geocoding service using Python:\n\n```python\nfrom geoapify.batch import parse_geocoding_inputs, write_data_to_json_file\n\naddresses = ['H\u00fclser Markt 1, 47839 Krefeld',\n             'DB Schenker, Essen, Germany',\n             'JCI Beteiligungs GmbH, Am Schimmersfeld 5, Ratingen']\n\ndata = {\n    'api': '/v1/geocode/search',  # see the Geoapify API docs for other APIs that work with batch processing\n    'inputs': parse_geocoding_inputs(locations=addresses),\n    'batch_len': 2,  # optional - will put first two addresses in batch 1, last address in batch 2\n    'id': 'my-batch-geocoding-job'  # optional - a reference which will be reused in the output file\n}\n\nwrite_data_to_json_file(data=data, file_path='<path-data-in>')  # use as input for post-batch-jobs\n```\n\nAssuming, we have created such data for input, we can post batch processing jobs by\n\n```shell\ngeoapify post-batch-jobs <path-data-in> <path-post-data-out> --api-key <your-key>\n```\n\nYou can omit the `--api-key` option if you set your `GEOAPIFY_KEY` environment variable. \n\nThe `post-batch-jobs` should finish rather quickly. Next we can start monitoring progress now or anytime later:\n\n```shell\ngeoapify monitor-batch-jobs <path-post-data-out> <path-results-data-out> --api-key <your-key>\n```\n\nThis will monitor the progress of all batch jobs and store results to disk when they all finish. You can abort\nthis step any time and restart later - provided the jobs still are in cache of the Geoapify servers.\n\n### Place Details example\n\nThere is also a batch version of the Place Details API. Below we use the single location version and choose\ntwo different kinds of features in our request. There are many more kinds of features - see the Geoapify docs. But\nnote that not every location is covered by every kind of feature.\n\n```python\nfrom geoapify import Client\n\nclient = Client(api_key='<your-api-key>')\n\nres = client.place_details(latitude=50.8512746, longitude=4.3649087,  # or use place_id (also in geocoding results)\n                           features=['details', 'building'])  # defaults to just the 'details' if not specified\nres['features']\n```\n\n```python\n[\n    {\n        \"type\": \"Feature\",\n        \"properties\": {\n            \"feature_type\": \"details\",\n            \"name\": \"Kruppstra\u00dfe\",\n            \"restrictions\": {\"max_speed\": 30},\n            \"categories\": [\"highway\", \"highway.residential\"],\n            \"datasource\": {\n                \"sourcename\": \"openstreetmap\",\n                \"attribution\": \"\u00a9 OpenStreetMap contributors\",\n                \"license\": \"Open Database Licence\",\n                \"url\": \"https://www.openstreetmap.org/copyright\",\n                \"raw\": {\n                    \"lit\": \"yes\",\n                    \"name\": \"Kruppstra\u00dfe\",\n                    \"oneway\": \"yes\",\n                    \"osm_id\": 256731283,\n                    \"highway\": \"residential\",\n                    \"surface\": \"asphalt\",\n                    \"z_order\": 330,\n                    \"maxspeed\": 30,\n                    \"osm_type\": \"w\",\n                    \"sidewalk\": \"right\",\n                    \"postal_code\": 45128,\n                    \"lane_markings\": \"no\",\n                    \"sidewalk:right:surface\": \"paving_stones\",\n                },\n            },\n            \"street\": \"Kruppstra\u00dfe\",\n            \"city\": \"Essen\",\n            \"state\": \"North Rhine-Westphalia\",\n            \"postcode\": \"45128\",\n            \"country\": \"Germany\",\n            \"country_code\": \"de\",\n            \"formatted\": \"Kruppstra\u00dfe, 45128 Essen, Germany\",\n            \"address_line1\": \"Kruppstra\u00dfe\",\n            \"address_line2\": \"45128 Essen, Germany\",\n            \"lat\": 51.4500523,\n            \"lon\": 7.0093601,\n            \"place_id\": \"515b17c8fd580a1c40594bde458c9eb94940f00102f90193684d0f0000000092030c4b7275707073747261c39f65\",\n        },\n        \"geometry\": {\n            \"type\": \"LineString\",\n            \"coordinates\": [[7.0108501, 51.450249699], [7.0093601, 51.450052299]],\n        },\n    },\n    {\n        \"type\": \"Feature\",\n        \"properties\": {\n            \"feature_type\": \"building\",\n            \"categories\": [\"building\", \"building.office\", \"office\", \"office.company\"],\n            \"datasource\": {\n                \"sourcename\": \"openstreetmap\",\n                \"attribution\": \"\u00a9 OpenStreetMap contributors\",\n                \"license\": \"Open Database Licence\",\n                \"url\": \"https://www.openstreetmap.org/copyright\",\n                \"raw\": {\n                    \"name\": \"DB Schenker\",\n                    \"office\": \"company\",\n                    \"osm_id\": -7407547,\n                    \"building\": \"office\",\n                    \"osm_type\": \"r\",\n                    \"wikidata\": \"Q474287\",\n                    \"addr:city\": \"Essen\",\n                    \"wikipedia\": \"de:Schenker AG\",\n                    \"roof:shape\": \"flat\",\n                    \"addr:street\": \"Kruppstra\u00dfe\",\n                    \"roof:colour\": \"black\",\n                    \"addr:country\": \"DE\",\n                    \"addr:postcode\": 45128,\n                    \"roof:material\": \"tar_paper\",\n                    \"building:colour\": \"black\",\n                    \"building:levels\": 6,\n                    \"addr:housenumber\": 4,\n                    \"building:material\": \"metal\",\n                },\n            },\n            \"housenumber\": \"4\",\n            \"street\": \"Kruppstra\u00dfe\",\n            \"city\": \"Essen\",\n            \"state\": \"North Rhine-Westphalia\",\n            \"postcode\": \"45128\",\n            \"country\": \"Germany\",\n            \"country_code\": \"de\",\n            \"formatted\": \"DB Schenker, Kruppstra\u00dfe 4, 45128 Essen, Germany\",\n            \"address_line1\": \"DB Schenker\",\n            \"address_line2\": \"Kruppstra\u00dfe 4, 45128 Essen, Germany\",\n            \"lat\": 51.4503917,\n            \"lon\": 7.010418352964237,\n            \"name\": \"DB Schenker\",\n            \"wiki_and_media\": {\"wikidata\": \"Q474287\", \"wikipedia\": \"de:Schenker AG\"},\n            \"building\": {\n                \"levels\": 6,\n                \"type\": \"office\",\n                \"material\": \"metal\",\n                \"color\": \"black\",\n                \"roof\": {\"shape\": \"flat\", \"color\": \"black\"},\n            },\n            \"area\": 2622,\n            \"place_id\": \"51b6ee06a1420a1c40591c45b8dea6b94940f00101f901bb0771000000000092030b444220536368656e6b6572\",\n        },\n        \"geometry\": {\n            \"type\": \"Polygon\",\n            \"coordinates\": [\n                [\n                    [7.0093446, 51.450494299],\n                    [7.0093605, 51.450446299],\n                    [7.0093658, 51.450437399],\n                    # many more coordinates\n                    [7.0093446, 51.450494299],\n                ],\n                [\n                    [7.0098872, 51.450365899],\n                    [7.0098989, 51.450384999],\n                    [7.0099838, 51.450464199],\n                    # many more coordinates\n                    [7.0098872, 51.450365899],\n                ],\n            ],\n        },\n    },\n]\n```\n\n## References and further reading\n\n- [geoapify.com API documentation](https://apidocs.geoapify.com/)\n- [Towards Data Science - Deduplicate and clean-up millions of location records](https://towardsdatascience.com/deduplicate-and-clean-up-millions-of-location-records-abcffb308ebf)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python client for geopify.com REST API.",
    "version": "0.1.2",
    "split_keywords": [
        "geoapify",
        "geocoding"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "md5": "5786ead3ab9a872d115aee755ae0b9a5",
                "sha256": "c484b59597d090cf7c238655782cbd76af5e5815af5e1736c5e4aa0026b48cd0"
            },
            "downloads": -1,
            "filename": "geoapify-0.1.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "5786ead3ab9a872d115aee755ae0b9a5",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7,<4.0",
            "size": 13884,
            "upload_time": "2022-09-23T06:47:40",
            "upload_time_iso_8601": "2022-09-23T06:47:40.145698Z",
            "url": "https://files.pythonhosted.org/packages/3d/77/63588ed5feeada02514bb03d2ef6d2f6ab37c8adefde0ad1c5086d18dc9f/geoapify-0.1.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "fc529d41a968190841006728c853fa0d",
                "sha256": "d61138e532274ff98dd36c4c00da02a6cdbfede88181bc37fe66308379607b9e"
            },
            "downloads": -1,
            "filename": "geoapify-0.1.2.tar.gz",
            "has_sig": false,
            "md5_digest": "fc529d41a968190841006728c853fa0d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7,<4.0",
            "size": 15399,
            "upload_time": "2022-09-23T06:47:42",
            "upload_time_iso_8601": "2022-09-23T06:47:42.983639Z",
            "url": "https://files.pythonhosted.org/packages/18/45/48ecbd664a80ba1e822eaa2fb4e96c90b48d163d377e9e187c79b9cad46a/geoapify-0.1.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2022-09-23 06:47:42",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "kinsvater",
    "github_project": "geoapify",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "geoapify"
}
        
Elapsed time: 0.41693s