Di artikel ini saya mau sharing bagaimana menentukan sebuah koordinat berada di geofence tertentu dengan menggunakan Turf.js. Sebelum masuk ke penjelasan lebih lanjut, kita harus memahami terlebih dahulu apa itu geofence.
Geofence adalah area yang didefinisikan oleh batas-batas geografis. Dalam konteks ini, geofence dapat digunakan untuk mengidentifikasi apakah sebuah titik koordinat berada di dalam atau di luar geofence tertentu.
Untuk menentukan apakah sebuah titik koordinat berada di dalam atau di luar geofence, kita dapat menggunakan algoritma yang disebut "point-in-polygon". Algoritma ini membandingkan koordinat titik dengan batas-batas geofence dan menentukan apakah titik tersebut berada di dalam atau di luar geofence.
Algoritma ini dapat diimplementasikan dengan menggunakan berbagai bahasa pemrograman, termasuk JavaScript. Dengan menggunakan Turf.js, kita dapat dengan mudah mengimplementasikan algoritma ini untuk menentukan apakah sebuah titik koordinat berada di dalam atau di luar geofence tertentu.
Persiapan
Sebelum kita mulai, pastikan bahwa kita telah menginstal Turf.js
npm install @turf/turf
Data Geofence
Selanjutnya kita akan membuat data geofence yang akan kita gunakan untuk menguji algoritma point-in-polygon. Kita akan membuat dua geofence, yaitu geofence A dan geofence B. Di real case kita mungkin akan menggunakan lebih banyak data geofence.
const geofences = [{
name: "GEOFENCE A",
area: "POLYGON ((-3.7217298785969 115.63838090675, -3.7220537413814 115.63826288955, -3.7223187199346 115.63816096562, -3.7225248143097 115.63800003307, -3.722653288701 115.63812341469, -3.7227978223688 115.63841577547, -3.7229048843297 115.63859548347, -3.7229209436227 115.63871886509, -3.7227576741301 115.63893880623, -3.7225248143097 115.63905950563, -3.7222705420217 115.63909437435, -3.7220912131008 115.63894148844, -3.7217057896247 115.63839968221, -3.7217298785969 115.63838090675))",
},
{
name: "Geofence B",
area: "POLYGON ((-3.5699621771882275 115.63114368378018, -3.5702533651161104 115.63077406680864, -3.570797790703304 115.63111814910975, -3.571560426039895 115.63171246019817, -3.57190071482121 115.63216460943543, -3.5718740282540185 115.63274971077597, -3.5715080520186318 115.63328235185222, -3.571560820118364 115.63401612755369, -3.570722133147773 115.63472029448724, -3.570180630987183 115.63457002462798, -3.5697266007773276 115.63434087693018, -3.5693196959252274 115.63479148804018, -3.5691590755393277 115.63496314942017, -3.5686665061805276 115.63457691132018, -3.5692982798754276 115.63397609650018, -3.5699835932226276 115.63331090867018, -3.5703262497044275 115.63302123009018, -3.5706046580017277 115.63276373803018, -3.5705189939192272 115.63218438088018, -3.5700799653710273 115.63169085442019, -3.5699621771882275 115.63114368378018))",
},
]
Titik Koordinat
Selanjutnya kita akan membuat titik koordinat yang akan kita gunakan untuk menguji algoritma point-in-polygon. Kita akan membuat dua titik koordinat, yaitu Truck A dan Truck B.
const trucks = [{
id: "Truck A",
location: [-3.57011986, 115.633629]
},
{
id: "Truck B",
location: [-3.7403366, 115.6200883]
},
];
Format Geofences
Karena data geofence yang kita miliki berbentuk string, kita perlu mengubahnya menjadi array koordinat yang dapat digunakan oleh Turf.js. Berikut adalah fungsi untuk mengubah data geofence menjadi array koordinat yang dapat digunakan oleh Turf.js:
function formatGeofences(geofences) {
return geofences
.map((geofence) => {
if (!geofence.area || typeof geofence.area !== "string") {
console.warn(`Area for geofence ${geofence.name} is missing or invalid.`);
return null;
}
try {
// Mengambil bagian dalam dari string POLYGON ((...))
const coordinatesString = geofence.area.replace("POLYGON ((", "").replace("))", "");
// Mengonversi string koordinat menjadi array koordinat [lat, lng]
let coordinates = coordinatesString.split(", ").map((point) => {
const [lat, lng] = point.split(" ").map(Number);
return [lat, lng];
});
// Memastikan geofence tertutup (titik pertama sama dengan titik terakhir)
const isClosedPolygon =
coordinates[0][0] === coordinates[coordinates.length - 1][0] &&
coordinates[0][1] === coordinates[coordinates.length - 1][1];
if (!isClosedPolygon) {
console.warn(`Geofence ${geofence.name} is not a closed polygon and will be removed.`);
return null;
}
return {
name: geofence.name,
geofence: coordinates,
};
} catch (error) {
console.error(`Error formatting geofence ${geofence.name}:`, error);
return null;
}
})
.filter(Boolean); // Delete null from array
}
Implementasi Algoritma Point-in-Polygon
Setelah kita memiliki data geofence dan titik koordinat, kita dapat menggunakan Turf.js untuk mengimplementasikan algoritma point-in-polygon. Berikut adalah fungsi untuk menguji apakah sebuah titik koordinat berada di dalam atau di luar geofence tertentu:
const turf = require("@turf/turf");
const { geofences } = require("./geofences");
function checkTrucksInGeofences(trucks, geofences) {
const results = [];
for (const truck of trucks) {
const point = turf.point(truck.location);
let isInAnyGeofence = false;
for (const geofence of geofences) {
const polygon = turf.polygon([geofence.geofence]);
// Validasi geofence polygon untuk memastikan titik pertama dan terakhir sama
const isClosedPolygon =
JSON.stringify(geofence.geofence[0]) === JSON.stringify(geofence.geofence[geofence.geofence.length - 1]);
if (!isClosedPolygon) {
console.warn(`Geofence ${geofence.name} is not a closed polygon.`);
continue;
}
// Cek apakah truk berada dalam geofence
const isInGeofence = turf.booleanPointInPolygon(point, polygon);
if (isInGeofence) {
results.push({ id: truck.id, geofence: geofence.name });
isInAnyGeofence = true;
break; // Berhenti jika truk ditemukan dalam geofence
}
}
// Jika truk tidak ditemukan dalam geofence mana pun, atau data tidak valid, tandai dengan `null`
if (!isInAnyGeofence) {
results.push({ id: truck.id, geofence: null });
}
}
return results;
}
// Memanggil fungsi dan mencetak hasilnya
const truckLocations = checkTrucksInGeofences(trucks, geofencesNew);
console.log(truckLocations);
Hasil
Kesimpulan
Dalam tutorial ini, kita berhasil mengimplementasikan algoritma point-in-polygon menggunakan Turf.js. Dengan menggunakan Turf.js, kita dapat dengan mudah menguji apakah sebuah titik koordinat berada di dalam atau di luar geofence tertentu.
Top comments (0)