validate([ 'keyword' => ['required', 'string', 'max:120'], 'region' => ['nullable', 'string', 'max:80'], ]); $key = env('TENCENT_MAP_SERVER_KEY'); abort_unless($key, 500, '未配置腾讯地图服务端Key'); $resp = Http::get('https://apis.map.qq.com/ws/place/v1/suggestion', [ 'keyword' => $data['keyword'], 'region' => $data['region'] ?? '苏州', 'region_fix' => 1, 'key' => $key, ])->json(); if (($resp['status'] ?? -1) !== 0) { return response()->json(['message' => $resp['message'] ?? '地图搜索失败'], 422); } $rows = collect($resp['data'] ?? [])->map(function ($item) { return [ 'title' => $item['title'] ?? '', 'address' => $item['address'] ?? '', 'province' => $item['province'] ?? '', 'city' => $item['city'] ?? '', 'district' => $item['district'] ?? '', 'lat' => data_get($item, 'location.lat'), 'lng' => data_get($item, 'location.lng'), ]; })->values(); return response()->json($rows); } public function reverseGeocode(Request $request): JsonResponse { $data = $request->validate([ 'lat' => ['required', 'numeric'], 'lng' => ['required', 'numeric'], ]); $key = env('TENCENT_MAP_SERVER_KEY'); abort_unless($key, 500, '未配置腾讯地图服务端Key'); $resp = Http::get('https://apis.map.qq.com/ws/geocoder/v1/', [ 'location' => $data['lat'] . ',' . $data['lng'], 'get_poi' => 0, 'key' => $key, ])->json(); if (($resp['status'] ?? -1) !== 0) { return response()->json(['message' => $resp['message'] ?? '逆地理编码失败'], 422); } $result = $resp['result'] ?? []; return response()->json([ 'address' => $result['address'] ?? '', 'province' => data_get($result, 'address_component.province'), 'city' => data_get($result, 'address_component.city'), 'district' => data_get($result, 'address_component.district'), ]); } }