City Street Orientations 도시 도로 방향을 확인하는 방법

도로 방향을 집계



원본 자료는 아래의 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의 다운로드 사이트가 있으므로, 조사하고 싶은 에리어를 선택해, 구합니다.
일본은 국가 전체가 아닌 지방별로 나뉘어져 있습니다.
  • 일본 데이터 다운로드 대상
  • h tp : // / w w ㄉ 아 d. 게오후비 k. 에 / 아시아 / 자판. HTML


  • .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에서도 그렇게 할 수있었습니다.

    좋은 웹페이지 즐겨찾기