docs

Dokumentasi Modul geomeasure.js

geomeasure.js berisi perhitungan yang paling sering dibutuhkan dari data geospasial: jarak, panjang, luas, titik-di-dalam-area, titik terdekat, dan lingkaran radius. Semuanya fungsi murni — tidak butuh peta, tidak butuh DOM — jadi bisa dipakai dengan atau tanpa map.js.

Posisi selalu [lng, lat] seperti di GeoJSON, dan hasil selalu dalam meter (atau meter persegi).

Cara Penggunaan (Import)

import { getDistance, getArea, isInside } from "https://cdn.jsdelivr.net/gh/crootjs/lib@0.0.16/geomeasure.js";

Fungsi yang menerima geojson sama fleksibelnya dengan parseGeoJSON: FeatureCollection, satu Feature, satu geometri polos, array-nya, atau teks JSON. Contoh-contoh di bawah memakai data dari contoh.geojson.

getDistance(from, to)

Jarak antara dua posisi, mengikuti lengkung bumi.

getDistance([106.8272, -6.1754], [107.6191, -6.9175]); // 120258.27... (Monas ke alun-alun Bandung, sekitar 120 km)

getLength(geojson)

Panjang semua garis di dalam data. Untuk polygon, yang dihitung kelilingnya (termasuk tepi lubang). Titik tidak punya panjang.

getLength({ type: "LineString", coordinates: [[107.60, -6.90], [107.61, -6.90], [107.61, -6.91]] }); // 2215.84...
getLength(data.features[0]); // 110.70... (keliling gedung Rektorat)

getArea(geojson)

Luas semua polygon di dalam data, dalam meter persegi. Lubang dikurangkan. Titik dan garis tidak punya luas.

getArea(data.features[0]); // 710.28... (gedung Rektorat)
getArea(data);             // 1980.88... (kedua gedung)

isInside(position, geojson) dan getFeaturesAt(position, geojson)

isInside menjawab true/false: apakah posisi itu berada di dalam salah satu polygon di dalam data. getFeaturesAt mengembalikan fitur-fitur polygon yang memuatnya (array kosong kalau tidak ada), untuk tahu di polygon yang mana.

isInside([107.5761, -6.8735], data); // true
isInside([107.5759, -6.8736], data); // false (di antara kedua gedung)

getFeaturesAt([107.5761, -6.8735], data).map((feature) => feature.properties.Gedung); // ["Auditorium"]

Titik yang jatuh di dalam lubang sebuah polygon dihitung berada di luar polygon itu.

getNearest(position, geojson)

Fitur titik (Point/MultiPoint) yang paling dekat dengan posisi itu. Mengembalikan { feature, distance }, atau null kalau datanya tidak punya fitur titik. Garis dan polygon tidak ikut dibandingkan.

const terdekat = getNearest([107.5761, -6.8735], data);
terdekat.feature.properties.Gedung; // "ULBI"
terdekat.distance;                  // 38.24...

createCircle(center, radius, steps = 64)

Membuat Feature polygon berbentuk lingkaran dengan pusat center dan jari-jari radius meter. GeoJSON tidak mengenal lingkaran, jadi hasilnya segi banyak dengan steps sisi.

const radiusPresensi = createCircle([107.575914, -6.8732098], 100); // lingkaran 100 m

Contoh: Presensi Berbasis Lokasi

Gabungan yang paling sering dipakai: gambar radiusnya, ambil lokasi user, lalu periksa apakah ia di dalamnya.

import { createMap, addGeoJSON, fitMap } from "https://cdn.jsdelivr.net/gh/crootjs/lib@0.0.16/map.js";
import { locateUser } from "https://cdn.jsdelivr.net/gh/crootjs/lib@0.0.16/mapcontrol.js";
import { createCircle, isInside, getDistance } from "https://cdn.jsdelivr.net/gh/crootjs/lib@0.0.16/geomeasure.js";

const kampus = [107.575914, -6.8732098];
const area = createCircle(kampus, 100);

createMap("peta");
addGeoJSON("peta", area);
fitMap("peta", area);

locateUser("peta", (lokasi) => {
    if (!lokasi) {
        console.log("Lokasi tidak didapat.");
        return;
    }
    if (isInside(lokasi.position, area)) {
        console.log("Di dalam area presensi.");
    } else {
        console.log(`Di luar area, ${Math.round(getDistance(lokasi.position, kampus))} m dari kampus.`);
    }
});

Untuk area yang bentuknya bukan lingkaran, ganti area dengan polygon batas kampus dari data GeoJSON-mu; isInside bekerja sama.

Catatan