City Street Orientations 도시 도로 방향을 확인하는 방법
8837 단어 GISOpenStreetMapPostGIS
도로 방향을 집계
원본 자료는 아래의 Blog입니다.
Comparing City Street Orientations - Geoff Boeing
h tp // 게이오 f 보에인 g. 코 m / 2018 / 07 / 코 m 파린 g-y ty-st ree t-ori 엔치 온 s /
GIGAZINE 하지만 게재되었습니다만, 거리의 도로의 방향을 조사하면, 도시의 복잡성을 관찰할 수 있다고 하는 것입니다.
기사 중에서는 OpenStreetMap의 데이터와 Python을 사용하고 있다는 것입니다만, PostGIS로 도전해 보겠습니다.
데이터 입수
OpenStreetMap의 다운로드 사이트가 있으므로, 조사하고 싶은 에리어를 선택해, 구합니다.
일본은 국가 전체가 아닌 지방별로 나뉘어져 있습니다.
OpenStreetMap의 다운로드 사이트가 있으므로, 조사하고 싶은 에리어를 선택해, 구합니다.
일본은 국가 전체가 아닌 지방별로 나뉘어져 있습니다.
.shp 형식을 다운로드하면 무료 GIS 소프트웨어의 QGIS로 표시 가능합니다.
QGIS에서의 표시 예
© OpenStreetMap contributors
데이터 로드
PostGIS에서 처리하려면 데이터베이스로 로드해야 합니다.
범위 선택
QGIS 범위 선택 도구로 조사 대상 영역을 둘러쌌습니다.
DB에 투입
DB 툴의 임포트 기능을 이용해, 선택 범위의 데이터를 PostgreSQL에 투입합니다.
집계 정책
도로 방향을 계산하는 방법
도로는 교차점으로부터 교차점까지를 선으로 묶습니다만 직선이라고는 할 수 없습니다. 또한 OpenStreetMap의 도로 모양은 반드시 교차로에서 분할되지는 않습니다.
1) 도로 형상을 구성하는 점에서 분할
2) 2점간에 선분으로 연결해, 방위와 선분 길이의 산출
3) 방위각마다 선분 길이를 집계한다
(일방 통행은 1배, 양방향 통행 도로는 180도 반전한 방위에서도 카운트)
집계 쿼리
count_street_orientations.sql
WITH step2 AS
(
-- 2点を結び、線分長と方位を計算
SELECT
id
, path
, degrees(ST_Azimuth( geom , LEAD( geom)OVER( PARTITION BY id ORDER BY path ) ) ) AS dir
, ST_Distance( geom::geography , LEAD( geom::geography )OVER( PARTITION BY id ORDER BY path ) ) AS dist_meter
, oneway
FROM
-- 集合体を個々の点にバラす
(
SELECT
id , ((pd).path)[1] , (pd).geom AS geom ,oneway
FROM
-- ST_DumpPointsで道路中心線を点に分割した集合体に変換
(
SELECT
id
, ST_DumpPoints(geom) AS pd
, oneway
FROM public.tuduki_road
) AS base
) AS step1
)
-- 順行・逆行の値を集計
SELECT
degree_10 , SUM( sum )
FROM
(
-- 一方通行・両方通行の順方向の集計
SELECT
TRUNC( dir :: numeric , -1 ) AS degree_10 , SUM( dist_meter )
FROM step2
WHERE dist_meter IS NOT NULL
GROUP BY 1
UNION ALL
-- 両方向通行の道路方向の反転し集計
SELECT
TRUNC( CASE WHEN dir :: numeric < 180 THEN dir :: numeric + 180 ELSE dir :: numeric - 180 END , -1 ) AS degree_10
, SUM( dist_meter )
FROM step2
WHERE dist_meter IS NOT NULL
AND oneway = 'B'
GROUP BY 1
) AS step3
GROUP BY 1
ORDER BY 1
;
결과
닭 머리 그림이 수중의 앱으로 바로 그릴 수 없었기 때문에, EXCEL의 레이더 차트로서 출력했습니다
요약
간단하지만, 방위와 도로장의 집계를 실시했습니다.
SQL에서도 그렇게 할 수있었습니다.
Reference
이 문제에 관하여(City Street Orientations 도시 도로 방향을 확인하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/takahi/items/15c0e4b81ec8fd2a2863
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
WITH step2 AS
(
-- 2点を結び、線分長と方位を計算
SELECT
id
, path
, degrees(ST_Azimuth( geom , LEAD( geom)OVER( PARTITION BY id ORDER BY path ) ) ) AS dir
, ST_Distance( geom::geography , LEAD( geom::geography )OVER( PARTITION BY id ORDER BY path ) ) AS dist_meter
, oneway
FROM
-- 集合体を個々の点にバラす
(
SELECT
id , ((pd).path)[1] , (pd).geom AS geom ,oneway
FROM
-- ST_DumpPointsで道路中心線を点に分割した集合体に変換
(
SELECT
id
, ST_DumpPoints(geom) AS pd
, oneway
FROM public.tuduki_road
) AS base
) AS step1
)
-- 順行・逆行の値を集計
SELECT
degree_10 , SUM( sum )
FROM
(
-- 一方通行・両方通行の順方向の集計
SELECT
TRUNC( dir :: numeric , -1 ) AS degree_10 , SUM( dist_meter )
FROM step2
WHERE dist_meter IS NOT NULL
GROUP BY 1
UNION ALL
-- 両方向通行の道路方向の反転し集計
SELECT
TRUNC( CASE WHEN dir :: numeric < 180 THEN dir :: numeric + 180 ELSE dir :: numeric - 180 END , -1 ) AS degree_10
, SUM( dist_meter )
FROM step2
WHERE dist_meter IS NOT NULL
AND oneway = 'B'
GROUP BY 1
) AS step3
GROUP BY 1
ORDER BY 1
;
간단하지만, 방위와 도로장의 집계를 실시했습니다.
SQL에서도 그렇게 할 수있었습니다.
Reference
이 문제에 관하여(City Street Orientations 도시 도로 방향을 확인하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takahi/items/15c0e4b81ec8fd2a2863텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)