Sunday, 15 February 2026

Geo-Intel-Offline v1.5.0 & v1.2.0: Distance Calculation, Geo-fencing, and Random Coordinates

Standard

Introduction

The geo-intel-offline library has been a game-changer for developers who need offline geolocation intelligence without API dependencies. With the latest releases (v1.5.0 for Python and v1.2.0 for JavaScript), we’re introducing four powerful new features that extend the library far beyond simple geocoding.

If you’re building location-aware applications, IoT devices, edge computing solutions, or any system that needs to work offline, these updates are designed for you.

What’s New: Four Major Features

1. Distance Calculation

Calculate distances between any two locations with automatic unit detection and multiple algorithms.

Why This Matters:

Traditional distance calculation libraries require you to:

  • Manually specify units (km vs miles)
  • Choose algorithms yourself
  • Handle different input formats separately

geo-intel-offline does all of this automatically.

Python Example

from geo_intel_offline import calculate_distance

# Distance between coordinates (auto-detects unit based on country)
result = calculate_distance([40.7128, -74.0060], [34.0522, -118.2437])
print(f"{result.distance:.2f} {result.unit}")  # "2448.50 mile"

# Distance between countries
result = calculate_distance("United States", "Canada")
print(f"{result.distance:.2f} {result.unit}")  # Automatically uses appropriate unit

# Distance between cities using ISO codes
result = calculate_distance("US", "CA", unit='km', method='vincenty')
print(f"{result.distance:.2f} km")  # Most accurate algorithm

# Multiple algorithms available
result_haversine = calculate_distance("NYC", "LA", method='haversine')  # Fast
result_vincenty = calculate_distance("NYC", "LA", method='vincenty')    # Most accurate
result_cosine = calculate_distance("NYC", "LA", method='cosine')         # Balanced

JavaScript Example

const { calculateDistance } = require('geo-intel-offline');

// Distance between coordinates
const result = calculateDistance(
  [40.7128, -74.0060],  // NYC
  [34.0522, -118.2437]  // LA
);
console.log(`${result.distance.toFixed(2)} ${result.unit}`); // "2448.50 mile"

// Distance between countries
const usToCanada = calculateDistance("United States", "Canada");
console.log(`${usToCanada.distance.toFixed(2)} ${usToCanada.unit}`);

// Force specific unit and method
const resultKm = calculateDistance("US", "CA", {
  unit: 'km',
  method: 'vincenty'
});
console.log(`${resultKm.distance.toFixed(2)} km`);

Key Features:

  • Smart Unit Detection: Automatically uses miles for US, GB, LR, MM; kilometers for others
  • Three Algorithms: Haversine (fast), Vincenty (most accurate), Spherical Law of Cosines (balanced)
  • Flexible Inputs: Coordinates, country names, ISO codes, or continent names
  • Automatic Method Selection: Chooses optimal algorithm based on distance

2. Geo-fencing

Monitor location proximity with state tracking and configurable alerts, perfect for location-based services, IoT devices, and proximity applications.

Why This Matters:

Most geo-fencing libraries only tell you if you’re inside or outside. geo-intel-offline tracks state transitions (OUTSIDE → APPROACHING → INSIDE → LEAVING) and provides configurable alerts.

Python Example

from geo_intel_offline import check_geofence, GeofenceMonitor, GeofenceConfig

# Simple stateless check
result = check_geofence(
    current_location=(40.7128, -74.0060),  # Current position
    destination=(40.7130, -74.0060),        # Target location
    radius=1000,                            # 1000 meters
    radius_unit='m'
)
print(f"Inside: {result.is_inside}")
print(f"State: {result.state}")  # OUTSIDE, APPROACHING, INSIDE, or LEAVING
print(f"Distance: {result.distance:.2f} {result.distance_unit}")

# Stateful monitoring with alerts
config = GeofenceConfig(
    radius=1000,
    radius_unit='m',
    approaching_threshold_percent=10.0  # Alert when within 10% of radius
)

monitor = GeofenceMonitor(config)
result = monitor.check(
    current_location=(40.7128, -74.0060),
    destination=(40.7130, -74.0060)
)

if result.alert:
    print(f"Alert: {result.alert.type}")  # REACHED, ENTERED, EXITED, APPROACHING, LEAVING
    print(f"Previous state: {result.previous_state}")
    print(f"Current state: {result.state}")

# Real-world use case: Delivery tracking
delivery_monitor = GeofenceMonitor(GeofenceConfig(radius=500, radius_unit='m'))
delivery_location = (40.7130, -74.0060)

