다음을 통해 공유


자습서: Microsoft Fabric Notebook에서 도로 맞춤을 사용하여 여정 데이터 분석

Snap to Roads는 경로를 따라 수집된 GPS 지점 집합을 처리하고 차량이 이동했을 가능성이 가장 큰 도로에 스냅하는 Azure Maps 서비스입니다. 이 기능은 수집된 GPS 데이터가 약간 꺼져 있더라도 차량이 오는 정확한 경로를 결정하는 데 유용합니다.

이 자습서에서는 신호 손실로 인해 데이터가 부정확하거나 불완전한 경우에도 Microsoft Fabric과 함께 Azure Maps Snap to Roads API를 사용하여 자산 이동에서 GPS 데이터를 분석하는 방법을 설명합니다. Microsoft Fabric Notebook에서 Azure Maps Snap to Roads API를 호출하여 GPS 지점을 가장 가까운 도로로 스냅하고, 보간된 데이터 요소를 사용하여 누락된 지점을 채우고, 도로 이름 및 속도 제한과 같은 추가 특성으로 향상하는 방법을 안내합니다.

이 자습서에서는 다음을 수행합니다.

필수 조건

참고 항목

Azure Maps의 인증에 대한 자세한 내용은 Azure Maps의 인증 관리를 참조하세요.

Microsoft Fabric Notebook 및 Lakehouse 만들기

다음 단계에 따라 Microsoft Fabric Notebook을 만듭니다.

  1. 내 작업 영역으로 이동하여 새 항목을 선택합니다.

    새 항목 단추가 강조 표시된 Microsoft Fabric 내 작업 영역 페이지의 스크린샷

  2. 새 항목 화면이 나타나면 아래로 스크롤하여 전자 필기장을 선택합니다.

    Microsoft Fabric의 새 항목 화면에서 Notebook 옵션을 보여 주는 스크린샷

  3. Notebook 탐색기 화면에서 Lakehouses 화살표> 선택합니다.

    선택한 레이크하우스 화살표를 보여 주는 스크린샷.

  4. 추가 단추를 선택합니다.

    레이크하우스 추가 단추를 보여 주는 스크린샷.

  5. 레이크하우스 추가 대화 상자에서 새 레이크하우스선택한 다음 추가 단추를 선택합니다.

  6. 새 레이크하우스 대화 상자에서 이름 "Azure_Maps_Data"을 입력한 다음 만들기 단추를 선택합니다.

레이크하우스에 데이터 파일 추가

도로 스냅은 GPS 지점 데이터(위도, lon)를 사용하고 지도의 도로에 스냅된 경로를 형성하는 개체 목록을 반환합니다. 필요한 GPS 데이터가 포함된 데이터 파일을 레이크하우스에 파일로 추가하고 Notebook의 Python 코드에서 참조할 수 있습니다.

데이터 파일 다운로드

GitHub에서 로컬 스토리지 디바이스로 샘플 데이터(mockData_20240919.csv)를 다운로드하여 다음 섹션에서 lakehouse에 업로드합니다. 이 파일에는 각 좌표가 유효한 도로를 가리키도록 도로 맞춤 서비스가 필요에 따라 수정하는 GPS 좌표 배열이 포함되어 있습니다.

  1. GitHub에서 파일 mockData_20240919.csv 엽니다.

  2. 화면의 오른쪽 위 모서리에서 원시 파일 다운로드 단추를 선택하고 파일을 로컬로 저장합니다.

    GitHub 리포지토리에서 mockData_20240919.csv 데이터 파일을 다운로드하는 방법을 보여 주는 스크린샷

Lakehouse에 데이터 파일 업로드

다음 단계에서는 Lakehouse에 데이터 원본을 추가하는 방법을 설명합니다.

  1. 레이크하우스의 파일 폴더에서 파일 업로드를 > 선택합니다.

    파일 업로드 메뉴 옵션을 보여 주는 스크린샷

  2. 폴더 아이콘을 선택하여 파일 열기 대화 상자를 표시합니다. 이전 섹션에서 다운로드한 mockData_20240919.csv 파일을 선택한 다음 열기 단추를 선택합니다. 파일 열기 대화 상자가 닫히면 파일 업로드 컨트롤에 올바른 파일 이름이 나타나면 업로드 단추를 선택하여 파일을 lakehouse에 업로드합니다.

    파일 업로드 패널을 보여 주는 스크린샷

