본문 바로가기
조그만 기술로 세상을 이롭게/고속도로어때

ITS Open API 종류 및 활용 그리고 C# 예제

by eplus 2026. 5. 12.

ITS 국가교통정보센터
국토교통부의 국가 교통정보 통합 플랫폼입니다.
교통지도, CCTV, 돌발, 통계, 오픈데이터를
한곳에서 제공합니다.

주요 역할

  • 전국 도로 교통상황 통합 제공
  • CCTV/돌발/소통정보 제공
  • 민간 개발용 Open API 제공
  • 표준노드링크 기준 데이터 제공

Open API 종류

  • 교통소통정보
  • 돌발상황정보
  • CCTV 화상자료
  • 교통예측정보
  • 차량검지정보
  • 도로전광표지(VMS)
  • 주의운전구간 정보
  • 가변형 속도제한표지(VSL)
  • 취약구간정보
  • 표준노드링크
  • 위험물질 운송차량 사고정보
  • 재난상황정보

활용 방법

  • 모바일 교통정보 앱
  • 현재 위치 기반 CCTV 조회 앱
  • 관제 대시보드
  • 물류/운송 ETA 분석
  • 사고/재난 알림 서비스
  • AI 영상분석 연계 시스템

실무적으로 중요한 조합

  • 소통정보 + 돌발상황 + CCTV
    → 어디가 막히는지, 왜 막히는지, 영상 상태까지 확인
  • 차량검지 + 표준노드링크
    → 교통량/속도 분석
  • 재난 + VMS/VSL
    → 위험구간 경고/운전자 안내

개발 관점 핵심

  • GPS 위치 취득
  • Open API 호출
  • JSON 파싱
  • 거리 계산
  • 지도/그리드/UI 표시
  • CCTV 영상 또는 URL 연계
  • 예외처리와 권한 처리

한 줄 정리
ITS 국가교통정보센터는
교통소통, 돌발, CCTV, 재난 등 도로 정보를
Open API로 제공하는 국가 교통정보 허브입니다

---------------------------------------------------------------------

ITS 국가교통정보센터는
국토교통부의 국가 교통정보 허브입니다.
전국 도로의 소통, 돌발, CCTV, 재난, 통계,
표준노드링크 데이터를 통합 제공합니다.

주요 Open API는
교통소통, 돌발상황, CCTV, 교통예측,
차량검지, VMS, VSL, 취약구간,
주의운전구간, 재난상황, 표준노드링크
입니다.

활용은

  • 교통정보 앱
  • CCTV 조회 앱
  • 관제 대시보드
  • 물류 ETA 분석
  • 사고/재난 알림 서비스
    에 적합합니다.

실무 핵심은
GPS + Open API + JSON 파싱 + 거리계산 + UI표시
구조로 개발하는 것입니다.
특히 소통정보 + 돌발 + CCTV 조합이
가장 활용도가 높습니다.

한 줄로 하면
ITS 국가교통정보센터는 교통정보를 Open API로
제공하는 국가 통합 플랫폼
입니다.

 

--------------------------------------------------------------------------

 

ITS 국가교통정보센터 오픈데이터는 REST 방식으로 호출하며, 오픈데이터 소개 페이지에는 trafficInfo 예시 URL과 XML 응답 구조가 안내되어 있고, 제공 데이터로 교통소통정보, 돌발상황정보, CCTV 화상자료, 교통예측정보, 차량검지정보, VMS, VSL, 재난상황정보 등이 나와 있습니다.

1. C# 기본 호출 구조

핵심은 이 4단계입니다.

  • HttpClient로 API 호출
  • XML 또는 JSON 수신
  • 파싱
  • 모델 객체로 변환

공통 모델 예시

 
public class ItsCctvInfo
{
    public string CctvName { get; set; } = "";
    public string CctvUrl  { get; set; } = "";
    public double CoordX   { get; set; }
    public double CoordY   { get; set; }
}
 

2. CCTV 조회 C# 예시

이 예시는
현재 위치 기준 범위 내 CCTV를 조회하는 형태입니다.

 
using System.Globalization;
using System.Net.Http;
using System.Text.Json;

public class ItsApiService
{
    private readonly HttpClient _http = new HttpClient
    {
        Timeout = TimeSpan.FromSeconds(15)
    };

    private const string ApiKey = "여기에_발급받은_APIKEY";

    public async Task<List<ItsCctvInfo>> GetCctvAsync(
        double lat, double lng, double range = 1.0)
    {
        string url =
            "https://openapi.its.go.kr:9443/cctvInfo?" +
            $"apiKey={ApiKey}" +
            "&type=ex" +
            "&cctvType=2" +
            $"&minX={(lng - range).ToString(CultureInfo.InvariantCulture)}" +
            $"&maxX={(lng + range).ToString(CultureInfo.InvariantCulture)}" +
            $"&minY={(lat - range).ToString(CultureInfo.InvariantCulture)}" +
            $"&maxY={(lat + range).ToString(CultureInfo.InvariantCulture)}" +
            "&getType=json";

        string json = await _http.GetStringAsync(url);

        using JsonDocument doc = JsonDocument.Parse(json);

        var list = new List<ItsCctvInfo>();

        if (!doc.RootElement.TryGetProperty("response", out var response))
            return list;

        if (!response.TryGetProperty("data", out var data) ||
            data.ValueKind != JsonValueKind.Array)
            return list;

        foreach (var item in data.EnumerateArray())
        {
            string name = item.TryGetProperty("cctvname", out var n)
                ? n.ToString()
                : "";

            string cctvUrl = item.TryGetProperty("cctvurl", out var u)
                ? u.ToString()
                : "";

            double x = item.TryGetProperty("coordx", out var px) && px.ValueKind == JsonValueKind.Number
                ? px.GetDouble()
                : double.TryParse(px.ToString(), out var dx) ? dx : 0;

            double y = item.TryGetProperty("coordy", out var py) && py.ValueKind == JsonValueKind.Number
                ? py.GetDouble()
                : double.TryParse(py.ToString(), out var dy) ? dy : 0;

            if (string.IsNullOrWhiteSpace(cctvUrl))
                continue;

            list.Add(new ItsCctvInfo
            {
                CctvName = name,
                CctvUrl = cctvUrl,
                CoordX = x,
                CoordY = y
            });
        }

        return list;
    }
}
 

3. 가까운 순 정렬 예시

 
public static double GetDistanceKm(double lat1, double lon1, double lat2, double lon2)
{
    const double R = 6371.0;

    double dLat = (lat2 - lat1) * Math.PI / 180.0;
    double dLon = (lon2 - lon1) * Math.PI / 180.0;

    double a =
        Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
        Math.Cos(lat1 * Math.PI / 180.0) *
        Math.Cos(lat2 * Math.PI / 180.0) *
        Math.Sin(dLon / 2) * Math.Sin(dLon / 2);

    double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
    return R * c;
}
 

사용 예:

 
var service = new ItsApiService();
var list = await service.GetCctvAsync(35.286526, 128.604832);

var nearest = list
    .OrderBy(x => GetDistanceKm(35.286526, 128.604832, x.CoordY, x.CoordX))
    .Take(20)
    .ToList();
 

4. 교통소통정보 C# 예시

공식 페이지는 trafficInfo 예시 URL과 XML 응답 구조를 안내합니다. 응답에는 roadName, linkId, speed, travelTime, createdDate 같은 항목이 포함됩니다.

모델

 
public class ItsTrafficInfo
{
    public string RoadName { get; set; } = "";
    public string LinkId { get; set; } = "";
    public int Speed { get; set; }
    public double TravelTime { get; set; }
    public string CreatedDate { get; set; } = "";
}
 

XML 파싱 예시

 
using System.Xml.Linq;
using System.Globalization;

public async Task<List<ItsTrafficInfo>> GetTrafficInfoAsync(
    double minX, double maxX, double minY, double maxY)
{
    string url =
        "https://openapi.its.go.kr/trafficInfo?" +
        $"apiKey={ApiKey}" +
        "&type=all" +
        $"&minX={minX.ToString(CultureInfo.InvariantCulture)}" +
        $"&maxX={maxX.ToString(CultureInfo.InvariantCulture)}" +
        $"&minY={minY.ToString(CultureInfo.InvariantCulture)}" +
        $"&maxY={maxY.ToString(CultureInfo.InvariantCulture)}" +
        "&getType=xml";

    string xml = await _http.GetStringAsync(url);
    var doc = XDocument.Parse(xml);

    var list = doc.Descendants("item")
        .Select(x => new ItsTrafficInfo
        {
            RoadName = (string?)x.Element("roadName") ?? "",
            LinkId = (string?)x.Element("linkId") ?? "",
            Speed = int.TryParse((string?)x.Element("speed"), out var s) ? s : 0,
            TravelTime = double.TryParse((string?)x.Element("travelTime"), out var t) ? t : 0,
            CreatedDate = (string?)x.Element("createdDate") ?? ""
        })
        .ToList();

    return list;
}
 

5. MAUI에서 쓰는 흐름

고속도로어때 같은 앱 구조는 보통 이렇습니다.

서비스 호출

 
private readonly ItsApiService _service = new();
 

현재 위치 기반 조회

 
double lat = 35.286526;
double lng = 128.604832;

var list = await _service.GetCctvAsync(lat, lng);

var nearest = list
    .OrderBy(x => GetDistanceKm(lat, lng, x.CoordY, x.CoordX))
    .Take(20)
    .ToList();

gridCctv.ItemsSource = nearest;
 

선택 시 WebView 표시

 
private void ShowCctv(string url)
{
    if (string.IsNullOrWhiteSpace(url))
        return;

    webView.Source = new UrlWebViewSource
    {
        Url = url
    };
}
 

6. 실무에서 꼭 넣어야 할 처리

타임아웃

 
_http.Timeout = TimeSpan.FromSeconds(15);
 

예외 처리

 
try
{
    var list = await _service.GetCctvAsync(lat, lng);
}
catch (HttpRequestException ex)
{
    Console.WriteLine("통신 오류: " + ex.Message);
}
catch (TaskCanceledException)
{
    Console.WriteLine("요청 시간 초과");
}
catch (Exception ex)
{
    Console.WriteLine("기타 오류: " + ex.Message);
}
 

숫자/문자 혼합 JSON 대응

ITS 응답은 값이 숫자로 올 때도 있고 문자처럼 올 때도 있어
GetDouble()와 ToString() 둘 다 대비하는 것이 안전합니다.


7. 추천 구조

실무적으로는 이렇게 나누면 좋습니다.

  • Models/ItsCctvInfo.cs
  • Models/ItsTrafficInfo.cs
  • Services/ItsApiService.cs
  • MainPage.xaml.cs

  • 모델: 데이터 구조
  • 서비스: API 호출
  • 화면: 바인딩과 표시

로 분리하면 유지보수가 쉽습니다.


8. 한 줄 요약

C#에서는
HttpClient + JSON/XML 파싱 + 거리계산 + MAUI UI 바인딩
구조로 ITS Open API를 쉽게 붙일 수 있습니다.

728x90
반응형