首页  >  文章  >  web前端  >  使用 Turf.js 确定某个地理围栏中的坐标

使用 Turf.js 确定某个地理围栏中的坐标

Barbara Streisand
Barbara Streisand原创
2024-10-29 12:56:29280浏览

在本文中,我想分享如何使用 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