首頁  >  文章  >  web前端  >  使用 Turf.js 確定某個地理圍籬中的座標

使用 Turf.js 確定某個地理圍籬中的座標

Barbara Streisand
Barbara Streisand原創
2024-10-29 12:56:29279瀏覽

在本文中,我想分享如何使用 Turf.js 確定特定地理圍欄的座標。在進一步解釋之前,我們必須先了解什麼是地理圍欄。

地理圍籬是由地理邊界定義的區域。在這種情況下,地理圍籬可用於識別座標點是在特定地理圍籬內部還是外部。

Menentukan Koordinat Berada di Geofence Tertentu dengan Turf.js

為了確定座標點是在地理圍籬內部還是外部,我們可以使用一種稱為「多邊形內點」的演算法。該演算法將點的座標與地理圍欄的邊界進行比較,並確定該點是在地理圍欄內部還是外部。

演算法可以使用各種程式語言來實現,包括 JavaScript。使用Turf.js,我們可以輕鬆實作該演算法來確定座標點是在特定地理圍籬內部還是外部。

準備

開始之前,請確保我們已經安裝了 Turf.js

npm install @turf/turf

地理圍籬數據

接下來我們將建立地理圍欄數據,用於測試多邊形點演算法。我們將創建兩個地理圍欄,即地理圍欄 A 和地理圍欄 B。在實際情況中,我們可能會使用更多的地理圍欄資料。

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))",
  },
]

座標點

接下來我們將建立用於測試多邊形內點演算法的座標。我們將創建兩個座標點,即卡車 A 和卡車 B。

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

地理圍欄格式

由於我們擁有的地理圍欄資料是字串形式,因此我們需要將其轉換為 Turf.js 可以使用的座標數組。這是一個將地理圍欄資料轉換為 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

}

多邊形內點演算法的實現

一旦我們有了地理圍欄資料和點座標,我們就可以使用 Turf.js 來實作點多邊形演算法。這是一個測試座標點是否在某個地理圍籬內部還是外部的函數:

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);

結果

Menentukan Koordinat Berada di Geofence Tertentu dengan Turf.js

結論

在本教程中,我們使用 Turf.js 成功實作了多邊形點演算法。使用Turf.js,我們可以輕鬆測試座標點是否在特定地理圍欄內部或外部。

以上是使用 Turf.js 確定某個地理圍籬中的座標的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn