{"id":13565748,"url":"https://github.com/tomayac/local-reverse-geocoder","last_synced_at":"2025-10-10T02:07:27.818Z","repository":{"id":23151538,"uuid":"26506945","full_name":"tomayac/local-reverse-geocoder","owner":"tomayac","description":"Local reverse geocoder for Node.js based on GeoNames data","archived":false,"fork":false,"pushed_at":"2024-01-16T22:20:58.000Z","size":673,"stargazers_count":206,"open_issues_count":2,"forks_count":60,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-09-06T18:37:51.258Z","etag":null,"topics":["geocoder","geocoding","geonames","geonames-data"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tomayac.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":["tomayac"]}},"created_at":"2014-11-11T22:03:18.000Z","updated_at":"2025-07-30T13:53:27.000Z","dependencies_parsed_at":"2024-01-08T18:02:32.491Z","dependency_job_id":"7a936c7a-0413-4be0-a4e0-7bfc4e63fe1b","html_url":"https://github.com/tomayac/local-reverse-geocoder","commit_stats":{"total_commits":150,"total_committers":20,"mean_commits":7.5,"dds":0.5933333333333333,"last_synced_commit":"184c1911735839ebbdd0f62a16a591cb1ae206d9"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/tomayac/local-reverse-geocoder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomayac%2Flocal-reverse-geocoder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomayac%2Flocal-reverse-geocoder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomayac%2Flocal-reverse-geocoder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomayac%2Flocal-reverse-geocoder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tomayac","download_url":"https://codeload.github.com/tomayac/local-reverse-geocoder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomayac%2Flocal-reverse-geocoder/sbom","scorecard":{"id":892206,"data":{"date":"2025-08-11","repo":{"name":"github.com/tomayac/local-reverse-geocoder","commit":"857d102f67d5eb5777eecde9056fedc7de8f0603"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.5,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":2,"reason":"Found 6/23 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":9,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/docker.yml:19","Warn: no topLevel permission defined: .github/workflows/docker.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docker.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/tomayac/local-reverse-geocoder/docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/tomayac/local-reverse-geocoder/docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/tomayac/local-reverse-geocoder/docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/tomayac/local-reverse-geocoder/docker.yml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating node:current-alpine to node:current-alpine@sha256:51dbfc749ec3018c7d4bf8b9ee65299ff9a908e38918ce163b0acfcd5dd931d9","Warn: npmCommand not pinned by hash: Dockerfile:6","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   1 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 14 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"10 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-6jrj-vc65-c983"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-24T12:17:11.684Z","repository_id":23151538,"created_at":"2025-08-24T12:17:11.684Z","updated_at":"2025-08-24T12:17:11.684Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279002528,"owners_count":26083399,"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","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["geocoder","geocoding","geonames","geonames-data"],"created_at":"2024-08-01T13:01:54.587Z","updated_at":"2025-10-10T02:07:27.803Z","avatar_url":"https://github.com/tomayac.png","language":"JavaScript","readme":"# Local Reverse Geocoder\n\nThis library provides a local reverse geocoder for Node.js that is based on\n[GeoNames](https://download.geonames.org/export/dump/) data. It is _local_ in\nthe sense that there are no calls to a remote service like the\n[Google Maps API](https://developers.google.com/maps/documentation/javascript/geocoding#ReverseGeocoding),\nand in consequence the gecoder is suitable for batch reverse geocoding. It is\n_reverse_ in the sense that you give it a (list of) point(s), _i.e._, a\nlatitude/longitude pair, and it returns the closest city to that point.\n\n## Installation\n\n```bash\n$ npm install local-reverse-geocoder\n```\n\nOr, with Yarn:\n\n```bash\n$ yarn add local-reverse-geocoder\n```\n\n## Docker\n\nFor usage with [Docker](https://www.docker.com/), a Dockerfile is available in\nthis project. It caches all the required files from GeoNames.\n\nTo build and run it:\n\n```bash\n$ docker build -t local-reverse-geocoder .\n$ docker run -it -e PORT=3000 --rm local-reverse-geocoder\n```\n\nOr pull and run it:\n\n```bash\n$ docker run -it -e PORT=3000 --rm ghcr.io/tomayac/local-reverse-geocoder\n```\n\n## Usage in Node.js\n\n### Init\n\nYou must initialize the geocoder prior to the first call to `lookUp()`. This\nensures that all files are loaded into the cache prior to making the first call.\n\n```javascript\nvar geocoder = require('local-reverse-geocoder');\n\ngeocoder.init({}, function () {\n  // geocoder is loaded and ready to run\n});\n```\n\nOptionally `init()` also allows you to specify which files to load data from.\nThis reduces initialization time and the runtime memory footprint of the Node.js\nprocess. By default, all files are loaded.\n\n```javascript\nvar geocoder = require('local-reverse-geocoder');\n\ngeocoder.init(\n  {\n    citiesFileOverride: 'cities500', // one of 'cities500', 'cities1000', 'cities5000', 'cities15000' or null to keep the default city database (cities1000)\n    load: {\n      admin1: true,\n      admin2: false,\n      admin3And4: false,\n      alternateNames: false,\n    },\n  },\n  function () {\n    // Ready to call lookUp\n  }\n);\n```\n\nOptionally `init()` allows you to specify the directory that GeoNames files are\ndownloaded and cached in, and a specific cities database to be used.\n\n```javascript\nvar geocoder = require('local-reverse-geocoder');\n\ngeocoder.init({ dumpDirectory: '/tmp/geonames' }, function () {\n  // Ready to call lookUp and all files will be downloaded to /tmp/geonames\n});\n```\n\n### Look Up\n\n```javascript\nvar geocoder = require('local-reverse-geocoder');\n\n// With just one point\nvar point = { latitude: 42.083333, longitude: 3.1 };\ngeocoder.lookUp(point, function (err, res) {\n  console.log(JSON.stringify(res, null, 2));\n});\n\n// In batch mode with many points\nvar points = [\n  { latitude: 42.083333, longitude: 3.1 },\n  { latitude: 48.466667, longitude: 9.133333 },\n];\ngeocoder.lookUp(points, function (err, res) {\n  console.log(JSON.stringify(res, null, 2));\n});\n\n// How many results to display at max\nvar maxResults = 5;\n\n// With just one point\nvar point = { latitude: 42.083333, longitude: 3.1 };\ngeocoder.lookUp(point, maxResults, function (err, res) {\n  console.log(JSON.stringify(res, null, 2));\n});\n\n// In batch mode with many points\nvar points = [\n  { latitude: 42.083333, longitude: 3.1 },\n  { latitude: 48.466667, longitude: 9.133333 },\n];\ngeocoder.lookUp(points, maxResults, function (err, res) {\n  console.log(JSON.stringify(res, null, 2));\n});\n```\n\n## Usage of the Web Service\n\nYou can use the built-in Web service by running `node app.js` as follows.\n\n```bash\n$ curl \"http://localhost:3000/geocode?latitude=48.466667\u0026longitude=9.133333\u0026latitude=42.083333\u0026longitude=3.1\u0026maxResults=2\"\n```\n\n## Result Format\n\nAn output array that maps each point in the input array (or input object\nconverted to a single-element array) to the `maxResults` closest addresses.\n\nThe measurement units are used\n[as defined by GeoNames](http://www.geonames.org/export/web-services.html), for\nexample, `elevation` is measured in meters. The `distance` value is dynamically\ncalculated based on the\n[haversine distance](http://www.movable-type.co.uk/scripts/latlong.html) for the\ninput point(s) to each of the particular results points and is measured in\nkilometers.\n\n```javascript\n[\n  [\n    {\n      geoNameId: '2919146',\n      name: 'Gomaringen',\n      asciiName: 'Gomaringen',\n      alternateNames: null,\n      latitude: '48.45349',\n      longitude: '9.09582',\n      featureClass: 'P',\n      featureCode: 'PPLA4',\n      countryCode: 'DE',\n      cc2: null,\n      admin1Code: {\n        name: 'Baden-Württemberg',\n        asciiName: 'Baden-Wuerttemberg',\n        geoNameId: '2953481',\n      },\n      admin2Code: {\n        name: 'Tübingen Region',\n        asciiName: 'Tuebingen Region',\n        geoNameId: '3214106',\n      },\n      admin3Code: {\n        name: 'Landkreis Tübingen',\n        asciiName: 'Landkreis Tubingen',\n        geoNameId: '2820859',\n      },\n      admin4Code: {\n        name: 'Gomaringen',\n        asciiName: 'Gomaringen',\n        geoNameId: '6555939',\n      },\n      population: '8400',\n      elevation: null,\n      dem: '430',\n      timezone: 'Europe/Berlin',\n      modificationDate: '2011-04-25',\n      alternateName: {\n        de: {\n          altName: 'Gomaringen',\n          isPreferredName: true,\n          isShortName: false,\n          isColloquial: false,\n          isHistoric: false,\n        },\n      },\n      distance: 3.1302317076079285,\n    },\n    {\n      geoNameId: '2814195',\n      name: 'Wannweil',\n      asciiName: 'Wannweil',\n      alternateNames: null,\n      latitude: '48.51667',\n      longitude: '9.15',\n      featureClass: 'P',\n      featureCode: 'PPLA4',\n      countryCode: 'DE',\n      cc2: null,\n      admin1Code: {\n        name: 'Baden-Württemberg',\n        asciiName: 'Baden-Wuerttemberg',\n        geoNameId: '2953481',\n      },\n      admin2Code: {\n        name: 'Tübingen Region',\n        asciiName: 'Tuebingen Region',\n        geoNameId: '3214106',\n      },\n      admin3Code: {\n        name: 'Landkreis Reutlingen',\n        asciiName: 'Landkreis Reutlingen',\n        geoNameId: '3220792',\n      },\n      admin4Code: {\n        name: 'Wannweil',\n        asciiName: 'Wannweil',\n        geoNameId: '6555933',\n      },\n      population: '5092',\n      elevation: null,\n      dem: '320',\n      timezone: 'Europe/Berlin',\n      modificationDate: '2011-04-25',\n      distance: 5.694122211376861,\n    },\n  ],\n  [\n    {\n      geoNameId: '3130634',\n      name: 'Albons',\n      asciiName: 'Albons',\n      alternateNames: null,\n      latitude: '42.10389',\n      longitude: '3.08433',\n      featureClass: 'P',\n      featureCode: 'PPLA3',\n      countryCode: 'ES',\n      cc2: null,\n      admin1Code: {\n        name: 'Catalonia',\n        asciiName: 'Catalonia',\n        geoNameId: '3336901',\n      },\n      admin2Code: {\n        name: 'Província de Girona',\n        asciiName: 'Provincia de Girona',\n        geoNameId: '6355230',\n      },\n      admin3Code: {\n        name: 'Albons',\n        asciiName: 'Albons',\n        geoNameId: '6534005',\n      },\n      admin4Code: null,\n      population: '558',\n      elevation: '13',\n      dem: '18',\n      timezone: 'Europe/Madrid',\n      modificationDate: '2012-03-04',\n      distance: 2.626176210836868,\n    },\n    {\n      geoNameId: '3118799',\n      name: \"la Tallada d'Empordà\",\n      asciiName: \"la Tallada d'Emporda\",\n      alternateNames:\n        \"La Tallada,la Tallada,la Tallada d'Emporda,la Tallada d'Empordà\",\n      latitude: '42.0802',\n      longitude: '3.05583',\n      featureClass: 'P',\n      featureCode: 'PPLA3',\n      countryCode: 'ES',\n      cc2: null,\n      admin1Code: {\n        name: 'Catalonia',\n        asciiName: 'Catalonia',\n        geoNameId: '3336901',\n      },\n      admin2Code: {\n        name: 'Província de Girona',\n        asciiName: 'Provincia de Girona',\n        geoNameId: '6355230',\n      },\n      admin3Code: {\n        name: \"la Tallada d'Empordà\",\n        asciiName: \"la Tallada d'Emporda\",\n        geoNameId: '6534150',\n      },\n      admin4Code: null,\n      population: '0',\n      elevation: null,\n      dem: '16',\n      timezone: 'Europe/Madrid',\n      modificationDate: '2012-03-04',\n      distance: 3.6618561653699846,\n    },\n  ],\n];\n```\n\n## A Word on Accuracy\n\nBy design, _i.e._, due to the granularity of the available\n[GeoNames data](http://download.geonames.org/export/dump/cities1000.zip), this\nreverse geocoder is limited to city-level, so no streets or house numbers. In\nmany cases this is already sufficient, but obviously your actual mileage may\nvary. If you need street-level granularity, you are better off with a service\nlike Google's\n[reverse geocoding API](https://developers.google.com/maps/documentation/javascript/geocoding#ReverseGeocoding).\n(Full disclosure: the author is currently employed by Google.)\n\n## A Word on Initialization Speed\n\nThe initial lookup takes quite a while, as the geocoder has to download roughly\n2GB(!) of data that it then caches locally (unzipped, this occupies about 1.3GB\nof disk space). All follow-up requests are lightning fast.\n\n### Downloading specific sets of countries\n\nTo reduce the time taken to initialize the data, you can manually configure it\nto only download a specific set of countries from GeoNames. Do note that when\nyou add a country code into the array, it will disable the geocoder from\ndownloading all ~2.29GB(!) worth of data and only load the specified countries'\ndata. If you want to re-enable the geocoder to download all data, the countries\narray needs to be empty.\n\n#### Example of getting data for individual country\n\n```javascript\nconst geocoder = require('local-reverse-geocoder');\ngeocoder.init(\n  {\n    load: {\n      admin1: true,\n      admin2: true,\n      admin3And4: true,\n      alternateNames: true,\n    },\n    // Comma-separated list of country codes. An empty array means all countries.\n    countries: ['SG', 'AU'],\n  },\n  function () {\n    // Ready to call lookUp\n  }\n);\n```\n\n### Post-install script\n\nThere's also the option of downloading the GeoNames files via a post-install\nscript.\nThe script is invoked automatically after installation, but won't download any\nfiles without getting at least one of the init options in an env variable.\nThe options should be specified with a `GEOCODER_POSTINSTALL_` prefix.\n\n#### Example of downloading the files via the post-install script\n\n```js\nexport GEOCODER_POSTINSTALL_DUMP_DIRECTORY=/usr/src/app\nexport GEOCODER_POSTINSTALL_ADMIN1=true\nexport GEOCODER_POSTINSTALL_ADMIN2=true\nexport GEOCODER_POSTINSTALL_COUNTRIES=SG,AU\nnpm install local-reverse-geocoder\n\n// As long as the app is started within the same day\n// and uses the same options, the init call won't download any files.\n```\n\n## A Word on Data Freshness\n\nBy default, the local [GeoNames dump](http://download.geonames.org/export/dump/)\ndata gets refreshed each day, creating files such as\n`admin1CodesASCII_YYYY-MM-DD.txt` in the cache directory. If you wish to reuse\nthe existing downloaded files, you can rename them to remove the date, such as\n`admin1CodesASCII.txt`, which will suppress the download. If you don't\nneed admin1, admin2, admin3, admin4 or alternate names, you can turn them off in\na manual init call and decrease load time.\n\n## A Word on Memory Usage\n\nIf you run into a\n`FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory`\nissue, try running node with the\n[V8 option](https://github.com/nodejs/node/issues/7937)\n`--max-old-space-size=2000`.\n\n## A Word on Debugging\n\nTo turn on debug logging add a DEBUG=local-reverse-geocoder environment variable\non the command line.\n\n## License\n\nCopyright 2017 Thomas Steiner (tomac@google.com)\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at\n\n[http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)\n\nUnless required by applicable law or agreed to in writing, software distributed\nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the License for the\nspecific language governing permissions and limitations under the License.\n\n## Acknowledgements\n\nThis project was inspired by Richard Penman's Python\n[reverse geocoder](https://github.com/richardpenman/reverse_geocode/). It uses\nUbilabs'\n[k-d-tree implementation](https://github.com/ubilabs/kd-tree-javascript) that\nwas ported to Node.js by [Luke Arduini](https://github.com/luk-/node-kdt).\n\n## Contributors\n\n- [@chriskinsman](https://github.com/chriskinsman)\n- [@bloodfire91](https://github.com/bloodfire91)\n- [@yjwong](https://github.com/yjwong)\n- [@RDIL](https://github.com/RDIL)\n- [@tkafka](https://github.com/tkafka)\n- [@helloitsm3](https://github.com/helloitsm3)\n\n[![npm](https://nodei.co/npm/local-reverse-geocoder.png?downloads=true)](https://nodei.co/npm/local-reverse-geocoder/)\n","funding_links":["https://github.com/sponsors/tomayac"],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomayac%2Flocal-reverse-geocoder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftomayac%2Flocal-reverse-geocoder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomayac%2Flocal-reverse-geocoder/lists"}