설렘의 무게
내비게이션은 거리나 시간을 최소화한 경로를 제안한다. 실제로 걷는 사람은 때때로 궁궐 담장을 끼고, 좁은 골목을 지나고, 사람 구경이 되는 거리를 선택한다. 걷고 싶은 마음에 작용하는 조건을 수치로 바꾼다면 경로 계산에도 반영할 수 있다.
이 프로젝트는 종로의 도로망을 그래프로 만들고 유동인구, 문화길, 거리의 위요감, 장소 특성을 링크별 비용으로 변환했다. 각 조건의 강도를 조절하며 실제 거리 최단 경로와 사용자 가중 경로를 비교했다.
가중치 기반 경로 탐색 구조
도시 데이터는 QGIS에서 전처리해 하나의 GeoPackage에 저장했다. Grasshopper는 이 데이터를 시각화용 컨텍스트, 경로 계산용 도로망, 네 가지 가중치의 원천 데이터로 나누어 처리한다.

Grasshopper에서 Python을 본격적으로 사용한 첫 프로젝트다. GeoPandas와 Shapely로 공간 관계를 계산하고, NumPy로 가중치를 처리했으며, NetworkX로 경로를 탐색했다. 전체 정의는 데이터 입력과 전처리, 가중치 계산, 네트워크 생성, 경로 탐색, 시각화 컴포넌트로 나누었다.
네 가중치 컴포넌트는 동일한 링크 순서에 맞춰 비용 점수를 반환한다. 모든 점수는 값이 낮을수록 선호하는 링크라는 공통 규약을 따른다. 같은 입출력 규약을 유지하면 가중치 컴포넌트를 교체하거나 새로운 조건을 연결할 수 있다.
종로에서의 개념 증명
개념 증명은 궁궐과 골목, 대로가 가까이 놓인 종로 일대에서 진행했다. 국가기본도의 도로 링크와 노드, GIS건물통합정보의 건물, 서울시열린데이터광장의 공공 데이터를 QGIS에서 정리하고 GeoPackage로 묶었다.
GeoPackage 기반 소스 데이터 구성
Extract Nodes & Links는 같은 좌표의 노드를 통합하고, 링크의 양 끝 노드와 형상, 실제 길이, 차로 수를 network_data로 구성한다. 이때 부여한 lnk_idx가 이후 컴포넌트에서 동일한 링크를 식별하는 공통 키가 된다.


왼쪽은 분석 범위의 도시 컨텍스트이고, 오른쪽은 같은 지역을 노드와 링크로 변환한 결과다. 이후 경로 이미지에서 파란색은 실제 링크 거리의 합이 가장 짧은 경로, 붉은색은 선택한 가중 비용의 합이 가장 작은 경로다.
첫 번째 무게, 유동인구
서울시 상권분석 서비스의 상권 영역과 길 단위 유동인구를 도로 링크에 대응시켰다. 사용자는 전체 인구 또는 성별·연령대별 항목을 선택하고, 사람 많은 거리를 선호할지 혼잡을 피할지 정할 수 있다.
하나의 링크가 여러 상권과 교차하면 가장 큰 유동인구 값을 대표값으로 사용한다. 정규화한 값은 사용자 성향에 따라 방향을 바꾸며, 최종 결과는 낮을수록 선호하는 비용 점수로 통일된다.




경로 이미지는 유동인구 가중치의 강도에 따라 선택되는 링크가 달라지는 결과를 보여준다.
두 번째 무게, 서울의 문화길
서울시 두드림길의 문화길 데이터를 도로 링크에 대응시켰다. 서로 다른 출처에서 만들어진 선형 데이터의 위치 오차를 흡수하기 위해 도로 링크에는 2m, 문화길에는 3m의 버퍼를 적용했다.
문화길과 겹친 링크에는 0, 나머지 링크에는 1의 비용 점수를 준다. 문화길 밖의 링크에 상대적인 패널티가 생기며, 한 링크가 여러 문화길 조각과 만나더라도 겹침 여부는 한 번만 기록한다.




문화길 비용을 적용하면 종로 대로를 따르던 경로가 종묘와 창덕궁, 경복궁, 경희궁 주변의 문화길로 이동한다.
건물의 영향권
위요감을 계산하고 POI를 도로에 전달하려면 각 링크에 인접한 건물을 먼저 정의해야 한다. 원본 데이터에는 이 관계가 없으므로 건물 외곽을 재표집한 보로노이 셀과 실제 도로 폭을 반영한 링크 버퍼의 교차로 관계를 만들었다.
건물 중심점만 사용하면 규모와 외곽 형태가 사라진다. 외곽선을 최대 5m 간격으로 재표집하고 각 점에 원래 건물 ID를 유지한 채 Point Voronoi를 계산했다. 도로에는 차로 수로 추정한 폭과 1m의 여유 폭을 적용했다.
링크 버퍼와 교차한 셀을 모아 만든 near_buildings는 각 링크와 인접 건물의 ID·높이를 연결한다. 가까운 건물의 셀이 도로 주변을 점유하므로 고정된 검색 반경보다 도로에 직접 면한 건물을 찾는 데 적합했다.


세 번째 무게, 거리의 위요감
거리의 위요감은 도로 폭 D와 주변 건물의 평균 높이 H의 비율로 계산했다. 도로 폭은 차로 수 × 3m, 건물 높이는 인접 건물의 층수 × 3.5m로 추정했다. 인접 건물이 없는 링크는 비율의 상한값인 5로 처리했다.
가상 가로 이미지를 이용한 안아람의 연구에서는 D:H=1:0.7인 가로가 가장 편안하게 평가됐고, 1:1에서는 안정감, 1:0.3에서는 허전함, 1:3에서는 강한 폐쇄감이 나타났다. 코드의 D/H 기준으로 선호값은 약 1.43이다. 기본 함수는 이 값에 가까운 1.5를 중심으로 두고, 분포 범위 σ=0.6을 적용했다. Gaussian 값은 선호 비율에서 가장 크므로 1-g(r)로 반전해 비용 점수로 반환한다.
안아람, 「가로의 물리적 공간 요소에 대한 연구: 가로 공간 특성에 대한 보행자의 반응을 바탕으로」, 서울대학교 석사학위논문, 2016
위요감에 대한 선호는 사용자마다 다를 수 있다. 추가 설정에서는 정규화한 비율을 Grasshopper의 Graph Mapper에 연결해 사용자가 비용 곡선을 직접 조정하도록 했다. 기본 Gaussian과 사용자 곡선은 같은 출력 규약을 사용한다.




네 번째 무게, 장소 특성
장소 특성은 선택한 POI의 종류와 개수를 도로 비용으로 변환한다. 카페·소매점처럼 거리에 활력을 더하는 요소, 공원·역사 자산과 같은 목적지, 주차장·주유소와 같은 보행 장벽으로 분류했다.
POI를 포함하는 건물을 within 공간 조인으로 찾고, near_buildings 관계를 따라 건물별 개수를 도로 링크에 전달한다. 활력과 목적지는 비용을 낮추고 장벽은 높이며, 세 유형의 강도는 따로 조절할 수 있다. POI의 세 분류는 보행 경험에 대한 이 프로젝트의 해석 규칙이다.
복합 가중치와 경로 계산
네 컴포넌트는 같은 링크 순서와 개수를 갖는 비용 배열을 반환한다. 사용자는 각 가중치의 강도를 따로 조절하고, 합산 컴포넌트의 전체 민감도 α를 통해 네 가중치가 경로에 미치는 영향을 한 번에 조절할 수 있다.
합산 컴포넌트는 입력 배열의 길이를 확인한 뒤 각 링크의 점수를 정규화해 합친다. Network Builder는 이 비용계수와 실제 링크 길이를 곱해 최종 비용을 만든다. Path Finder는 출발지와 목적지를 가장 가까운 노드에 대응시키고, 같은 그래프에서 다익스트라 알고리즘을 두 번 실행해 두 경로를 반환한다.



세 결과에는 유동인구, 문화길, 위요감, 장소 특성 가중치를 모두 적용했다. 요소별 강도와 전체 민감도에 따라 같은 출발지와 목적지에서도 서로 다른 경로가 만들어진다.
검증 범위와 다음 작업
현재 결과는 종로의 정적 데이터를 이용해 네 가지 거리 경험이 경로 비용으로 변환되고, 설정에 따라 경로가 달라지는 과정을 확인한 개념 증명이다. 보행 경로의 선호도와 만족도를 사용자 집단으로 검증하지는 않았다. 도로 데이터에서도 보행전용과 자동차전용을 구분하지 않고 모든 링크를 보행할 수 있는 무방향 그래프로 처리했다.
우선 필요한 작업은 사용자 평가다. 실제 보행자의 선택과 응답을 수집해 기본 비용 함수와 가중치 범위를 조정해야 한다. 다음은 보행 가능 여부를 반영한 네트워크와 자동 전처리 과정이다. 현재의 수동 QGIS 작업을 줄이고 보행이 불가능한 링크를 분리해야 다른 지역에서도 같은 계산을 안정적으로 반복할 수 있다.
그 이후에는 후기와 사진, 장소에 대한 표현처럼 구조화하기 어려운 자료를 LLM으로 해석해 거리의 분위기를 새로운 가중치로 만드는 가능성을 검토하고자 한다.