Notebook에 코드 추가

도로 맞춤 시나리오를 수행하려면 Notebook에 4개의 코드 셀을 추가하고 실행해야 합니다. 다음 섹션에서는 이 단계를 안내합니다.

패키지 설치

먼저 필요한 패키지를 로드해야 합니다.

!pip install geopandas
!pip install geojson

Notebook의 첫 번째 셀에 pip install 문을 입력한 다음 실행 화살표선택하여 문을 실행합니다.

Notebook 셀의 설치 패키지 코드를 보여 주는 스크린샷.

데이터 로드

다음으로, 이전에 레이크하우스에 업로드한 샘플 데이터를 로드합니다.

  1. 패키지를 설치하는 데 사용되는 셀 바로 아래에 포인터를 가져다 줍니다. 코드 또는 markdown을 추가하는 옵션이 나타납니다. 코드를 선택하여 Notebook에 다른 코드 셀을 추가합니다.

    Notebook의 코드 추가 링크를 보여 주는 스크린샷

  2. 새 셀이 만들어지면 다음 코드를 추가합니다.

    import geopandas as gpd
    import pandas as pd
    
    lakehouseFilePath = "/lakehouse/default/Files/"
    
    mockdata_df = gpd.read_file(lakehouseFilePath + "mockData_20240919.csv")
    mockdata_df = gpd.GeoDataFrame(
        mockdata_df, geometry=gpd.points_from_xy(mockdata_df.longitude, mockdata_df.latitude), crs="EPSG:4326"
    )
    
    mockdata_df.head()
    
    mockdata_df.tripID.unique()
    
  3. 실행 화살표를 선택하여 코드를 실행합니다. 그러면 샘플 데이터가 로드됩니다.

도로 맞춤으로 향상

이 Notebook 셀의 코드는 lakehouse의 데이터 파일에서 원시 GPS 데이터를 읽고 Azure Maps Snap to Road API에 전달합니다. 보간을 사용하도록 설정하면 API는 GPS 위치 사이에 지점을 추가하여 도로를 따라 경로 경로를 완료합니다. 또한 사용 가능한 경우 도로 이름 및 속도 제한과 같은 특성을 제공합니다.

  1. 이전 단계에서 패키지를 설치하는 데 사용된 셀 바로 아래에 포인터를 가리킵니다. 코드 또는 markdown을 추가하는 옵션이 나타납니다. 코드를 선택하여 Notebook에 다른 코드 셀을 추가합니다.

  2. 새 셀이 만들어지면 다음 코드를 추가합니다. 구독 키를 추가해야 합니다.

    import requests
    import json
    
    az_maps_subkey = ""
    az_maps_snaproads_url = "https://atlas.microsoft.com/route/snapToRoads?api-version=2025-01-01&subscription-key=" + az_maps_subkey
    
    # Function to process snap to road for each given trip
    def process_route(df, outputFilePath):
        # List to store successful responses
        successful_responses = []
    
        # Function to send a chunk of features
        def send_chunk_snaproads(chunk):
            geojson_data = chunk.to_json()
            # Convert the JSON string to a Python dictionary
            geojson_dict = json.loads(geojson_data)
    
            # Add the new fields at the end of the dictionary
            geojson_dict['includeSpeedLimit'] = True
            geojson_dict['interpolate'] = True
            geojson_dict['travelMode'] = "driving"
    
            # Convert the dictionary back to a JSON string
            updated_geojson_data = json.dumps(geojson_dict)
    
            response = requests.post(
            az_maps_snaproads_url, 
            headers={'Content-Type': 'application/json'}, 
            data=updated_geojson_data
            )
    
            if response.status_code == 200:
                print('Chunk request was successful...')
                successful_responses.append(response.json())
            else:
                print(f'Failed to send request. Status code: {response.status_code}')
                print('Response body:', response.text)
    
        # Loop over the GeoDataFrame in chunks of 100
        chunk_size = 100
        for start in range(0, len(df), chunk_size):
            end = start + chunk_size
            chunk = df.iloc[start:end]
            send_chunk_snaproads(chunk)
    
        # Extract features with geometry from successful responses
        features_with_geometry = []
        for response in successful_responses:
            if 'features' in response:
                for feature in response['features']:
                    if 'geometry' in feature:
                        longitude = feature['geometry']['coordinates'][0]
                        latitude = feature['geometry']['coordinates'][1]
                        feature['properties']['latitude'] = latitude
                        feature['properties']['longitude'] = longitude
                        features_with_geometry.append(feature)
    
        # Convert the list of features with geometry to a GeoDataFrame
        if features_with_geometry:
            responses_gdf = gpd.GeoDataFrame.from_features(features_with_geometry)
    
            # Write successful responses to a cvs file
            #responses_gdf.to_file(outputFilePath, driver='GeoJSON')
            responses_gdf.to_csv(outputFilePath, encoding='utf-8', index=False)
    
            print(f'Successful responses written to {outputFilePath}')
        else:
            print('No valid features with geometry found in the responses.')
    
  3. 실행 화살표를 선택하여 코드를 실행합니다.