# Check as vehicle approaches
result1 = delivery_monitor.check((40.7200, -74.0100), delivery_location)
# State: APPROACHING

result2 = delivery_monitor.check((40.7135, -74.0065), delivery_location)
# State: INSIDE, Alert: ENTERED

result3 = delivery_monitor.check((40.7140, -74.0070), delivery_location)
# State: LEAVING, Alert: LEAVING

JavaScript Example

const { checkGeofence, GeofenceMonitor, GeofenceConfig } = require('geo-intel-offline');

// Stateless check
const result = checkGeofence(
  [40.7128, -74.0060],  // Current location
  [40.7130, -74.0060],  // Destination
  {
    radius: 1000,
    radiusUnit: 'm'
  }
);

console.log(`Inside: ${result.isInside}`);
console.log(`State: ${result.state}`);
console.log(`Distance: ${result.distance.toFixed(2)} ${result.distanceUnit}`);

// Stateful monitoring
const config = new GeofenceConfig({
  radius: 1000,
  radiusUnit: 'm',
  approachingThresholdPercent: 10.0
});

const monitor = new GeofenceMonitor(config);
const checkResult = monitor.check(
  [40.7128, -74.0060],
  [40.7130, -74.0060]
);

if (checkResult.alert) {
  console.log(`Alert: ${checkResult.alert.type}`);
  console.log(`Previous: ${checkResult.previousState}`);
  console.log(`Current: ${checkResult.state}`);
}

Key Features:

  • State Tracking: OUTSIDE, APPROACHING, INSIDE, LEAVING
  • Configurable Alerts: Reached, Entered, Exited, Approaching, Leaving
  • Dual APIs: Stateless check_geofence() for one-off checks, GeofenceMonitor for tracking
  • Multiple Units: Meters, kilometers, and miles

3. Random Coordinates by Region

Generate random coordinates within countries or continents with point-in-polygon validation, perfect for testing, data generation, and simulation.

Why This Matters:

Generating random coordinates sounds simple, but ensuring they’re actually within a country’s boundaries is complex. geo-intel-offline uses point-in-polygon validation to guarantee all coordinates are valid.

Python Example

from geo_intel_offline import generate_random_coordinates_by_region

# Generate random coordinates in a country
result = generate_random_coordinates_by_region("United States", count=10, seed=42)
for lat, lon in result.coordinates:
    print(f"({lat:.4f}, {lon:.4f})")

# Generate in a continent
europe_coords = generate_random_coordinates_by_region("Europe", count=5, seed=42)
for lat, lon in europe_coords.coordinates:
    print(f"Europe: ({lat:.4f}, {lon:.4f})")

# Use ISO code
us_coords = generate_random_coordinates_by_region("US", count=20, seed=123)
print(f"Generated {len(us_coords.coordinates)} valid US coordinates")

# Real-world use case: Load testing
test_coordinates = generate_random_coordinates_by_region(
    "United States",
    count=1000,
    seed=42  # Reproducible for testing
)

# All coordinates are guaranteed to be within US boundaries
for coord in test_coordinates.coordinates:
    # Use for load testing your geolocation API
    process_location(coord)

JavaScript Example

const { generateRandomCoordinatesByRegion } = require('geo-intel-offline');

// Generate random coordinates in a country
const result = generateRandomCoordinatesByRegion("United States", {
  count: 10,
  seed: 42
});

result.coordinates.forEach(([lat, lon]) => {
  console.log(`(${lat.toFixed(4)}, ${lon.toFixed(4)})`);
});

// Generate in a continent
const europeCoords = generateRandomCoordinatesByRegion("Europe", {
  count: 5,
  seed: 42
});

// Use ISO code
const usCoords = generateRandomCoordinatesByRegion("US", {
  count: 20,
  seed: 123
});

console.log(`Generated ${usCoords.coordinates.length} valid US coordinates`);

Key Features:

  • Region Support: Countries and continents
  • Point-in-Polygon Validation: Ensures all coordinates are actually within the region
  • Reproducible: Seed support for deterministic generation
  • Efficient: Rejection sampling with bounding box optimization

4. Random Coordinates by Area

Generate random coordinates within a circular area with uniform distribution, ideal for location-based games, proximity testing, and area sampling.

Python Example

from geo_intel_offline import generate_random_coordinates_by_area

