> 웹 프론트엔드 > JS 튜토리얼 > Turf.js를 사용하여 특정 지오펜스에 있는 좌표 결정

Turf.js를 사용하여 특정 지오펜스에 있는 좌표 결정

Barbara Streisand
풀어 주다: 2024-10-29 12:56:29
원래의
292명이 탐색했습니다.

이 기사에서는 Turf.js를 사용하여 특정 지오펜스의 좌표를 결정하는 방법을 공유하고 싶습니다. 자세한 설명에 앞서 먼저 지오펜스가 무엇인지부터 이해해야 합니다.

지오펜스는 지리적 경계로 정의되는 영역입니다. 이러한 맥락에서 지오펜스를 사용하면 좌표점이 특정 지오펜스 내부에 있는지 외부에 있는지 식별할 수 있습니다.

Menentukan Koordinat Berada di Geofence Tertentu dengan Turf.js

좌표점이 지오펜스 내부에 있는지 외부에 있는지 확인하려면 '폴리곤 내 점'이라는 알고리즘을 사용할 수 있습니다. 이 알고리즘은 지점의 좌표를 지오펜스 경계와 비교하여 해당 지점이 지오펜스 내부에 있는지 외부에 있는지 판단합니다.

이 알고리즘은 JavaScript를 포함한 다양한 프로그래밍 언어를 사용하여 구현할 수 있습니다. Turf.js를 사용하면 이 알고리즘을 쉽게 구현하여 좌표점이 특정 지오펜스 내부에 있는지 외부에 있는지 확인할 수 있습니다.

준비

시작하기 전에 Turf.js가 설치되어 있는지 확인하세요

npm install @turf/turf
로그인 후 복사

지오펜스 데이터

다음으로 Point-in-Polygon 알고리즘을 테스트하는 데 사용할 지오펜스 데이터를 생성하겠습니다. 지오펜스 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))",
  },
]
로그인 후 복사

좌표점

다음으로 Point-in-Polygon 알고리즘을 테스트하는 데 사용할 좌표를 생성하겠습니다. 트럭 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

}
로그인 후 복사

Point-in-Polygon 알고리즘 구현

지오펜스 데이터와 점 좌표가 있으면 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를 사용하여 Point-in-Polygon 알고리즘을 성공적으로 구현했습니다. Turf.js를 사용하면 좌표점이 특정 지오펜스 내부에 있는지 외부에 있는지 쉽게 테스트할 수 있습니다.

위 내용은 Turf.js를 사용하여 특정 지오펜스에 있는 좌표 결정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