이 기사에서는 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 }
지오펜스 데이터와 점 좌표가 있으면 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);
이 튜토리얼에서는 Turf.js를 사용하여 Point-in-Polygon 알고리즘을 성공적으로 구현했습니다. Turf.js를 사용하면 좌표점이 특정 지오펜스 내부에 있는지 외부에 있는지 쉽게 테스트할 수 있습니다.
위 내용은 Turf.js를 사용하여 특정 지오펜스에 있는 좌표 결정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!