pgRouting 알고리즘

moon.kick·2025년 2월 23일

네, pgRouting은 Java에서도 사용할 수 있습니다! 하지만 pgRouting 자체는 PostgreSQL + PostGIS를 기반으로 하는 SQL 확장 기능이므로, Java에서는 JDBC(Java Database Connectivity)를 통해 PostgreSQL과 연결하여 SQL 쿼리를 실행하는 방식으로 사용해야 합니다.


📌 Java에서 pgRouting 사용 방법

Java에서 pgRouting을 활용하려면 다음과 같은 과정이 필요합니다.

1️⃣ PostgreSQL + PostGIS + pgRouting 설정

먼저, PostgreSQL과 PostGIS, pgRouting이 설치되어 있어야 합니다.
(이미 설정했다면 건너뛰세요.)

CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;

2️⃣ Java에서 PostgreSQL 연결 (JDBC 사용)

PostgreSQL 데이터베이스에 연결하려면 JDBC 드라이버가 필요합니다.

PostgreSQL JDBC 드라이버 추가
Maven 프로젝트인 경우, pom.xml에 PostgreSQL 드라이버를 추가하세요.

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.5.0</version>
</dependency>

Gradle을 사용하는 경우:

dependencies {
    implementation 'org.postgresql:postgresql:42.5.0'
}

3️⃣ Java에서 pgRouting 실행하기

💡 pgRouting을 이용한 최단 경로 찾기 (Dijkstra 알고리즘)

다음은 Java에서 PostgreSQL의 pgRouting을 활용하여 최단 경로 탐색을 실행하는 코드입니다.

import java.sql.*;