향상된 데이터를 사용하여 파일 만들기

다음 코드는 이전 코드 셀에서 만든 출력을 사용하고 SnapRoadResponses.csv 레이크하우스에 새 CSV 파일을 만듭니다. 이 새로운 데이터 파일에는 적절한 도로에 맞춰진 업데이트된 GPS 좌표가 포함되어 있으며, 사용 가능한 경우 거리 이름 및 속도 제한도 포함됩니다. SnapRoadResponses.csv eventhouse로 가져오고 이 자습서의 뒷부분에서 지도 시각적 개체를 만드는 데 사용됩니다.

  1. 이전 단계에서 도로 맞춤으로 향상하는 데 사용된 셀 바로 아래에 포인터를 가져다 놓습니다. 코드 또는 markdown을 추가하는 옵션이 나타납니다. 코드를 선택하여 Notebook에 다른 코드 셀을 추가합니다.

  2. 새 셀이 만들어지면 다음 코드를 추가합니다.

    lakehouseFilePath = "/lakehouse/default/Files/"
    #execute snap to road
    outputFilePath = lakehouseFilePath + "SnapRoadResponses" + ".csv"
    df = mockdata_df.sort_values(by='timeStamp').reset_index(drop=True)
    process_route(df, outputFilePath)
    
  3. 실행 화살표를 선택하여 코드를 실행합니다. 이렇게 하면 업데이트된 GPS 좌표가 있는 SnapRoadResponses.csv 레이크하우스에 저장됩니다.

Notebook 코드를 실행한 후 새 파일이 나타나지 않으면 브라우저를 새로 고쳐야 할 수 있습니다.

파일 경로 복사

SnapRoadResponses.csv ABFS 경로는 eventhouse를 만들 때 이 자습서의 뒷부분에서 필요합니다. 이 파일에 대한 ABFS 경로를 얻으려면 파일 옆에 있는 줄임표(...)를 선택한 다음 팝업 메뉴에서 ABFS 경로 복사를 선택합니다. 복사한 후에는 나중에 저장할 수 있습니다.

Lakehouse에 저장된 데이터 파일에 ABFS 경로를 복사하는 방법을 보여 주는 스크린샷.

플릿 또는 이동 자산에 대한 원격 분석 데이터를 관리하는 이벤트 하우스를 만듭니다. KQL 데이터베이스는 기본적으로 자동으로 만들어집니다. 이 자습서에서는 레이크 하우스에서 KQL 데이터베이스로 스냅된 데이터를 가져옵니다. 실시간 분석을 위해 스트리밍 데이터를 추가합니다. 데이터가 업로드되면 KQL 쿼리 세트의 Kusto 쿼리 언어 사용하여 데이터를 쿼리할 수 있습니다.

  1. 내 작업 영역으로 이동하여 새 항목을 선택합니다.

  2. 새 항목 화면이 나타나면 아래로 스크롤하여 Eventhouse를 선택합니다.

  3. 새 Eventhouse 화면에서 SnapToRoadDemo와 같은 새 이벤트 하우스의 이름을 입력합니다.

    다음으로 이전에 만든 레이크하우스를 새 이벤트하우스에 연결합니다.

  4. 새 이벤트하우스 옆에 있는 줄임표를 선택한 다음 팝업 메뉴에서 데이터 > OneLake 를 가져옵니다.

    팝업 메뉴의 OneLake를 보여 주는 스크린샷.

  5. 새 테이블을 선택하고 GPSData이름을 지정한 다음, 다음을 선택합니다.

    새 테이블 옵션을 보여 주는 스크린샷

  6. 이전에 저장한 OneLake 파일 컨트롤에서 Lakehouse 데이터 파일(SnapRoadResponses.csv)에 대한 ABFS 경로를 입력한 다음 더하기 기호(+)를 선택하여 목록에 추가합니다.

    다음 단추가 강조 표시된 OneLake 파일 이름을 입력하는 스크린샷

  7. 다음을 선택합니다.

  8. 데이터 검사 화면에서 데이터를 확인한 후 마침 선택합니다.

    데이터 검사 화면을 보여 주는 스크린샷.

  9. 기를 선택하여 요약 페이지를 닫습니다.

    데이터 가져오기 요약 화면을 보여 주는 스크린샷

