georoute.jsgeoroute.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.
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.
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.
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.
properties.distance adalah panjang di sepanjang garis, dari titik tempel awal sampai titik tempel akhir. Jarak dari from/to yang kamu berikan ke titik tempelnya tidak termasuk; hitung dengan getDistance kalau perlu (misalnya untuk memberi tahu “titikmu 300 m dari jalan terdekat”).