config('nominatim.user_agent'), ])->timeout(5)->get($baseUrl . '/search', [ 'q' => $query, 'format' => 'json', 'addressdetails' => 1, 'namedetails' => 1, 'limit' => 5, 'countrycodes' => 'de,at,ch', 'accept-language' => 'de', ]); // Fehlerhafte Responses nicht cachen (V20) if ($response->failed()) { return []; } $results = collect($response->json())->map(function ($item) { $addr = $item['address'] ?? []; // Structured address from components $street = trim(($addr['road'] ?? '') . ' ' . ($addr['house_number'] ?? '')); $postcode = $addr['postcode'] ?? ''; $city = $addr['city'] ?? $addr['town'] ?? $addr['village'] ?? $addr['municipality'] ?? ''; $name = $item['namedetails']['name'] ?? ''; // Build formatted address line $parts = array_filter([$street, implode(' ', array_filter([$postcode, $city]))]); $formatted = implode(', ', $parts); return [ 'display_name' => $item['display_name'], 'formatted_address' => $formatted ?: $item['display_name'], 'name' => $name, 'street' => $street, 'postcode' => $postcode, 'city' => $city, 'lat' => $item['lat'], 'lon' => $item['lon'], 'type' => $item['type'] ?? '', ]; })->toArray(); Cache::put($cacheKey, $results, 86400); return $results; } }