네이버지도 Static Map 사용에 관해

안녕하세요. 오늘도 고생이 많으신 선생님 여러분!

제미나이가 알려준 방식으로 지도를 저장하기 위한 코드가 안먹히는 것 같아 문의 드립니다.

에러메세지로 "네이버 Static Map API 호출 실패. Client ID/Secret을 확인하세요."가 뜨는데 이해가 안돼서요.

무엇이 문제일까요?

 

<?php
header('Content-Type: application/json');

// ⭐ 1. 네이버 Client ID 및 Secret 설정 (필수!)
define('NAVER_CLIENT_ID', 'YOUR_NAVER_CLIENT_ID'); 
define('NAVER_CLIENT_SECRET', 'YOUR_NAVER_CLIENT_SECRET'); 

// 2. POST 데이터 수신
$centerLat = $_POST['center_lat'] ?? null;
$centerLng = $_POST['center_lng'] ?? null;
$zoomLevel = $_POST['zoom_level'] ?? null;
$userLat   = $_POST['latitude'] ?? null;
$userLng   = $_POST['longitude'] ?? null;

if (!$centerLat || !$centerLng || !$zoomLevel) {
    echo json_encode(['success' => false, 'message' => '필수 지도 데이터가 누락되었습니다.']);
    exit;
}

// 3. Static Map API URL 조합
$mapSize = '640x360'; // 이미지 크기 설정
$marker = '';
$logMessage = '';

if ($userLat !== 'unavailable' && $userLng !== 'unavailable') {
    // 사용자 위치가 유효하면 마커 정보 추가
    // markers=type:flag,size:mid,label:현재위치|위도,경도
    $marker = "&markers=type:mid,label:M|{$userLng},{$userLat}";
    $logMessage = "Lat: {$userLat} / Lng: {$userLng}";
} else {
    $logMessage = "위치 정보 없음";
}

// 네이버 Static Map API URL (center: 경도, 위도 순서임에 주의!)
$apiUrl = "https://naveropenapi.apigw.ntruss.com/map-static/v2/raster" .
          "?w=" . explode('x', $mapSize)[0] .
          "&h=" . explode('x', $mapSize)[1] .
          "&center=" . $centerLng . "," . $centerLat . 
          "&level=" . $zoomLevel .
          $marker;

// 4. 이미지 파일 다운로드 및 저장 설정
$uploadDir = 'naver_map_captures/'; // 저장 디렉토리 변경 (쓰기 권한 필요)
if (!is_dir($uploadDir)) { mkdir($uploadDir, 0777, true); }

$filename = 'naver_static_' . time() . '_' . rand(1000, 9999) . '.png';
$filePath = $uploadDir . $filename;

// 5. cURL을 사용하여 이미지 다운로드 (Client ID를 헤더에 포함)
$ch = curl_init($apiUrl);

// ⭐ 네이버 API는 헤더를 통해 인증합니다.
$headers = array(
    'X-NCP-APIGW-API-KEY-ID: ' . NAVER_CLIENT_ID,
    'X-NCP-APIGW-API-KEY: ' . NAVER_CLIENT_SECRET // 시크릿 키를 사용하는 API 유형일 경우 사용
);

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // SSL 오류 방지

$imageData = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
curl_close($ch);

if ($httpCode !== 200 || $imageData === false) {
    echo json_encode([
        'success' => false, 
        'message' => '네이버 Static Map API 호출 실패. Client ID/Secret을 확인하세요.',
        'http_code' => $httpCode,
        'curl_error' => $curlError
    ]);
    exit;
}

// 6. 파일 저장 및 로그 기록 (생략)
if (file_put_contents($filePath, $imageData)) {
    echo json_encode([
        'success' => true, 
        'message' => '네이버 Static Map 이미지와 위치가 성공적으로 저장되었습니다.', 
        'filename' => $filename
    ]);
} else {
    echo json_encode(['success' => false, 'message' => '파일 저장 실패. 디렉토리 권한을 확인하세요.']);
}
?>

답변 1개

API 키 발급받아 넣으신건 맞죠?

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

그럼요. 여기에 공개하지 못하기에 그냥 놔둔 상황입니다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인
🐛 버그신고