docs

Dokumentasi Modul georoute.js

georoute.js mencari rute terpendek di sepanjang garis-garis di dalam data GeoJSON-mu sendiri — jalan, gang, jalur kampus, koridor gedung. Rutenya dihitung di browser: tidak ada layanan rute yang dipanggil, tidak perlu API key, dan tetap jalan tanpa internet selama datanya sudah termuat.

Modul ini murni perhitungan. Ia tidak butuh peta; hasilnya GeoJSON biasa yang bisa digambar dengan map.js atau dipakai begitu saja untuk tahu jarak tempuhnya.

Cara Penggunaan (Import)

import { findRoute } from "https://cdn.jsdelivr.net/gh/crootjs/lib@0.0.16/georoute.js";

Semua fungsi geomeasure.js (getDistance, getLength, isInside, dan lainnya) ikut diekspor dari georoute.js, jadi halaman yang menghitung rute cukup mengimpor dari sini.

findRoute(from, to, geojson, options)

Mencari rute terpendek dari from ke to (keduanya [lng, lat]) di sepanjang LineString dan MultiLineString di dalam geojson. Titik dan polygon di dalam data diabaikan.

Mengembalikan sebuah Feature bergeometri LineString dengan properties.distance berisi panjang rute dalam meter — atau null kalau datanya tidak punya garis, atau kedua titik tidak terhubung.

const jalan = {
    type: "FeatureCollection",
    features: [
        { type: "Feature", properties: {}, geometry: { type: "LineString", coordinates: [[107.60, -6.90], [107.61, -6.90]] } },
        { type: "Feature", properties: {}, geometry: { type: "LineString", coordinates: [[107.61, -6.90], [107.61, -6.91]] } },
    ],
};

const rute = findRoute([107.604, -6.898], [107.612, -6.907], jalan);

rute.properties.distance;  // 1440.70... (meter)
rute.geometry.coordinates; // [[107.604, -6.9], [107.61, -6.9], [107.61, -6.907]]

Di contoh itu kedua titik tidak berada tepat di atas jalan. from dan to boleh di mana saja: masing-masing ditempelkan ke titik terdekat pada garis terdekat, dan rutenya mulai dan berakhir di titik tempel itu. Jadi koordinat klik atau lokasi user bisa langsung dipakai.

Menggambar Rutenya di Peta

Karena hasilnya Feature biasa, addGeoJSON langsung bisa menggambarnya:

import { createMap, addGeoJSON, fitMap, getGeoJSON } from "https://cdn.jsdelivr.net/gh/crootjs/lib@0.0.16/map.js";
import { findRoute } from "https://cdn.jsdelivr.net/gh/crootjs/lib@0.0.16/georoute.js";

createMap("peta");

getGeoJSON("jalan.geojson", (response) => {
    if (!response.data) return;

    const rute = findRoute([107.575914, -6.8732098], [107.5772, -6.8752], response.data);
    if (!rute) {
        console.log("Kedua titik tidak terhubung.");
        return;
    }
    addGeoJSON("peta", rute, { style: { stroke: "#2563eb", strokeWidth: 5 } });
    fitMap("peta", rute);
    console.log(`Panjang rute: ${Math.round(rute.properties.distance)} m`);
});

Contoh lengkap dengan pin A dan B yang bisa digeser: demo · source.

Syarat Data: Garis Harus Bertemu di Koordinat yang Sama

Dua garis dianggap tersambung hanya kalau keduanya punya koordinat yang sama — di ujung atau di tengah garis. Begitulah data jalan dari OpenStreetMap disusun: setiap persimpangan adalah satu titik yang dipakai bersama oleh jalan-jalan yang bertemu di sana.

Akibatnya:

Untuk kasus kedua ada opsi precision: jumlah angka desimal yang dipakai saat membandingkan koordinat. Makin kecil nilainya, makin longgar dua titik dianggap sama.

precision Titik dianggap sama kalau berjarak kira-kira
6 (bawaan) 11 cm
5 1 m
4 11 m
findRoute(from, to, jalanGambarTangan, { precision: 5 });

Kalau findRoute mengembalikan null padahal di peta garisnya tampak tersambung, hampir selalu ini penyebabnya. Cara paling rapi tetap memperbaiki datanya: saat menggambar, pastikan garis yang bertemu benar-benar berbagi satu titik.

Catatan