Maison > interface Web > js tutoriel > Déterminer les coordonnées devant se trouver dans une certaine barrière géographique avec Turf.js

Déterminer les coordonnées devant se trouver dans une certaine barrière géographique avec Turf.js

Barbara Streisand
Libérer: 2024-10-29 12:56:29
original
317 Les gens l'ont consulté

Dans cet article, je souhaite expliquer comment déterminer les coordonnées d'une barrière géographique particulière à l'aide de Turf.js. Avant d'entrer dans des explications plus approfondies, nous devons d'abord comprendre ce qu'est une barrière géographique.

La géofence est une zone définie par des limites géographiques. Dans ce contexte, la barrière géographique peut être utilisée pour identifier si un point de coordonnées se trouve à l'intérieur ou à l'extérieur d'une barrière géographique particulière.

Menentukan Koordinat Berada di Geofence Tertentu dengan Turf.js

Pour déterminer si un point de coordonnées se trouve à l'intérieur ou à l'extérieur d'une barrière géographique, nous pouvons utiliser un algorithme appelé « point dans le polygone ». Cet algorithme compare les coordonnées du point avec les limites de la barrière géographique et détermine si le point est à l'intérieur ou à l'extérieur de la barrière géographique.

Cet algorithme peut être implémenté à l'aide de divers langages de programmation, dont JavaScript. En utilisant Turf.js, nous pouvons facilement implémenter cet algorithme pour déterminer si un point de coordonnées se trouve à l'intérieur ou à l'extérieur d'une barrière géographique particulière.

Préparation

Avant de commencer, assurez-vous que Turf.js est installé

npm install @turf/turf
Copier après la connexion

Données de géoclôture

Ensuite, nous créerons des données de géofence que nous utiliserons pour tester l'algorithme de point dans le polygone. Nous allons créer deux géofences, à savoir la géofence A et la geofence B. Dans le cas réel, nous utiliserons probablement plus de données de géofence.

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))",
  },
]
Copier après la connexion

Point de coordonnées

Ensuite, nous créerons les coordonnées que nous utiliserons pour tester l'algorithme de point dans le polygone. Nous allons créer deux points de coordonnées, à savoir le camion A et le camion B.

const trucks = [{
    id: "Truck A",
    location: [-3.57011986, 115.633629]
  },
  {
    id: "Truck B",
    location: [-3.7403366, 115.6200883]
  },
];
Copier après la connexion

Format de clôture géographique

Étant donné que les données de géofence dont nous disposons sont sous forme de chaîne, nous devons les convertir en un tableau de coordonnées pouvant être utilisées par Turf.js. Voici une fonction pour convertir les données de géofence en un tableau de coordonnées pouvant être utilisé par 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

}
Copier après la connexion

Implémentation de l'algorithme point dans polygone

Une fois que nous avons les données de géofence et les coordonnées des points, nous pouvons utiliser Turf.js pour implémenter l'algorithme de point dans le polygone. Voici une fonction pour tester si un point de coordonnées se trouve à l'intérieur ou à l'extérieur d'une certaine barrière géographique :

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);
Copier après la connexion

Résultats

Menentukan Koordinat Berada di Geofence Tertentu dengan Turf.js

Conclusion

Dans ce tutoriel, nous avons implémenté avec succès l'algorithme de point dans le polygone à l'aide de Turf.js. En utilisant Turf.js, nous pouvons facilement tester si un point de coordonnées se trouve à l'intérieur ou à l'extérieur d'une barrière géographique particulière.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal