npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@spurreiter/geocoder

v2.1.1

Published

Node geocoding library, google maps, bing maps, mapquest, mapbox, here maps, arcgis, nominatim, ...

Downloads

180

Readme

CI npm version Downloads per month

geocoder

This project is derived from node-geocoder with focus on modern code with esm modules.

Features:

  • multiple providers
  • similar results for all providers
  • modern code based on esm modules and native Promises with async/ await
  • Typescript types
  • http(s) agent by default for reusing tcp connections
  • fetch based http adapter with timeout
  • cascade providers and stop on first successful result
  • combine search results from multiple providers
  • configurable circuit breaker which stops calling geocoder e.g. if request limit is exhausted.
  • extensive test-suite with examples for getting started
  • GeoJSON, GPX formatters

supported providers

| Provider | forward | reverse | ip | Notes | | ----------------------------------------------------------------------------------------------- | :-----: | :-----: | :-: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ArcGisGeocoder | ✅ | ✅ | ❌ | | | BingMapsGeocoder | ✅ | ✅ | ❌ | results are in English only | | GoogleGeocoder | ✅ | ✅ | ❌ | | | GeocodioGeocoder | ✅ | ✅ | ❌ | results are in English only; Country must be part of query, otherwise fallback to US; Only US and major cities in CA supported | | HereGeocoder | ✅ | ✅ | ❌ | | | IpStackGeocoder | ❌ | ❌ | ✅ | | | LocationIqGeocoder | ✅ | ✅ | ❌ | | | GeoLite2Geocoder | ❌ | ❌ | ✅ | Local GeoLite2 provider or MaxMind API. Output as of @maxmind/geoip2-node | | MapBoxGeocoder | ✅ | ✅ | ❌ | | | MapQuestGeocoder | ✅ | ✅ | ❌ | open-data and licensed versions are supported | | OpenCageGeocoder | ✅ | ✅ | ❌ | | | OpendataFranceGeocoder | ✅ | ✅ | ❌ | France only | | OpenMapQuest | ✅ | ✅ | ❌ | Search Results based on OSM | | OsmGeocoder | ✅ | ✅ | ❌ | Searches nominatim.org | | PeliasGeocoder | ✅ | ✅ | ❌ | Local or Geocode.earth | | PickpointGeocoder | ✅ | ✅ | ❌ | Search Results based on OSM | | TomTomGeocoder | ✅ | ✅ | ❌ | | | YandexGeocoder | ✅ | ✅ | ❌ | |

usage

forward geocoding

import { fetchAdapter, OsmGeocoder } from '@spurreiter/geocoder'

const adapter = fetchAdapter()
const geocoder = new OsmGeocoder(adapter, 
  { language: 'en', limit: 5, referer: 'https://mysite' })

const results = await geocoder.forward('135 pilkington avenue, birmingham')
// [
//   {
//     formattedAddress: '135, Pilkington Avenue, Maney, Sutton Coldfield, Wylde Green, Birmingham, West Midlands Combined Authority, West Midlands, England, B72 1LH, United Kingdom',
//     latitude: 52.5487921,
//     longitude: -1.8164308339635031,
//     country: 'United Kingdom',
//     countryCode: 'GB',
//     state: 'England',
//     county: 'West Midlands Combined Authority',
//     city: 'Birmingham',
//     zipcode: 'B72 1LH',
//     district: 'West Midlands',
//     streetName: 'Pilkington Avenue',
//     streetNumber: '135',
//     neighbourhood: undefined,
//     extra: {
//       id: 90394480,
//       confidence: 0.411,
//       bbox: [ -1.816513, 52.5487473, -1.8163464, 52.5488481 ]
//     }
//   }
// ]

reverse geocoding

const results = await geocoder.reverse({ lat: 40.714232, lng: -73.9612889 })
// [
//   {
//     formattedAddress: '279, Bedford Avenue, Williamsburg, Brooklyn, Kings County, New York, 11211, United States',
//     latitude: 40.714205,
//     longitude: -73.96131519274765,
//     country: 'United States',
//     countryCode: 'US',
//     state: 'New York',
//     county: undefined,
//     city: 'New York',
//     zipcode: '11211',
//     district: undefined,
//     streetName: 'Bedford Avenue',
//     streetNumber: '279',
//     neighbourhood: undefined,
//     extra: {
//       id: 279767984,
//       confidence: 0,
//       bbox: [ -73.9613744, 40.7141617, -73.961256, 40.7142482 ]
//     }
//   }
// ]

cascade

Allows to sequentially ask various geocoders for results. Successful results from the first geocoder are returned.

Works with forward and reverse geocoding.

import { Cascade, fetchAdapter, HereGeocoder, OsmGeocoder } from '@spurreiter/geocoder'

const language = "es"
const geocoders = [
  new HereGeocoder(adapter, { apiKey: 'your-api-key', language }),
  new OsmGeocoder(adapter, { language, referer: 'https://mysite' })
]
const cascade = new Cascade(geocoders)

const results = await cascade.forward('135 pilkington avenue, birmingham')

// results contains data from 1st geocoder which responds without error.

combine

Combine results from various geocoders into one result set.

Works with forward and reverse geocoding.

import { Combine, fetchAdapter, HereGeocoder, OsmGeocoder } from '@spurreiter/geocoder'

const geocoders = [
  new HereGeocoder(adapter, { apiKey: 'your-api-key' }),
  new OsmGeocoder(adapter, { referer: 'https://mysite' })
]
const combine = new Combine(geocoders)

const results = await combine.forward(
    { address: '135 pilkington avenue, birmingham', language: 'es' })

// results contains data from all reachable geocoders.

formatters

Formatters allow to format the geocoder result object to various formats like geoJson or gpx.

geoJsonFormatter

The output of the GeoJSON formatter is according to RFC-7946 and geocodejson-spec.

import { geoJsonFormatter } from '@spurreiter/geocoder'

const query = '135 pilkington avenue, birmingham'
const results = await geocoder.forward(query)

const geoJson = geoJsonFormatter(results, {query})
// {
//   type: 'FeatureCollection',
//   geocoding: {
//     version: '0.1.0',
//     license: null,
//     attribution: null,
//     query: '135 pilkington avenue, birmingham'
//   },
//   features: [{...}, ...]
// }

gpxFormatter

import { gpxFormatter } from '@spurreiter/geocoder'

const query = '135 pilkington avenue, birmingham'
const results = await geocoder.forward(query)

const gpx = gpxFormatter(results)
// <?xml version="1.0" encoding="UTF-8"?>
// <gpx version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
// <wpt lat="52.5487921" lon="-1.8164308339635031"><name>135, Pilkington Avenue, Maney, Sutton Coldfield, Wylde Green, Birmingham, West Midlands Combined Authority, West Midlands, England, B72 1LH, United Kingdom</name></wpt>
// </gpx>

contributing

If you are missing a provider, which should be part of this project, please consider forking this project and filing a pull-request.

license

MIT licensed