Skip to main content

Reverse Geocoding

GeoPulse uses geocoding services to convert GPS coordinates into human-readable addresses and location names. You can configure multiple providers with automatic fallback support. This configuration applies to all users.

Overall Geocoding Configuration

PropertyDefaultDescription
GEOPULSE_GEOCODING_DELAY_MS1000A delay in milliseconds between sending requests to geocoding provider.
Nomatim's default rate limit is 1req/s. For selfhosted solutions change it to lower value
GEOPULSE_GEOCODING_CACHE_MAX_BBOX_AREA_KM25000Maximum provider bounding box area (km²) accepted for cache containment matching. Oversized bboxes are dropped and matching falls back to coordinate tolerance.

Resilience Tuning

These settings tune retry and circuit breaker behavior for geocoding provider calls and reconciliation jobs.

PropertyDefaultDescription
GEOPULSE_GEOCODING_RETRY_MAX_RETRIES5Maximum retry attempts for provider calls
GEOPULSE_GEOCODING_RETRY_DELAY_MS1250Base delay between provider retries (milliseconds)
GEOPULSE_GEOCODING_RETRY_JITTER_MS250Random jitter applied to retry delay (milliseconds)
GEOPULSE_GEOCODING_CB_FAILURE_RATIO0.7Failure ratio that opens circuit breaker
GEOPULSE_GEOCODING_CB_REQUEST_VOLUME10Circuit breaker rolling window size
GEOPULSE_GEOCODING_CB_DELAY_SECONDS20Time circuit remains open before half-open
GEOPULSE_GEOCODING_CB_SUCCESS_THRESHOLD2Successful calls needed in half-open state to close breaker
GEOPULSE_GEOCODING_RECONCILE_ITEM_MAX_ATTEMPTS4Max attempts per item during reconciliation jobs
GEOPULSE_GEOCODING_RECONCILE_CIRCUIT_OPEN_WAIT_MS20000Wait time before retry when circuit is open (milliseconds)
GEOPULSE_GEOCODING_RECONCILE_INTER_ITEM_DELAY_MS${GEOPULSE_GEOCODING_DELAY_MS:1000}Delay between reconciliation items (milliseconds)

Available Providers

ProviderFree TierAPI Key RequiredRate Limits
NominatimYesNo1 request/second
PhotonYesNoUnknown
Google MapsLimitedYes40,000 requests/month free
MapboxLimited, see ToS note belowYes100,000 requests/month free

Geocoding Configuration

PropertyDefaultDescription
GEOPULSE_GEOCODING_PRIMARY_PROVIDERnominatimPrimary geocoding service (nominatim, googlemaps, mapbox, photon)
GEOPULSE_GEOCODING_FALLBACK_PROVIDER(empty)Fallback service if primary fails
GEOPULSE_GEOCODING_NOMINATIM_ENABLEDtrueEnable Nominatim geocoding service
GEOPULSE_GEOCODING_NOMINATIM_URLhttps://nominatim.openstreetmap.orgNominatim url
GEOPULSE_GEOCODING_NOMINATIM_LANGUAGE(empty)Nominatim language preference (BCP 47: en-US, de, uk, ja). If not set, no Accept-Language header is sent
GEOPULSE_GEOCODING_PHOTON_ENABLEDfalseEnable Photon geocoding service
GEOPULSE_GEOCODING_PHOTON_URLhttps://photon.komoot.ioPhoton url
GEOPULSE_GEOCODING_PHOTON_LANGUAGE(empty)Photon language preference (allowed: de, pl, el, en, es, fa, fr, it, ja, ko). If not set, no Accept-Language header/lang query parameter is sent
GEOPULSE_GEOCODING_GOOGLE_MAPS_ENABLEDfalseEnable Google Maps geocoding service
GEOPULSE_GEOCODING_GOOGLE_MAPS_API_KEY(empty)Google Maps API key (required for Google Maps)
GEOPULSE_GEOCODING_GOOGLE_MAPS_LANGUAGE(empty)Google Maps language code for reverse geocoding responses (optional, query param language)
GEOPULSE_GEOCODING_MAPBOX_ENABLEDfalseEnable Mapbox geocoding service
GEOPULSE_GEOCODING_MAPBOX_ACCESS_TOKEN(empty)Mapbox access token (required for Mapbox)

Provider switch behavior: changing primary/fallback provider affects only new lookups. Existing cached geocoding records are reused until you run reconciliation from the Reverse Geocoding Management page.

BBox safety behavior: provider bboxes larger than GEOPULSE_GEOCODING_CACHE_MAX_BBOX_AREA_KM2 are automatically dropped, so they cannot over-match unrelated points.

Service Setup

Nominatim (Default)

  • No API key required
  • Uses OpenStreetMap data
  • Rate limited to 1 request per second
  • Best for privacy-conscious users
  • Possible to use self-hosted version
  • Language can be configured via GEOPULSE_GEOCODING_NOMINATIM_LANGUAGE (e.g., "en-US", "de", "uk")

Photon

  • No API key required
  • Rate limited to 2 request per second
  • Possible to use self-hosted version
  • Language can be configured via GEOPULSE_GEOCODING_PHOTON_LANGUAGE (allowed: "de", "pl", "el", "en", "es", "fa", "fr", "it", "ja", "ko")