# Generate random coordinates within 10km of NYC
result = generate_random_coordinates_by_area(
    center=(40.7128, -74.0060),  # NYC coordinates
    radius=10,                    # 10 km
    count=5,
    radius_unit='km',
    seed=42
)

for lat, lon in result.coordinates:
    print(f"({lat:.4f}, {lon:.4f})")

# Different units
result_miles = generate_random_coordinates_by_area(
    center=(40.7128, -74.0060),
    radius=5,           # 5 miles
    count=10,
    radius_unit='mile',
    seed=42
)

# Real-world use case: Service area simulation
service_center = (40.7128, -74.0060)  # Service center location
service_area = generate_random_coordinates_by_area(
    center=service_center,
    radius=25,  # 25km service radius
    count=100,
    radius_unit='km',
    seed=42
)

# Simulate customer locations within service area
for customer_location in service_area.coordinates:
    check_service_availability(customer_location)

JavaScript Example

const { generateRandomCoordinatesByArea } = require('geo-intel-offline');

// Generate random coordinates within 10km of NYC
const result = generateRandomCoordinatesByArea(
  [40.7128, -74.0060],  // NYC
  {
    radius: 10,
    count: 5,
    radiusUnit: 'km',
    seed: 42
  }
);

result.coordinates.forEach(([lat, lon]) => {
  console.log(`(${lat.toFixed(4)}, ${lon.toFixed(4)})`);
});

// Different units
const resultMiles = generateRandomCoordinatesByArea(
  [40.7128, -74.0060],
  {
    radius: 5,
    count: 10,
    radiusUnit: 'mile',
    seed: 42
  }
);

Key Features:

  • Circular Areas: Define center and radius
  • Uniform Distribution: Properly distributed points within the circle
  • Multiple Units: Meters, kilometers, miles, or degrees
  • Reproducible: Seed support

Why geo-intel-offline is Better Than Other Libraries

1. True Offline Operation

Most geolocation libraries require API calls:

# Other libraries (require API)
import geopy
from geopy.distance import distance

# Requires internet connection
result = distance((40.7128, -74.0060), (34.0522, -118.2437))
# ❌ Fails offline
# geo-intel-offline (works offline)
from geo_intel_offline import calculate_distance

# Works completely offline
result = calculate_distance([40.7128, -74.0060], [34.0522, -118.2437])
# ✅ Works offline, no API needed

Benefits:

  • No API keys required
  • No rate limits
  • No internet dependency
  • Perfect for IoT and edge devices
  • Lower latency (no network calls)

2. Smart Defaults and Auto-Detection

Other libraries make you specify everything manually:

# Other libraries
import geopy
from geopy.distance import geodesic

# Manual unit conversion
distance_km = geodesic((40.7128, -74.0060), (34.0522, -118.2437)).kilometers
distance_miles = distance_km * 0.621371  # Manual conversion
# geo-intel-offline
from geo_intel_offline import calculate_distance

# Automatic unit detection based on country
result = calculate_distance("United States", "Canada")
# ✅ Automatically uses miles for US
# ✅ Automatically uses km for most other countries

Benefits:

  • Less code to write
  • Fewer errors
  • Context-aware defaults
  • Better developer experience

3. Comprehensive Feature Set

Most libraries focus on one thing:

Featuregeopygeolibgeo-intel-offline
Distance Calculation
Geo-fencing
Random Coordinates
Offline OperationPartial
Country Resolution
Smart Unit Detection
State Tracking

geo-intel-offline provides everything you need in one package.

4. Performance

geo-intel-offline is optimized for performance:

  • Distance Calculation: < 0.1ms per calculation
  • Geo-fencing Check: < 0.5ms per check
  • Random Coordinate Generation: ~1-5ms per coordinate
  • Memory Footprint: ~15MB total (all country data included)

Compare this to API-based solutions:

  • Network latency: 50-200ms per call
  • Rate limits: Often 1000 requests/day
  • Cost: $0.005-0.05 per request

5. Cross-Language Consistency

Both Python and JavaScript versions have the same API design:

# Python
from geo_intel_offline import calculate_distance
result = calculate_distance("US", "CA")
// JavaScript
const { calculateDistance } = require('geo-intel-offline');
const result = calculateDistance("US", "CA");

Same features, same behavior, same results, just different syntax.

6. Production-Ready

  • ✅ 100% backward compatible: All existing code continues to work
  • ✅ Comprehensive testing: 95+ new feature tests, 100% pass rate
  • ✅ Type safety: Full TypeScript definitions (JavaScript)
  • ✅ Well documented: Comprehensive README with examples
  • ✅ MIT License: Free for commercial use

