extractCoordinates static method
Enhanced coordinate extraction with comprehensive pattern matching
Implementation
static Map<String, double>? extractCoordinates(String url) {
print('Extracting coordinates from: $url');
final List<RegExp> patterns = <RegExp>[
// Pattern 1: Standard embedded coordinates (!3d and !4d format)
RegExp(r'!3d(-?\d+\.?\d*)!4d(-?\d+\.?\d*)'),
// Pattern 2: Basic query coordinates (q=lat,lng) - FIXED WITH + HANDLING
RegExp(r'[?&]q=(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 3: View mode coordinates (@lat,lng,zoom)
RegExp(r'@(-?\d+\.?\d*),(-?\d+\.?\d*),'),
// Pattern 4: Legacy lat/lng parameters (ll=lat,lng) - FIXED WITH + HANDLING
RegExp(r'[?&]ll=(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 5: Center coordinates (center=lat,lng) - FIXED WITH + HANDLING
RegExp(r'[?&]center=(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 6: Destination coordinates for directions - FIXED WITH + HANDLING
RegExp(r'[?&]destination=(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 7: Origin coordinates for directions - FIXED WITH + HANDLING
RegExp(r'[?&]origin=(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 8: Street View coordinates (cbll=lat,lng) - FIXED WITH + HANDLING
RegExp(r'[?&]cbll=(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 9: Embed coordinates (pb parameter)
RegExp(r'[?&]pb=.*?2d(-?\d+\.?\d*).*?3d(-?\d+\.?\d*)'),
// Pattern 10: Data parameter coordinates - FIXED WITH + HANDLING
RegExp(r'[?&]data=.*?(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 11: Alternative embed format - FIXED WITH + HANDLING
RegExp(r'embed.*?(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 12: URL fragment coordinates (#lat,lng) - FIXED WITH + HANDLING
RegExp(r'#(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 13: Place coordinates in URL path
RegExp(r'/place/[^/]*/@(-?\d+\.?\d*),(-?\d+\.?\d*)'),
// Pattern 14: Search coordinates - FIXED PATTERN FOR YOUR URL FORMAT
RegExp(r'/search/(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 15: Mobile coordinates format - FIXED WITH + HANDLING
RegExp(r'coordinates=(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 16: Alternative mobile format - FIXED WITH + HANDLING
RegExp(r'loc:(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 17: Plus code coordinates extraction (rough approximation)
RegExp(r'plus\.codes/(-?\d+\.?\d*)\+(-?\d+\.?\d*)'),
// Pattern 18: International domain coordinates - FIXED WITH + HANDLING
RegExp(r'google\.[a-z]{2,3}/maps.*?(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 19: Alternative view coordinates - FIXED WITH + HANDLING
RegExp(r'[?&]z=\d+.*?(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 20: Satellite view coordinates - FIXED WITH + HANDLING
RegExp(r'[?&]t=k.*?(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
// Pattern 21: Direct coordinates in maps/search path (NEW PATTERN FOR YOUR CASE)
RegExp(r'/maps/search/(-?\d+\.?\d*),\+?(-?\d+\.?\d*)'),
];
for (int i = 0; i < patterns.length; i++) {
final RegExp pattern = patterns[i];
final RegExpMatch? match = pattern.firstMatch(url);
if (match != null && match.groupCount >= 2) {
try {
final double lat = double.parse(match.group(1)!);
final double lng = double.parse(match.group(2)!);
// Validate coordinates are within valid ranges
if (lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180) {
print(
'Found coordinates using pattern ${i + 1}: lat=$lat, lng=$lng',
);
return <String, double>{'latitude': lat, 'longitude': lng};
}
} catch (e) {
print('Pattern ${i + 1} matched but failed to parse: $e');
continue; // Try next pattern
}
}
}
print('No coordinates found in URL');
return null;
}