Google Maps

  1. Get API key from Google Cloud Console
  2. Enable Geocoding API
  3. Set billing account (free tier available)
  4. Optional: set GEOPULSE_GEOCODING_GOOGLE_MAPS_LANGUAGE to force localized reverse geocoding results (Google language query param)

Supported Google Maps language codes:

Language CodeLanguageLanguage CodeLanguage
afAfrikaansjaJapanese
sqAlbanianknKannada
amAmharickkKazakh
arArabickmKhmer
hyArmeniankoKorean
azAzerbaijanikyKyrgyz
euBasqueloLao
beBelarusianlvLatvian
bnBengaliltLithuanian
bsBosnianmkMacedonian
bgBulgarianmsMalay
myBurmesemlMalayalam
caCatalanmrMarathi
zhChinesemnMongolian
zh-CNChinese (Simplified)neNepali
zh-HKChinese (Hong Kong)noNorwegian
zh-TWChinese (Traditional)plPolish
hrCroatianptPortuguese
csCzechpt-BRPortuguese (Brazil)
daDanishpt-PTPortuguese (Portugal)
nlDutchpaPunjabi
enEnglishroRomanian
en-AUEnglish (Australian)ruRussian
en-GBEnglish (Great Britain)srSerbian (Cyrillic)
etEstoniansr-LatnSerbian (Latin script)
faFarsisiSinhalese
fiFinnishskSlovak
filFilipinoslSlovenian
frFrenchesSpanish
fr-CAFrench (Canada)es-419Spanish (Latin America)
glGalicianswSwahili
kaGeorgiansvSwedish
deGermantaTamil
elGreekteTelugu
guGujaratithThai
iwHebrewtrTurkish
hiHindiukUkrainian
huHungarianurUrdu
isIcelandicuzUzbek
idIndonesianviVietnamese
itItalianzuZulu

Mapbox

  1. Create account at Mapbox
  2. Generate access token
  3. Monitor usage in dashboard

⚖️Terms of Service & Free Tier Notice for Mapbox

Mapbox usage in this app is optional and requires your own access token.

By providing a Mapbox token, you agree to the Mapbox Terms of Service and are responsible for complying with them, including any usage, caching, or data-storage restrictions.

The Mapbox free tier includes a limited number of monthly requests and is intended for development and light personal use.

If you exceed those limits or need to store geocoding results long-term — for example, saving reverse-geocoded addresses in your database (which this app does by default) — you may need a paid or commercial plan that supports permanent data storage.

Configuration

Docker / Docker Compose

# Geocoding Service Configuration
GEOPULSE_GEOCODING_PRIMARY_PROVIDER=nominatim
GEOPULSE_GEOCODING_FALLBACK_PROVIDER=googlemaps

# Service Enablement
GEOPULSE_GEOCODING_NOMINATIM_ENABLED=true
GEOPULSE_GEOCODING_GOOGLE_MAPS_ENABLED=true
GEOPULSE_GEOCODING_MAPBOX_ENABLED=false

# Custom URLs
GEOPULSE_GEOCODING_NOMINATIM_URL=https://nominatim.openstreetmap.org
GEOPULSE_GEOCODING_PHOTON_URL=https://photon.komoot.io

# Language preferences (optional - if not set, providers return local language)
GEOPULSE_GEOCODING_NOMINATIM_LANGUAGE=en-US
GEOPULSE_GEOCODING_PHOTON_LANGUAGE=en
GEOPULSE_GEOCODING_GOOGLE_MAPS_LANGUAGE=en

# API Credentials (if using paid services)
GEOPULSE_GEOCODING_GOOGLE_MAPS_API_KEY=your_google_api_key_here
GEOPULSE_GEOCODING_MAPBOX_ACCESS_TOKEN=your_mapbox_token_here

#Delay between requests to geocoding provider
GEOPULSE_GEOCODING_DELAY_MS=1000

# Resilience tuning (optional)
GEOPULSE_GEOCODING_RETRY_MAX_RETRIES=5
GEOPULSE_GEOCODING_RETRY_DELAY_MS=1250
GEOPULSE_GEOCODING_RETRY_JITTER_MS=250
GEOPULSE_GEOCODING_CB_FAILURE_RATIO=0.7
GEOPULSE_GEOCODING_CB_REQUEST_VOLUME=10
GEOPULSE_GEOCODING_CB_DELAY_SECONDS=20
GEOPULSE_GEOCODING_CB_SUCCESS_THRESHOLD=2
GEOPULSE_GEOCODING_RECONCILE_ITEM_MAX_ATTEMPTS=4
GEOPULSE_GEOCODING_RECONCILE_CIRCUIT_OPEN_WAIT_MS=20000
GEOPULSE_GEOCODING_RECONCILE_INTER_ITEM_DELAY_MS=1000

Kubernetes / Helm

Configure geocoding in values.yaml:

config:
geocoding:
primaryProvider: "nominatim"
fallbackProvider: "googlemaps"
delayMs: 1000
nominatim:
enabled: true
url: "https://nominatim.openstreetmap.org"
language: "en-US" # Optional
photon:
enabled: false
url: "https://photon.komoot.io"
language: "en-US" # Optional
googleMaps:
enabled: true
apiKey: "your-api-key" # Stored as Kubernetes Secret
language: "en" # Optional (Google supported language code)
mapbox:
enabled: false
accessToken: ""

Apply with: helm upgrade geopulse ./helm/geopulse -f custom-values.yaml

For more details, see the Helm Configuration Guide.