{"id":15021741,"url":"https://github.com/rentberry/geocoder","last_synced_at":"2025-04-10T19:43:50.287Z","repository":{"id":54671041,"uuid":"269373218","full_name":"Rentberry/geocoder","owner":"Rentberry","description":null,"archived":false,"fork":false,"pushed_at":"2023-03-06T23:16:13.000Z","size":7146,"stargazers_count":6,"open_issues_count":2,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-24T17:21:35.662Z","etag":null,"topics":["geocoding","go","golang","google-geocode-api","grpc","hacktoberfest","opencage"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Rentberry.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-04T13:53:32.000Z","updated_at":"2021-03-16T12:39:46.000Z","dependencies_parsed_at":"2024-06-19T06:12:14.622Z","dependency_job_id":"16f40cac-cf1a-4b0f-a0df-68044f35c1b1","html_url":"https://github.com/Rentberry/geocoder","commit_stats":{"total_commits":22,"total_committers":3,"mean_commits":7.333333333333333,"dds":"0.18181818181818177","last_synced_commit":"a07846c8476cd4700b4aaec478e34674ef595631"},"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rentberry%2Fgeocoder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rentberry%2Fgeocoder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rentberry%2Fgeocoder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rentberry%2Fgeocoder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Rentberry","download_url":"https://codeload.github.com/Rentberry/geocoder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248281424,"owners_count":21077423,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["geocoding","go","golang","google-geocode-api","grpc","hacktoberfest","opencage"],"created_at":"2024-09-24T19:56:58.387Z","updated_at":"2025-04-10T19:43:50.262Z","avatar_url":"https://github.com/Rentberry.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gRPC based geocoding service\nAdapter for external geocoding services with caching, monitoring, metrics etc. Has built-in support for timezone queries (resolve coordinates to timezone) implemented using [amazing Brad Fitzpatrick's library](https://github.com/bradfitz/latlong). \nSupports [Google's Geocoding API](https://developers.google.com/maps/documentation/geocoding/start) and [Opencage](https://opencagedata.com) for now.\n\n# Usage\n## Docker image\n```\ndocker run \\\n    -p 8080:8080 -p 9092:9092 \\\n    -e REDIS_HOST=redis \\\n    -e GOOGLE_API_KEY_SERVER=\u003cyour-google-key\u003e \\\n    -e OPENCAGE_API_KEY=\u003cyour-opencage-key\u003e \\\n    rentberry:geocoder\n```\nThis will start geocoding service that listens for grpc connections \non port `8080` and exposes prometheus metrics on `/metrics` on port `9092`\n\n## gRPC methods\n### Geocoding\nForward and reverse geocoding\n```GeocodeService.Geocode (LocationRequest) returns (LocationResponse)```\n#### Example\nRequest:\n```json5\n// Forward\n{\n  \"address\": \"berlin\", \n  \"provider\": \"opencage\", \n  \"query\": {\n    \"country\": \"de\", \n    \"language\": \"en\"\n  }\n}\n\n// Reverse\n{\n  \"latLng\": {\"lat\":52.51006317138672, \"lng\":13.40505599975586}, \n  \"provider\": \"opencage\",\n  \"query\": {\n    \"language\": \"en\"\n  }\n}\n```\nResponse:\n```json5\n{\n  \"locations\": [\n    {\n      \"provider\": \"opencage\",\n      \"formattedAddress\": \"Best Western Hotel am Spittelmarkt, Neue Grünstraße 28, 10179 Berlin, Germany\",\n      \"country\": {\n        \"name\": \"Germany\",\n        \"code\": \"DE\"\n      },\n      \"streetNumber\": \"28\",\n      \"streetName\": \"Neue Grünstraße\",\n      \"locality\": \"Berlin\",\n      \"sublocality\": \"Spandauer Vorstadt\",\n      \"postalCode\": \"10179\",\n      \"latLng\": {\n        \"lat\": 52.51006317138672,\n        \"lng\": 13.40505599975586\n      },\n      \"adminLevels\": [\n        {\n          \"level\": 1,\n          \"name\": \"Berlin\",\n          \"code\": \"BE\"\n        }\n      ],\n      \"state\": {\n        \"name\": \"Berlin\",\n        \"code\": \"BE\"\n      },\n      \"bounds\": {\n        \"northEast\": {\n          \"lat\": 52.510196685791016,\n          \"lng\": 13.405620574951172\n        },\n        \"southWest\": {\n          \"lat\": 52.50993347167969,\n          \"lng\": 13.40455150604248\n        }\n      }\n    },\n    {\n      \"provider\": \"opencage\",\n      \"formattedAddress\": \"Neue Grünstraße 28, 10179 Berlin, Germany\",\n      \"country\": {\n        \"name\": \"Germany\",\n        \"code\": \"DE\"\n      },\n      \"streetNumber\": \"28\",\n      \"streetName\": \"Neue Grünstraße\",\n      \"locality\": \"Berlin\",\n      \"sublocality\": \"Spandauer Vorstadt\",\n      \"postalCode\": \"10179\",\n      \"latLng\": {\n        \"lat\": 52.5099983215332,\n        \"lng\": 13.40558910369873\n      },\n      \"adminLevels\": [\n        {\n          \"level\": 1,\n          \"name\": \"Berlin\",\n          \"code\": \"BE\"\n        }\n      ],\n      \"state\": {\n        \"name\": \"Berlin\",\n        \"code\": \"BE\"\n      },\n      \"bounds\": {\n        \"northEast\": {\n          \"lat\": 52.510047912597656,\n          \"lng\": 13.405638694763184\n        },\n        \"southWest\": {\n          \"lat\": 52.50994873046875,\n          \"lng\": 13.405538558959961\n        }\n      }\n    },\n    {\n      \"provider\": \"opencage\",\n      \"formattedAddress\": \"10179, Germany\",\n      \"country\": {\n        \"name\": \"Germany\",\n        \"code\": \"DE\"\n      },\n      \"postalCode\": \"10179\",\n      \"latLng\": {\n        \"lat\": 52.51359939575195,\n        \"lng\": 13.423199653625488\n      },\n      \"state\": {\n\n      },\n      \"bounds\": {\n        \"northEast\": {\n\n        },\n        \"southWest\": {\n\n        }\n      }\n    }\n  ],\n  \"exists\": true\n}\n\n// Response trailers received:\n// cache-key: b6d1655e0fc8945a33b050c4dfdb43b2cb0ecf58\n```\n\n### Timezone lookup\nFind location's timezone by provided coordinates\n````TimezoneService.Lookup (TimezoneRequest) returns (Timezone)````\n#### Example\nRequest:\n```shell script\n grpcurl -plaintext -import-path ./api -proto geocoder.proto -v -d '{\"latLng\":{\"lat\":52.51006317138672, \"lng\":13.40505599975586}}' 127.0.0.1:8080 geocoder.TimezoneService/Lookup\n```\n```json5\n{\"latlng\": {\"lat\":52.51006317138672, \"lng\":13.40505599975586}}\n```\nResponse:\n```json5\n{\n  \"code\": \"Europe/Berlin\"\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frentberry%2Fgeocoder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frentberry%2Fgeocoder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frentberry%2Fgeocoder/lists"}