public class PgRoutingExample {
    public static void main(String[] args) {
        // PostgreSQL 연결 정보
        String url = "jdbc:postgresql://localhost:5432/your_database"; // 데이터베이스 주소
        String user = "your_username"; // 사용자 이름
        String password = "your_password"; // 비밀번호

        // SQL 쿼리: Dijkstra 알고리즘을 사용한 최단 경로 탐색
        String sql = "SELECT * FROM pgr_dijkstra("
                   + " 'SELECT id, source, target, cost FROM ways', 1, 10, false);";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {

            System.out.println("Shortest Path (Dijkstra):");
            while (rs.next()) {
                int seq = rs.getInt("seq");
                int node = rs.getInt("node");
                double cost = rs.getDouble("cost");
                System.out.printf("Step %d: Node %d, Cost %.2f%n", seq, node, cost);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

코드 설명

  • JDBC를 사용해 PostgreSQL 데이터베이스에 연결
  • SQL 쿼리를 실행하여 pgRouting의 pgr_dijkstra 함수를 호출
  • 결과를 ResultSet으로 받아 최단 경로를 출력

4️⃣ 다른 pgRouting 기능 활용

🚗 A* 알고리즘 사용

String sql = "SELECT * FROM pgr_astar("
           + " 'SELECT id, source, target, cost, x1, y1, x2, y2 FROM ways',"
           + " 1, 10, false);";

📍 다중 경로 탐색 (Many-to-Many)

String sql = "SELECT * FROM pgr_dijkstraCostMatrix("
           + " 'SELECT id, source, target, cost FROM ways',"
           + " ARRAY[1, 2, 3, 4]);";

📌 Java에서 pgRouting을 언제 사용할까?

지도 기반 애플리케이션: 내비게이션, 물류 최적화
교통 분석 시스템: 최단 거리, 경로 탐색
배달 서비스: 가장 빠른 배달 경로 추천
대중교통 경로 분석: 환승 최적화 시스템


🚀 결론

pgRouting은 Java에서 직접 실행되지 않지만, JDBC를 통해 PostgreSQL과 연결하여 SQL 쿼리로 활용 가능
JDBC로 pgRouting의 다양한 알고리즘 (Dijkstra, A*, TSP 등)을 실행하여 경로 탐색 수행
PostgreSQL을 활용한 네트워크 분석, 경로 최적화, GIS 기반 애플리케이션 개발에 유용

즉, Java + PostgreSQL(JDBC) + pgRouting을 조합하면 강력한 GIS 애플리케이션을 구축할 수 있습니다! 🚀




pgRouting은 PostgreSQL의 공간 데이터베이스 확장인 PostGIS를 기반으로 하는 오픈소스 경로 탐색 라이브러리입니다. 이는 GIS 데이터를 활용하여 최단 경로, 네트워크 분석, 경로 탐색 등을 수행할 수 있도록 지원하는 도구입니다. PostgreSQL 내에서 SQL 쿼리만으로 경로 탐색을 실행할 수 있기 때문에, 공간 데이터베이스를 사용하는 애플리케이션에서 매우 유용합니다.


🔹 pgRouting의 주요 기능

  1. 최단 경로 탐색 (Shortest Path)

    • Dijkstra 알고리즘 (pgr_dijkstra)
    • A* 알고리즘 (pgr_astar)
    • Bellman-Ford 알고리즘 (pgr_bellmanFord)
  2. 차량 경로 탐색 (Vehicle Routing)

    • TSP (Traveling Salesman Problem) (pgr_TSP)
    • VRP (Vehicle Routing Problem)
  3. 다중 최단 경로 분석

    • One-to-Many 및 Many-to-One 경로 계산 (pgr_dijkstraCost)
    • Many-to-Many 경로 계산 (pgr_dijkstraCostMatrix)
  4. 턴 제한 경로 탐색

    • 턴 제약을 고려한 네트워크 탐색 (pgr_turnRestrictions)
  5. 최소 비용 네트워크

    • 최소 스패닝 트리 (Minimum Spanning Tree)
    • 프림(Prim) 알고리즘크루스칼(Kruskal) 알고리즘 활용

🔹 pgRouting 설치 방법

pgRouting을 사용하려면 PostgreSQL과 PostGIS가 설치되어 있어야 합니다.

1️⃣ PostgreSQL & PostGIS 설치

sudo apt update
sudo apt install postgresql postgis postgresql-contrib

2️⃣ pgRouting 설치

sudo apt install postgresql-14-pgrouting  # PostgreSQL 14 버전 기준

버전에 맞게 postgresql-<version>-pgrouting 패키지를 설치하세요.

3️⃣ PostgreSQL에서 확장 기능 활성화

CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;

🔹 pgRouting을 활용한 기본 예제

📌 1. 네트워크 테이블 생성

CREATE TABLE ways (
    id SERIAL PRIMARY KEY,
    source INTEGER,
    target INTEGER,
    cost DOUBLE PRECISION,
    reverse_cost DOUBLE PRECISION,
    geom GEOMETRY(LineString, 4326)
);
  • source: 시작 노드 ID
  • target: 도착 노드 ID
  • cost: 정방향 이동 비용
  • reverse_cost: 역방향 이동 비용

📌 2. 최단 경로 찾기 (Dijkstra 알고리즘)

SELECT * FROM pgr_dijkstra(
    'SELECT id, source, target, cost FROM ways',
    1, 10, false
);
  • 1, 10: 노드 ID 1번에서 10번까지 이동하는 최단 경로
  • false: 방향성이 없는 그래프(false), 방향성이 있으면 true

📌 3. A* 알고리즘을 활용한 최단 경로

SELECT * FROM pgr_astar(
    'SELECT id, source, target, cost, x1, y1, x2, y2 FROM ways',
    1, 10, false
);

A* 알고리즘은 휴리스틱 함수를 활용하여 더 효율적인 탐색이 가능함.

📌 4. TSP(외판원 문제) 해결

SELECT * FROM pgr_TSP(
    $$
    SELECT id, source, target, cost FROM ways
    $$,
    ARRAY[1, 5, 10]  -- 방문할 노드 리스트
);
  • 주어진 노드들을 모두 방문하는 최적의 경로를 탐색

🔹 pgRouting 활용 사례

도로 네트워크 분석: 지도 데이터 (OSM)와 연계하여 최단 경로 탐색
물류 최적화: 차량 경로 최적화 (VRP)
배달 서비스 경로 최적화: 음식 배달 서비스 최적 경로
도시 내 이동성 분석: 대중교통, 보행 경로 분석


📌 pgRouting + PostGIS + OpenStreetMap (OSM) 연동

pgRouting을 실무에서 활용할 때는 OpenStreetMap (OSM) 데이터를 가져와 도로 네트워크를 구축하는 방식이 일반적입니다.

  1. OSM 데이터 다운로드

    wget http://download.geofabrik.de/asia/south-korea-latest.osm.pbf
  2. osm2pgrouting을 사용하여 PostgreSQL로 데이터 적재

    osm2pgrouting --f south-korea-latest.osm.pbf \
        --conf /usr/share/osm2pgrouting/mapconfig.xml \
        --dbname routingdb --username user --password pass
  3. 도로 네트워크 테이블에서 최단 경로 찾기

    SELECT * FROM pgr_dijkstra(
        'SELECT id, source, target, cost FROM ways',
        100, 200, false
    );

📌 결론

pgRouting은 GIS 기반 네트워크 분석을 쉽게 수행할 수 있도록 지원하는 강력한 도구입니다. PostgreSQL + PostGIS와 결합하여 공간 데이터를 활용한 최단 경로 분석, 교통 시뮬레이션, 물류 최적화 등의 다양한 분야에서 사용됩니다.

🚀 pgRouting을 활용하면 데이터베이스 내에서 SQL 쿼리만으로 경로 탐색을 할 수 있어, 효율적이고 확장 가능한 GIS 애플리케이션을 구축할 수 있습니다!

profile
@mgkick

0개의 댓글