Troubleshooting
Common issues and their solutions.
Installation Issues
Module Not Found
Problem: ImportError: No module named 'rapidgeo'
Solution:
pip install rapidgeo
If you’re using a virtual environment, make sure it’s activated:
source venv/bin/activate # Linux/Mac
# or
venv\Scripts\activate # Windows
pip install rapidgeo
NumPy Features Not Available
Problem: ImportError when trying to import numpy submodule
Solutions:
Install with NumPy support:
pip install rapidgeo[numpy]
Check if NumPy features are available:
try:
from rapidgeo.distance import numpy as rgeo_numpy
print("NumPy support available")
except ImportError:
print("NumPy support not available - install with: pip install rapidgeo[numpy]")
Coordinate Problems
Wrong Coordinate Order
Problem: Results don’t match expected distances or locations
Cause: Using (lat, lng) instead of (lng, lat)
Solution:
# Wrong - latitude first
point = LngLat(37.7749, -122.4194)
# Correct - longitude first
point = LngLat(-122.4194, 37.7749)
Check: San Francisco should be approximately LngLat(-122.42, 37.77), not LngLat(37.77, -122.42).
Invalid Coordinates
Problem: ValueError or unexpected results
Common issues:
Coordinates outside valid ranges (lng: -180 to 180, lat: -90 to 90)
Using None or NaN values
Mixing coordinate systems
Solution:
def validate_coordinate(lng, lat):
"""Validate coordinate values."""
if not (-180 <= lng <= 180):
raise ValueError(f"Longitude {lng} out of range [-180, 180]")
if not (-90 <= lat <= 90):
raise ValueError(f"Latitude {lat} out of range [-90, 90]")
return LngLat(lng, lat)
# Use validation for untrusted input
point = validate_coordinate(-122.4194, 37.7749)
Distance Calculation Issues
Unexpected Zero Distances
Problem: Distance calculations return 0 when points are different
Causes:
Identical coordinates: Points are actually the same
Precision issues: Coordinates differ by less than floating-point precision
Solution:
# Check if points are truly identical
if point1.lng == point2.lng and point1.lat == point2.lat:
print("Points are identical")
else:
distance = haversine(point1, point2)
if distance < 0.001: # Less than 1mm
print("Points are effectively identical")
Very Large Distances
Problem: Distance calculations return unexpectedly large values
Causes:
Wrong coordinate order: Using (lat, lng) instead of (lng, lat)
Decimal degree confusion: Using degrees-minutes-seconds instead of decimal degrees
Wrong coordinate system: Mixing projected coordinates with geographic
Solution:
# Sanity check distances
distance = haversine(point1, point2)
if distance > 20_000_000: # More than half Earth's circumference
print("Warning: Distance is very large - check coordinate order")
elif distance > 1_000_000: # More than 1000km
print("Large distance - verify coordinates are correct")
Vincenty Algorithm Failures
Problem: ValueError from Vincenty distance calculation
Cause: Algorithm fails to converge (rare, usually with antipodal points)
Solution:
from rapidgeo.distance.geo import haversine, vincenty_distance
def safe_vincenty_distance(point1, point2):
"""Calculate Vincenty distance with fallback to Haversine."""
try:
return vincenty_distance(point1, point2)
except ValueError:
# Fallback to Haversine for problematic cases
return haversine(point1, point2)
distance = safe_vincenty_distance(point1, point2)
Polyline Issues
Encoding/Decoding Mismatches
Problem: Decoded coordinates don’t match original coordinates
Cause: Different precision levels used for encoding and decoding
Solution:
# Always use same precision for encode/decode
precision = 5
encoded = encode(points, precision=precision)
decoded = decode(encoded, precision=precision)
Note: Some rounding is expected due to polyline compression. Higher precision reduces but doesn’t eliminate rounding.
Empty Polyline Strings
Problem: Encoding returns empty string or very short string
Causes:
Empty input: No coordinates provided
Single point: Only one coordinate (polylines need at least 2 points for meaningful encoding)
Identical points: All coordinates are the same
Solution:
def safe_encode(points, precision=5):
"""Safely encode points to polyline."""
if len(points) < 2:
raise ValueError(f"Need at least 2 points, got {len(points)}")
# Remove consecutive duplicates
cleaned = [points[0]]
for point in points[1:]:
if point != cleaned[-1]:
cleaned.append(point)
if len(cleaned) < 2:
raise ValueError("All points are identical")
return encode(cleaned, precision=precision)
Memory and Performance Issues
Out of Memory Errors
Problem: MemoryError when processing large datasets
Solutions:
Process in chunks:
def process_large_dataset(all_tracks, chunk_size=1000):
"""Process tracks in chunks to manage memory."""
results = []
for i in range(0, len(all_tracks), chunk_size):
chunk = all_tracks[i:i + chunk_size]
chunk_results = encode_batch(chunk, precision=5)
results.extend(chunk_results)
return results
Use generators for streaming:
def process_tracks_streaming(track_iterator):
"""Stream process tracks without loading all into memory."""
for track in track_iterator:
if len(track) >= 2: # Skip invalid tracks
yield encode(track, precision=5)
Similarity Algorithm Size Limits
Problem: ValueError: curve size limited when comparing large tracks
Cause: Built-in limits to prevent memory exhaustion
Solutions:
Simplify tracks before comparison:
from rapidgeo.simplify import douglas_peucker
# Simplify large tracks before similarity calculation
simplified_track1 = douglas_peucker(large_track1, tolerance_m=10.0)
simplified_track2 = douglas_peucker(large_track2, tolerance_m=10.0)
similarity = discrete_frechet(simplified_track1, simplified_track2)
Sample tracks:
def sample_track(track, max_points=5000):
"""Sample track to reduce point count."""
if len(track) <= max_points:
return track
step = len(track) // max_points
return track[::step]
sampled1 = sample_track(track1)
sampled2 = sample_track(track2)
Data Type Issues
Wrong Input Types
Problem: TypeError when calling functions
Causes:
Passing tuples instead of LngLat objects
Using wrong data structures
Solution:
# Convert various input types to LngLat
def to_lnglat(coord):
"""Convert various coordinate formats to LngLat."""
if isinstance(coord, LngLat):
return coord
elif isinstance(coord, (list, tuple)) and len(coord) == 2:
return LngLat(coord[0], coord[1])
else:
raise ValueError(f"Cannot convert {type(coord)} to LngLat")
# Convert list of tuples
coords_as_tuples = [(-122.4, 37.7), (-122.3, 37.8)]
coords_as_lnglat = [to_lnglat(coord) for coord in coords_as_tuples]
Getting Help
When reporting issues:
Include your code: Show the specific function calls causing problems
Provide sample data: Include coordinates that reproduce the issue
Include error messages: Copy the full traceback
Specify versions: Include rapidgeo version and Python version
Check versions:
import rapidgeo
import sys
print(f"rapidgeo version: {rapidgeo.__version__}")
print(f"Python version: {sys.version}")
Minimal example:
from rapidgeo import LngLat
from rapidgeo.distance.geo import haversine
# This causes the problem
point1 = LngLat(-122.4194, 37.7749)
point2 = LngLat(-74.0060, 40.7128)
distance = haversine(point1, point2)
print(f"Distance: {distance}") # What went wrong here?