A high-performance native geocoding library for React Native using Nitro Modules JSI bindings.
- JSI-powered: Direct native calls without async bridge overhead
- Forward Geocoding: Convert addresses to coordinates
- Reverse Geocoding: Convert coordinates to addresses
- Multiple Results: Get multiple geocoding suggestions
- Locale Support: Configurable language for results
- Distance Calculation: Native distance calculation (synchronous)
- Zero Dependencies: Uses native platform APIs only
- iOS:
CLGeocoder(CoreLocation) - Android:
android.location.Geocoder
- iOS:
- Geocoding calls are network-bound (~160ms to Apple/Google servers)
- Synchronous operations like
calculateDistanceare extremely fast (~0.6μs per call)
yarn add react-native-nitro-geocoder react-native-nitro-modulescd ios && pod installNo additional setup required.
import { Geocoder } from 'react-native-nitro-geocoder'if (Geocoder.isGeocodingAvailable) {
console.log('Geocoding is available')
}const result = await Geocoder.geocode('Riyadh, Saudi Arabia', 'en')
// {
// position: { latitude: 24.7136, longitude: 46.6753 },
// formattedAddress: "Riyadh, Riyadh Province, Saudi Arabia",
// city: "Riyadh",
// country: "Saudi Arabia",
// countryCode: "SA",
// ...
// }const result = await Geocoder.reverseGeocode(24.7136, 46.6753, 'en')
console.log(result.formattedAddress) // "King Fahd Road, Riyadh, Saudi Arabia"
console.log(result.city) // "Riyadh"
console.log(result.country) // "Saudi Arabia"const results = await Geocoder.geocodeMultiple('Springfield', 5, 'en')
// Returns up to 5 matching locations// ~0.64μs per call - can do 1.5 million calls/second!
const distance = Geocoder.calculateDistance(
24.7136, 46.6753, // Riyadh
21.4225, 39.8262 // Mecca
)
console.log(`Distance: ${(distance / 1000).toFixed(2)} km`) // ~850 km// English
const en = await Geocoder.reverseGeocode(35.6762, 139.6503, 'en')
console.log(en.country) // "Japan"
// Arabic
const ar = await Geocoder.reverseGeocode(24.7136, 46.6753, 'ar')
console.log(ar.country) // "المملكة العربية السعودية"
// Japanese
const ja = await Geocoder.reverseGeocode(35.6762, 139.6503, 'ja')
console.log(ja.country) // "日本"| Method | Description |
|---|---|
geocode(address, locale) |
Address to coordinates |
reverseGeocode(lat, lon, locale) |
Coordinates to address |
geocodeMultiple(address, maxResults, locale) |
Get multiple results |
calculateDistance(lat1, lon1, lat2, lon2) |
Distance in meters (sync) |
| Property | Description |
|---|---|
isGeocodingAvailable |
Check if geocoding is available |
interface Position {
latitude: number
longitude: number
}
interface Region {
center: Position
radius: number
}
interface GeocoderResult {
position: Position
formattedAddress: string
street: string
city: string
state: string
subAdminArea: string
subLocality: string
country: string
countryCode: string
postalCode: string
region: Region | null // iOS only, null on Android
}- Uses
CLGeocoder(CoreLocation) - iOS 14.0+
- No API key required
- Rate limited (~50 req/min)
- Important: iOS does not allow multiple geocoding requests simultaneously. If you send a second request while one is in progress, the first one will be cancelled.
- Uses
android.location.Geocoder - API level 21+
- No API key required
- Check
isGeocodingAvailable(some emulators don't support it)
The library includes ready-to-use React hooks:
import {
useGeocode,
useReverseGeocode,
useGeocodeMultiple,
useDistance,
useGeocoder,
} from 'react-native-nitro-geocoder'function MyComponent() {
const { result, error, loading, reverseGeocode, reset } = useReverseGeocode()
const handleLookup = async () => {
await reverseGeocode(24.7136, 46.6753, 'en')
}
return (
<View>
{loading && <ActivityIndicator />}
{error && <Text>Error: {error}</Text>}
{result && <Text>{result.formattedAddress}</Text>}
</View>
)
}const { result, error, loading, geocode, reset } = useGeocode()
await geocode('Riyadh, Saudi Arabia', 'en')const { results, error, loading, geocodeMultiple, reset } = useGeocodeMultiple()
await geocodeMultiple('Springfield', 5, 'en')
// results: GeocoderResult[]const { calculateDistance, calculateDistanceKm } = useDistance()
const meters = calculateDistance(24.7136, 46.6753, 21.4225, 39.8262)
const km = calculateDistanceKm(24.7136, 46.6753, 21.4225, 39.8262)const {
isAvailable,
geocode,
reverseGeocode,
geocodeMultiple,
calculateDistance,
} = useGeocoder()MIT
Built with Nitro Modules by Marc Rousavy.