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 지점을 가장 가까운 도로로 스냅하고, 보간된 데이터 요소를 사용하여 누락된 지점을 채우고, 도로 이름 및 속도 제한과 같은 추가 특성으로 향상하는 방법을 안내합니다.
이 자습서에서는 다음을 수행합니다.
- Microsoft Fabric Lakehouse를 만들고 Vechicle의 원시 GPS 데이터를 가져옵니다.
- 원시 GPS 데이터를 사용하고 Azure Maps Snap to Roads API를 사용하여 요청된 스냅된 좌표 정보를 반환하는 Microsoft Fabric Notebook을 만듭니다.
- Eventhouse 및 KQL 데이터베이스를 만들고 스냅된 GPS 데이터를 가져옵니다.
- Kusto 데이터베이스에서 스냅된 GPS 데이터를 사용하여 실시간 대시보드를 만듭니다.
- KQL 데이터를 쿼리하고 지도 시각적 개체에 스냅된 GPS 데이터를 표시합니다.
필수 조건
- Azure Maps 계정
- 구독 키
- Microsoft Fabric 계정
- Microsoft Fabric에 대한 기본적인 이해.
참고 항목
Azure Maps의 인증에 대한 자세한 내용은 Azure Maps의 인증 관리를 참조하세요.
Microsoft Fabric Notebook 및 Lakehouse 만들기
다음 단계에 따라 Microsoft Fabric Notebook을 만듭니다.
내 작업 영역으로 이동하여 새 항목을 선택합니다.
새 항목 화면이 나타나면 아래로 스크롤하여 전자 필기장을 선택합니다.
Notebook 탐색기 화면에서 Lakehouses 화살표를 > 선택합니다.
추가 단추를 선택합니다.
레이크하우스 추가 대화 상자에서 새 레이크하우스를 선택한 다음 추가 단추를 선택합니다.
새 레이크하우스 대화 상자에서 이름 "Azure_Maps_Data"을 입력한 다음 만들기 단추를 선택합니다.
레이크하우스에 데이터 파일 추가
도로 스냅은 GPS 지점 데이터(위도, lon)를 사용하고 지도의 도로에 스냅된 경로를 형성하는 개체 목록을 반환합니다. 필요한 GPS 데이터가 포함된 데이터 파일을 레이크하우스에 파일로 추가하고 Notebook의 Python 코드에서 참조할 수 있습니다.
데이터 파일 다운로드
GitHub에서 로컬 스토리지 디바이스로 샘플 데이터(mockData_20240919.csv)를 다운로드하여 다음 섹션에서 lakehouse에 업로드합니다. 이 파일에는 각 좌표가 유효한 도로를 가리키도록 도로 맞춤 서비스가 필요에 따라 수정하는 GPS 좌표 배열이 포함되어 있습니다.
GitHub에서 파일 mockData_20240919.csv 엽니다.
화면의 오른쪽 위 모서리에서 원시 파일 다운로드 단추를 선택하고 파일을 로컬로 저장합니다.
Lakehouse에 데이터 파일 업로드
다음 단계에서는 Lakehouse에 데이터 원본을 추가하는 방법을 설명합니다.
레이크하우스의 파일 폴더에서 파일 업로드를 > 선택합니다.
폴더 아이콘을 선택하여 파일 열기 대화 상자를 표시합니다. 이전 섹션에서 다운로드한 mockData_20240919.csv 파일을 선택한 다음 열기 단추를 선택합니다. 파일 열기 대화 상자가 닫히면 파일 업로드 컨트롤에 올바른 파일 이름이 나타나면 업로드 단추를 선택하여 파일을 lakehouse에 업로드합니다.
Notebook에 코드 추가
도로 맞춤 시나리오를 수행하려면 Notebook에 4개의 코드 셀을 추가하고 실행해야 합니다. 다음 섹션에서는 이 단계를 안내합니다.
패키지 설치
먼저 필요한 패키지를 로드해야 합니다.
!pip install geopandas
!pip install geojson
Notebook의 첫 번째 셀에 pip install 문을 입력한 다음 실행 화살표를 선택하여 문을 실행합니다.
데이터 로드
다음으로, 이전에 레이크하우스에 업로드한 샘플 데이터를 로드합니다.
패키지를 설치하는 데 사용되는 셀 바로 아래에 포인터를 가져다 줍니다. 코드 또는 markdown을 추가하는 옵션이 나타납니다. 코드를 선택하여 Notebook에 다른 코드 셀을 추가합니다.
새 셀이 만들어지면 다음 코드를 추가합니다.
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()실행 화살표를 선택하여 코드를 실행합니다. 그러면 샘플 데이터가 로드됩니다.
도로 맞춤으로 향상
이 Notebook 셀의 코드는 lakehouse의 데이터 파일에서 원시 GPS 데이터를 읽고 Azure Maps Snap to Road API에 전달합니다. 보간을 사용하도록 설정하면 API는 GPS 위치 사이에 지점을 추가하여 도로를 따라 경로 경로를 완료합니다. 또한 사용 가능한 경우 도로 이름 및 속도 제한과 같은 특성을 제공합니다.
이전 단계에서 패키지를 설치하는 데 사용된 셀 바로 아래에 포인터를 가리킵니다. 코드 또는 markdown을 추가하는 옵션이 나타납니다. 코드를 선택하여 Notebook에 다른 코드 셀을 추가합니다.
새 셀이 만들어지면 다음 코드를 추가합니다. 구독 키를 추가해야 합니다.
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.')실행 화살표를 선택하여 코드를 실행합니다.
향상된 데이터를 사용하여 파일 만들기
다음 코드는 이전 코드 셀에서 만든 출력을 사용하고 SnapRoadResponses.csv 레이크하우스에 새 CSV 파일을 만듭니다. 이 새로운 데이터 파일에는 적절한 도로에 맞춰진 업데이트된 GPS 좌표가 포함되어 있으며, 사용 가능한 경우 거리 이름 및 속도 제한도 포함됩니다. SnapRoadResponses.csv eventhouse로 가져오고 이 자습서의 뒷부분에서 지도 시각적 개체를 만드는 데 사용됩니다.
이전 단계에서 도로 맞춤으로 향상하는 데 사용된 셀 바로 아래에 포인터를 가져다 놓습니다. 코드 또는 markdown을 추가하는 옵션이 나타납니다. 코드를 선택하여 Notebook에 다른 코드 셀을 추가합니다.
새 셀이 만들어지면 다음 코드를 추가합니다.
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)실행 화살표를 선택하여 코드를 실행합니다. 이렇게 하면 업데이트된 GPS 좌표가 있는 SnapRoadResponses.csv 레이크하우스에 저장됩니다.
팁
Notebook 코드를 실행한 후 새 파일이 나타나지 않으면 브라우저를 새로 고쳐야 할 수 있습니다.
파일 경로 복사
SnapRoadResponses.csv ABFS 경로는 eventhouse를 만들 때 이 자습서의 뒷부분에서 필요합니다. 이 파일에 대한 ABFS 경로를 얻으려면 파일 옆에 있는 줄임표(...)를 선택한 다음 팝업 메뉴에서 ABFS 경로 복사를 선택합니다. 복사한 후에는 나중에 저장할 수 있습니다.
레이크하우스에서 이벤트하우스 만들기 및 데이터 링크
플릿 또는 이동 자산에 대한 원격 분석 데이터를 관리하는 이벤트 하우스를 만듭니다. KQL 데이터베이스는 기본적으로 자동으로 만들어집니다. 이 자습서에서는 레이크 하우스에서 KQL 데이터베이스로 스냅된 데이터를 가져옵니다. 실시간 분석을 위해 스트리밍 데이터를 추가합니다. 데이터가 업로드되면 KQL 쿼리 세트의 Kusto 쿼리 언어 사용하여 데이터를 쿼리할 수 있습니다.
내 작업 영역으로 이동하여 새 항목을 선택합니다.
새 항목 화면이 나타나면 아래로 스크롤하여 Eventhouse를 선택합니다.
새 Eventhouse 화면에서 SnapToRoadDemo와 같은 새 이벤트 하우스의 이름을 입력합니다.
다음으로 이전에 만든 레이크하우스를 새 이벤트하우스에 연결합니다.
새 이벤트하우스 옆에 있는 줄임표를 선택한 다음 팝업 메뉴에서 데이터 > OneLake 를 가져옵니다.
새 테이블을 선택하고 GPSData로 이름을 지정한 다음, 다음을 선택합니다.
이전에 저장한 OneLake 파일 컨트롤에서 Lakehouse 데이터 파일(SnapRoadResponses.csv)에 대한 ABFS 경로를 입력한 다음 더하기 기호(+)를 선택하여 목록에 추가합니다.
다음을 선택합니다.
데이터 검사 화면에서 데이터를 확인한 후 마침을 선택합니다.
닫기를 선택하여 요약 페이지를 닫습니다.
이제 이벤트 하우스를 만들고 GPS 데이터를 포함해야 합니다.
실시간 대시보드 만들기
실시간 대시보드를 만들어 이벤트하우스의 데이터 세트에 연결할 수 있습니다. 이 자습서의 입력은 실시간 스트림이 아니라 정적 데이터이지만 Azure Maps Visual과 같은 대시보드의 타일을 시각적 표현 및 분석에 사용할 수 있습니다.
데이터 원본 추가
내 작업 영역으로 이동하여 새 항목을 선택합니다.
새 항목 화면이 나타나면 검색하거나 아래로 스크롤하여 실시간 대시보드를 선택합니다.
새 실시간 대시보드 화면에서 SnapToRoadDashboard 이름을 입력한 다음 만들기를 선택합니다.
새 실시간 대시보드 화면에서 새 데이터 원본을 선택합니다.
추가 단추를 선택한 다음 OneLake 데이터 허브를 선택합니다.
데이터 원본을 선택한 다음 연결합니다.
표시 이름을 입력한 다음 추가를 선택합니다.
데이터 원본 패널을 닫습니다 .
이제 실시간 대시보드에 대한 데이터 원본을 추가했으므로 쿼리를 추가하고 시각적 개체를 매핑할 수 있습니다.
쿼리 및 지도 시각적 개체 추가
타일 추가를 선택합니다.
쿼리에 입력
GPSData한 다음 실행을 선택합니다. 쿼리가 작동하는지 확인하면 시각적 개체 추가를 선택합니다.시각적 개체 서식 패널의 시각적 개체 유형 드롭다운에서 맵을 선택합니다.
다음으로 데이터 섹션에서 값을 설정합니다.
데이터 설정 가치 위치별로 정의 위도, 경도 위도 열 위도(실제) 경도 열 경도(실제) 레이블 열 드롭다운에서 값을 선택하여 지도 정보 카드를 업데이트합니다. SpeedLimitInKilometersPerHour를 선택합니다.
변경 내용 적용을 선택합니다.
지도 시각적 개체가 나타납니다. 지도에서 임의의 지점을 선택하여 해당 위치에 대한 좌표 및 속도 제한(시간 당 킬로미터)을 가져올 수 있습니다.
다음 단계
Microsoft Fabric Notebook에 대해 자세히 알아보려면 다음을 수행합니다.
이 자습서에서는 여행 후 경로 분석을 위한 대시보드를 만들었습니다. Microsoft Fabric에서 실시간 대시보드를 빌드하는 단계별 가이드: