Turn addresses into coordinates and find nearby banks, hospitals, and other amenities.
Mapradar is a location intelligence library. Give it an address like "Shibuya, Tokyo" and it returns:
- Coordinates - Latitude and longitude
- Nearby Services - Banks, hospitals, schools, fuel stations within a radius
- Distance - How far each service is from your location
Built in Rust. Works in both Python and Rust.
Python
uv add mapradarRust
[dependencies]
mapradar = { version = "0.2", default-features = false }
tokio = { version = "1", features = ["full"] }Note: Use
default-features = falsefor pure Rust (no Python bindings).
From Source
Python:
git clone https://github.com/iamprecieee/mapradar
cd mapradar
uv add maturin
maturin developRust:
[dependencies]
mapradar = { git = "https://github.com/iamprecieee/mapradar" }CLI Tool
Install the command-line tool globally:
cargo install mapradarOr run from source:
cargo install --path .Mapradar now comes with a powerful CLI for quick lookups.
Setup:
Create a .env file in your current directory with your API key:
MAPRADAR_API_KEY=your_api_key_hereCommands:
-
Geocode:
mapradar geocode "1600 Amphitheatre Parkway, Mountain View, CA" -
Reverse Geocode:
mapradar reverse 37.422 -122.084
-
Nearby Search:
# Find banks and schools within 500m mapradar nearby --lat 6.6018 --lng 3.3515 --radius 500 --type bank,school
import asyncio
from mapradar import MapradarClient, SearchQuery, ServiceType
async def main():
client = MapradarClient("YOUR_GOOGLE_MAPS_API_KEY")
# Find banks and hospitals near an address
query = SearchQuery.from_address("Shibuya, Tokyo")
intel = await client.fetch_intelligence(
query,
service_types=[ServiceType.Bank, ServiceType.Hospital],
radius_km=3.0
)
print(f"Location: {intel.location.address}")
print(f"Country: {intel.location.country}")
for service in intel.nearby_services:
print(f" {service.name} - {service.distance_km:.2f} km")
asyncio.run(main())More Examples
Geocoding only:
location = await client.geocode("1 Marina, Lagos")
print(location.latitude, location.longitude, location.country)Reverse geocoding:
location = await client.reverse_geocode(6.4541, 3.3947)
print(location.address, location.country)JSON-RPC format (for microservices):
response = await client.geocode_rpc("Lekki, Lagos", id="req-123")
print(response.to_json())use mapradar::client::MapradarClient;
use mapradar::models::{SearchQuery, ServiceType};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = MapradarClient::new("YOUR_API_KEY".to_string());
let location = client.geocode_async("Times Square, NYC").await?;
println!("{}, {} ({})", location.latitude, location.longitude, location.country);
Ok(())
}| Feature | Description |
|---|---|
| Geocoding | Convert addresses to coordinates |
| Reverse Geocoding | Convert coordinates to addresses |
| Nearby Search | Find banks, hospitals, schools, etc. |
| Parallel Fetching | Search multiple service types at once |
| Caching | Automatic in-memory cache reduces API calls |
| JSON-RPC 2.0 | Built-in format for microservice APIs |
| Type | Google Maps Category |
|---|---|
Bank |
bank |
Hospital |
hospital |
School |
school |
Market |
supermarket |
Mall |
shopping_mall |
Restaurant |
restaurant |
FuelStation |
gas_station |
BusStop |
bus_station |
TrainStation |
train_station |
TaxiStand |
taxi_stand |
Landmark |
tourist_attraction |
Python
client = MapradarClient("YOUR_API_KEY")| Method | Parameters | Returns |
|---|---|---|
geocode(address) |
address: str |
GeoLocation |
reverse_geocode(lat, lng) |
latitude: float, longitude: float |
GeoLocation |
search_nearby(...) |
lat, lng, service_type, radius_meters, max_results |
list[NearbyService] |
fetch_intelligence(...) |
query, service_types, radius_km=5.0, max_results_per_type=5 |
LocationIntelligence |
| Method | Extra Parameter |
|---|---|
geocode_rpc(address, id?) |
id: str = "1" |
reverse_geocode_rpc(lat, lng, id?) |
id: str = "1" |
search_nearby_rpc(..., id?) |
id: str = "1" |
fetch_intelligence_rpc(..., id?) |
id: str = "1" |
Rust
let client = MapradarClient::new("YOUR_API_KEY".to_string());| Method | Parameters | Returns |
|---|---|---|
geocode_async(address) |
address: &str |
Result<GeoLocation, GeoError> |
reverse_geocode_async(lat, lng) |
lat: f64, lng: f64 |
Result<GeoLocation, GeoError> |
search_nearby_async(...) |
lat, lng, service_type, radius_meters, max_results |
Result<Vec<NearbyService>, GeoError> |
fetch_intelligence_async(...) |
query, service_types, radius_km, max_results_per_type |
Result<LocationIntelligence, GeoError> |
| Method | Returns |
|---|---|
rpc_response(id, result) |
JsonRpcResponse |
Python
| Constructor | Description |
|---|---|
SearchQuery.from_address(address) |
Create query from address string |
SearchQuery.from_coordinates(lat, lng) |
Create query from coordinates |
Rust
| Constructor | Description |
|---|---|
SearchQuery::from_address(address: String) |
Create query from address string |
SearchQuery::from_coordinates(lat: f64, lng: f64) |
Create query from coordinates |
Python
| Field | Type |
|---|---|
address |
str |
latitude |
float |
longitude |
float |
city |
str | None |
state |
str | None |
country |
str |
| Field | Type |
|---|---|
name |
str |
service_type |
ServiceType |
latitude |
float |
longitude |
float |
distance_km |
float |
address |
str | None |
rating |
float | None |
place_id |
str | None |
phone_number |
str | None |
open_now |
bool | None |
| Field | Type |
|---|---|
location |
GeoLocation |
nearby_services |
list[NearbyService] |
total_services_found |
int |
| Field | Type |
|---|---|
jsonrpc |
str |
result |
str | None |
error |
JsonRpcError | None |
id |
str |
Rust
| Field | Type |
|---|---|
address |
String |
latitude |
f64 |
longitude |
f64 |
city |
Option<String> |
state |
Option<String> |
country |
String |
| Field | Type |
|---|---|
name |
String |
service_type |
ServiceType |
latitude |
f64 |
longitude |
f64 |
distance_km |
f64 |
address |
Option<String> |
rating |
Option<f32> |
place_id |
Option<String> |
phone_number |
Option<String> |
open_now |
Option<bool> |
| Field | Type |
|---|---|
location |
GeoLocation |
nearby_services |
Vec<NearbyService> |
total_services_found |
usize |
| Field | Type |
|---|---|
jsonrpc |
String |
result |
Option<String> |
error |
Option<JsonRpcError> |
id |
String |
| Variable | Description |
|---|---|
GOOGLE_MAPS_API_KEY |
Your Google Maps API key. Enable Geocoding API and Places API. |
What APIs do I need enabled?
Enable these in Google Cloud Console:
- Geocoding API
- Places API (New)
Is there rate limiting?
Mapradar does not rate limit. Your Google Maps API quota applies. Use the built-in cache to reduce calls.
Does caching persist across restarts?
No. Cache is in-memory only. It persists for the lifetime of your MapradarClient instance.