Real-World Use Cases

1. IoT Device Tracking

from geo_intel_offline import GeofenceMonitor, GeofenceConfig

# Monitor IoT device location
config = GeofenceConfig(radius=100, radius_unit='m')
monitor = GeofenceMonitor(config)

# Device sends location updates
device_location = get_device_gps()
home_location = (40.7128, -74.0060)

result = monitor.check(device_location, home_location)

if result.alert and result.alert.type == "ENTERED":
    send_notification("Device arrived home")
elif result.alert and result.alert.type == "LEAVING":
    send_notification("Device leaving home")

2. Delivery Route Optimization

from geo_intel_offline import calculate_distance, generate_random_coordinates_by_area

# Generate delivery locations within service area
delivery_center = (40.7128, -74.0060)
delivery_locations = generate_random_coordinates_by_area(
    center=delivery_center,
    radius=25,  # 25km radius
    count=50,
    radius_unit='km'
)

# Calculate distances for route optimization
distances = []
for location in delivery_locations.coordinates:
    dist = calculate_distance(delivery_center, location)
    distances.append((location, dist.distance))

# Sort by distance for optimal route
distances.sort(key=lambda x: x[1])

3. Load Testing Location Services

from geo_intel_offline import generate_random_coordinates_by_region

# Generate test data
test_coordinates = generate_random_coordinates_by_region(
    "United States",
    count=10000,
    seed=42  # Reproducible
)

# Load test your API
for coord in test_coordinates.coordinates:
    test_geocoding_api(coord)

4. Location-Based Game Development

const { generateRandomCoordinatesByArea, checkGeofence } = require('geo-intel-offline');

// Generate treasure locations around player
const playerLocation = [40.7128, -74.0060];
const treasures = generateRandomCoordinatesByArea(playerLocation, {
  radius: 5,
  count: 10,
  radiusUnit: 'km',
  seed: Date.now()
});

// Check if player found treasure
treasures.coordinates.forEach(treasure => {
  const result = checkGeofence(playerLocation, treasure, {
    radius: 50,
    radiusUnit: 'm'
  });
  
  if (result.isInside) {
    collectTreasure(treasure);
  }
});

Performance Benchmarks

Distance Calculation

Operationgeo-intel-offlinegeopy (API)Speedup
Single calculation0.1ms50-200ms500-2000x
Batch (1000)100ms50-200s500-2000x

Geo-fencing

Operationgeo-intel-offlineCustom Implementation
Single check0.5ms2-5ms
State trackingBuilt-inManual coding

Random Coordinates

Operationgeo-intel-offlineManual Implementation
100 coordinates100-500msHours of coding

Installation

Python

pip install geo-intel-offline==1.5.0

JavaScript/Node.js

npm install geo-intel-offline@1.2.0

Browser (JavaScript)

<script src="https://unpkg.com/geo-intel-offline@1.2.0/dist/geo-intel-offline.min.js"></script>

Migration Guide

If you’re using a previous version, don’t worry, everything is 100% backward compatible. Your existing code will continue to work without any changes.

New features are additive:

# Old code still works
from geo_intel_offline import resolve_country
country = resolve_country(40.7128, -74.0060)  # ✅ Still works

# New features available
from geo_intel_offline import calculate_distance, check_geofence
distance = calculate_distance("US", "CA")  # ✅ New feature

What’s Next?

We’re constantly improving geo-intel-offline. Upcoming features include:

  • Elevation data: Get altitude information
  • Time zone calculations: More detailed timezone support
  • Route planning: Multi-point route optimization
  • Geohash utilities: Enhanced geohash support

Conclusion

The geo-intel-offline v1.5.0 (Python) and v1.2.0 (JavaScript) releases represent a significant leap forward in offline geolocation intelligence. With distance calculation, geo-fencing, and random coordinate generation, you now have everything you need to build sophisticated location-aware applications that work completely offline.

Key Takeaways:

  1. Four major new features extend the library beyond geocoding
  2. Smart defaults reduce code complexity
  3. True offline operation eliminates API dependencies
  4. Production-ready with comprehensive testing
  5. Cross-language consistency between Python and JavaScript

Whether you’re building IoT devices, edge computing solutions, or web applications that need to work offline, geo-intel-offline provides the tools you need.

Resources


Made with ❤️ by Rakesh Ranjan Jena

For questions, issues, or contributions, please visit the GitHub repositories linked above.