extractCoordinates static method

Map<String, double>? extractCoordinates(
  1. String url
)

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;
}