이제 이벤트 하우스를 만들고 GPS 데이터를 포함해야 합니다.

GPS 데이터가 있는 이벤트 하우스를 보여 주는 스크린샷.

실시간 대시보드 만들기

실시간 대시보드만들어 이벤트하우스의 데이터 세트에 연결할 수 있습니다. 이 자습서의 입력은 실시간 스트림이 아니라 정적 데이터이지만 Azure Maps Visual과 같은 대시보드의 타일을 시각적 표현 및 분석에 사용할 수 있습니다.

데이터 원본 추가

  1. 내 작업 영역으로 이동하여 새 항목을 선택합니다.

  2. 새 항목 화면이 나타나면 검색하거나 아래로 스크롤하여 실시간 대시보드를 선택합니다.

  3. 새 실시간 대시보드 화면에서 SnapToRoadDashboard 이름을 입력한 다음 만들기를 선택합니다.

  4. 실시간 대시보드 화면에서 새 데이터 원본을 선택합니다.

  5. 추가 단추를 선택한 다음 OneLake 데이터 허브를 선택합니다.

    실시간 대시보드 데이터 원본 추가 화면을 보여 주는 스크린샷

  6. 데이터 원본을 선택한 다음 연결합니다.

    연결 단추가 강조 표시된 상태에서 선택한 데이터 파일을 보여 주는 스크린샷

  7. 표시 이름을 입력한 다음 추가를 선택합니다.

    추가 단추가 강조 표시된 새 데이터 원본 만들기 화면을 보여 주는 스크린샷

  8. 데이터 원본 패널을 닫습니다 .

이제 실시간 대시보드에 대한 데이터 원본을 추가했으므로 쿼리를 추가하고 시각적 개체를 매핑할 수 있습니다.

쿼리 및 지도 시각적 개체 추가

  1. 타일 추가를 선택합니다.

    타일 추가 단추가 강조 표시된 스크린샷

  2. 쿼리에 입력 GPSData 한 다음 실행을 선택합니다. 쿼리가 작동하는지 확인하면 시각적 개체 추가를 선택합니다.

    실행 쿼리 화면의 결과를 보여 주는 스크린샷.

  3. 시각적 개체 서식 패널의 시각적 개체 유형 드롭다운에서 맵선택합니다.

  4. 다음으로 데이터 섹션에서 값을 설정합니다.

    데이터 설정 가치
    위치별로 정의 위도, 경도
    위도 열 위도(실제)
    경도 열 경도(실제)
  5. 레이블 열 드롭다운에서 값을 선택하여 지도 정보 카드를 업데이트합니다. SpeedLimitInKilometersPerHour를 선택합니다.

  6. 변경 내용 적용을 선택합니다.

지도 시각적 개체가 나타납니다. 지도에서 임의의 지점을 선택하여 해당 위치에 대한 좌표 및 속도 제한(시간 당 킬로미터)을 가져올 수 있습니다.

시간당 킬로미터 단위의 속도 제한을 보여 주는 정보 카드가 표시된 완성된 지도 시각적 개체를 보여 주는 스크린샷

다음 단계

Microsoft Fabric Notebook에 대해 자세히 알아보려면 다음을 수행합니다.

이 자습서에서는 여행 후 경로 분석을 위한 대시보드를 만들었습니다. Microsoft Fabric에서 실시간 대시보드를 빌드하는 단계별 가이드: