Rumah  >  Artikel  >  hujung hadapan web  >  Menentukan Koordinat untuk Berada dalam Geofence Tertentu dengan Turf.js

Menentukan Koordinat untuk Berada dalam Geofence Tertentu dengan Turf.js

Barbara Streisand
Barbara Streisandasal
2024-10-29 12:56:29280semak imbas

Dalam artikel ini saya ingin berkongsi cara untuk menentukan koordinat geofence tertentu menggunakan Turf.js. Sebelum pergi ke penjelasan lanjut, kita mesti faham dulu apa itu geofence.

Geofence ialah kawasan yang ditakrifkan mengikut sempadan geografi. Dalam konteks ini, geofence boleh digunakan untuk mengenal pasti sama ada titik koordinat berada di dalam atau di luar geofence tertentu.

Menentukan Koordinat Berada di Geofence Tertentu dengan Turf.js

Untuk menentukan sama ada titik koordinat berada di dalam atau di luar geofence, kita boleh menggunakan algoritma yang dipanggil "titik-dalam-poligon". Algoritma ini membandingkan koordinat titik dengan sempadan geofence dan menentukan sama ada titik itu berada di dalam atau di luar geofence.

Algoritma ini boleh dilaksanakan menggunakan pelbagai bahasa pengaturcaraan, termasuk JavaScript. Menggunakan Turf.js, kami boleh melaksanakan algoritma ini dengan mudah untuk menentukan sama ada titik koordinat berada di dalam atau di luar geofence tertentu.

Persediaan

Sebelum bermula, pastikan kami telah memasang Turf.js

npm install @turf/turf

Data Geofence

Seterusnya kami akan mencipta data geofence yang akan kami gunakan untuk menguji algoritma titik dalam poligon. Kami akan mencipta dua geofence, iaitu geofence A dan geofence B. Dalam kes sebenar, kami 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

Seterusnya kami akan mencipta koordinat yang akan kami gunakan untuk menguji algoritma titik dalam poligon. Kami akan mewujudkan dua titik koordinat, iaitu Lori A dan Lori B.

const trucks = [{
    id: "Truck A",
    location: [-3.57011986, 115.633629]
  },
  {
    id: "Truck B",
    location: [-3.7403366, 115.6200883]
  },
];

Format Geofence

Oleh kerana data geofence yang kami ada adalah dalam bentuk rentetan, kami perlu menukarnya kepada tatasusunan koordinat yang boleh digunakan oleh Turf.js. Berikut ialah fungsi untuk menukar data geofence kepada tatasusunan koordinat yang boleh 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

}

Pelaksanaan Algoritma Point-in-Polygon

Setelah kami mempunyai data geofence dan koordinat titik, kami boleh menggunakan Turf.js untuk melaksanakan algoritma titik dalam poligon. Berikut ialah fungsi untuk menguji sama ada 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);

Keputusan

Menentukan Koordinat Berada di Geofence Tertentu dengan Turf.js

Kesimpulan

Dalam tutorial ini, kami berjaya melaksanakan algoritma titik dalam poligon menggunakan Turf.js. Menggunakan Turf.js, kami boleh menguji dengan mudah sama ada titik koordinat berada di dalam atau di luar geofence tertentu.

Atas ialah kandungan terperinci Menentukan Koordinat untuk Berada dalam Geofence Tertentu dengan Turf.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn