일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- naver
- 베이지안뉴럴네트워크
- Python
- 핫플레이스
- 그래프이론
- 공간데이터
- spacesyntax
- 스마트시티
- 서울데이터
- QGIS
- pandas
- connectivity
- 파이썬
- SQL
- 도시계획
- 공간분석
- 도시설계
- 도시공간분석
- 서울
- 네이버
- digitalgeography
- graphtheory
- postgres
- digital geography
- 도시인공지능
- 그래프색상
- 베이지안
- multinomiallogitregression
- platformurbanism
- 웹크롤링
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- naver
- 베이지안뉴럴네트워크
- Python
- 핫플레이스
- 그래프이론
- 공간데이터
- spacesyntax
- 스마트시티
- 서울데이터
- QGIS
- pandas
- connectivity
- 파이썬
- SQL
- 도시계획
- 공간분석
- 도시설계
- 도시공간분석
- 서울
- 네이버
- digitalgeography
- graphtheory
- postgres
- digital geography
- 도시인공지능
- 그래프색상
- 베이지안
- multinomiallogitregression
- platformurbanism
- 웹크롤링
- Today
- Total
이언배 연구노트
[QGIS] 도로에 가장 가까운 점들 할당하기 본문
Task:
특정 음식점에 가기 위해서는 길을 통해서 진입해야 한다.
어떠한 길이 접근 가능한 음식점을 가장 많이 가지고 있는가?
특정 도로의 공간 특성을 설명할 때에, Nearest Point 의 갯수로 할당하는 것만큼 속편한 방법도 없다.
북촌로와 삼청로에 얼마나 많은 음식점들이 줄지어져 있는지,
골목길과는 얼마나 다른지 갯수 할당을 통해서 분석해보자.
준비물
준비물은 2개. Road Geometry -juso.go.kr 에서 취득, Point Geometry - 여기에서는 인허가 데이터를 사용했다.
여기저기 많이 구해본 결과, 주소정보누리집에서 제공하는 도로중심선 데이터가 가장 확실하고, 정밀하다.
제공하는 주소
제공하는 주소 ※ 주소정보 이용 및 활용 시, 도로명주소법 시행령 6조(도로명주소의 구성 및 표기방법)을 준수하여 주시기 바랍니다. 전자지도 다운로드 ※ 도로명주소 공간정보의 건물객체는
business.juso.go.kr
Nearest Join
QGIS 의 Tool box 에 Nearest Join 을 검색하면 아래와 같은 함수들이 나온다.
1. 최근접 이웃 분석
단일 레이어 내에서 Point 간의 거리를 기반으로 관련 통계치를 분석해준다. 고로, 본 task 에서는 쓸모없다.
2. 최근접 허브까지의 거리 (라인에서 허브까지)
Point 레이어로부터 특정 대상이 되는 다른 레이어 (이 경우에는 도로 중심선) 를 기준으로 가장 가까이에서 뭉칠수 있는 hub 를 임의로 만들어서 거기까지의 거리를 분석. 각 음식점 별로 어느 도로에서 접근하는 것이 가장 가까울지에 대한 분석은 가능할지 몰라도, 이런 식으로는 도로마다 음식점을 할당할 수는 없다. 고로, 본 task 에서는 쓸모없다.
3. Shortest Lines between Features
가장 가까운 거리까지의 직선거리를 바탕으로 계산해준다. 해당 음식점에 도달하기 위한 가장 가까운 루트를 설명해주기에 가장 적당하다.
결과물 또한 1:1 매칭으로 가장 가까운 점과 선들을 이어준 테이블을 제공한다.
귀찮긴 하지만, 도로 중심선 id 와의 매칭을 통해서 할당이 가능하다.
Source Layer 에는 Point 를, 대상 레이어에는 Street을 집어넣었고,
10m가 넘어갈 정도의 거리에 음식점이 있는 건 해당 도로를 통해서 접근한다고 보기에 어려움이 있으므로, 옵션은 10m로 설정한다.
굉장히 아름다운 비주얼.
도로 중심선 객체에 nearest join 된 객체의 도로 id를 중심으로
음식점들을 모두 붙여주면 (one-to-many) 도로들마다 음식점이 몇개씩 붙어있는 지 알 수 있을 거다.
1번 도로에는 3개의 음식점, 2, 3,4번에는 없거나 하나고 5번 도로에 많은 음식점들이 위치한다는 걸 알 수 있다.
남은 건 도로들마다 group by 로 counting 해주는 것 뿐.
QGIS는 해당 함수는 매우 불편하므로, 나머지 작업은 SQL에서 해주기로 하자.
(참고)
GIS에서의 작업은 하기와 같은 코드로 완성했다.
CREATE TABLE street_poirest AS
(WITH
street_rest AS
(SELECT street.NUM, count(rest.field_1) FROM "Temp"."bukchon_street" street
LEFT JOIN "Temp"."street+rest" rest
ON street.NUM = rest."NUM"
GROUP BY street.NUM),
street_poi AS
(SELECT street.NUM, count(poi.poi_id) FROM "Temp"."bukchon_street" street
LEFT JOIN "Temp"."street+poi" poi
ON street.NUM = poi."NUM"
GROUP BY street.NUM)
SELECT street_poi.*, num_rest.num_rest
FROM
(SELECT raw_street1.*, street_poi.count as num_poi FROM "Temp"."bukchon_street" raw_street1
LEFT JOIN street_poi ON raw_street1.NUM = street_poi.NUM) street_poi
LEFT JOIN
(SELECT raw_street2.num, street_rest.count as num_rest FROM "Temp"."bukchon_street" raw_street2
LEFT JOIN street_rest ON raw_street2.NUM = street_rest.NUM) num_rest
ON street_poi.NUM = num_rest.num);
"Temp"."bukchon_street": 도로중심선 객체 테이블
"Temp"."street+rest": 도로중심선, 음식점 객체 LEFT JOIN 테이블
"Temp"."street+poi": 도로중심선, poi 객체 LEFT JOIN 테이블.
'QGIS' 카테고리의 다른 글
[QGIS + Python] 포인트 데이터를 사용한 hotspot 분석 (1) | 2025.01.22 |
---|---|
[QGIS + Python] 서울 생활인구 이동 데이터 탐색 (0) | 2025.01.14 |