ホームページ > ウェブフロントエンド > jsチュートリアル > Turf.js を使用して特定のジオフェンス内にある座標を決定する

Turf.js を使用して特定のジオフェンス内にある座標を決定する

Barbara Streisand
リリース: 2024-10-29 12:56:29
オリジナル
291 人が閲覧しました

この記事では、Turf.js を使用して特定のジオフェンスの座標を決定する方法を共有したいと思います。詳しい説明に入る前に、まずジオフェンスとは何かを理解する必要があります。

ジオフェンスは、地理的境界によって定義されるエリアです。このコンテキストでは、ジオフェンスを使用して、座標点が特定のジオフェンスの内側にあるか外側にあるかを識別できます。

Menentukan Koordinat Berada di Geofence Tertentu dengan Turf.js

座標点がジオフェンスの内側にあるか外側にあるかを判断するには、「ポイントインポリゴン」と呼ばれるアルゴリズムを使用できます。このアルゴリズムは、ポイントの座標をジオフェンスの境界と比較し、ポイントがジオフェンスの内側にあるか外側にあるかを判断します。

このアルゴリズムは、JavaScript を含むさまざまなプログラミング言語を使用して実装できます。 Turf.js を使用すると、このアルゴリズムを簡単に実装して、座標点が特定のジオフェンスの内側にあるか外側にあるかを判断できます。

準備

始める前に、Turf.js がインストールされていることを確認してください

npm install @turf/turf
ログイン後にコピー

ジオフェンスデータ

次に、ポイントインポリゴンアルゴリズムをテストするために使用するジオフェンスデータを作成します。ジオフェンス A とジオフェンス B という 2 つのジオフェンスを作成します。実際のケースでは、おそらくさらに多くのジオフェンス データを使用することになります。

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 という 2 つの座標点を作成します。

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート