geospatiale/operations/pole_of_inaccessibility.js

//Initialise functions
{
	if (!global.Geospatiale)
		global.Geospatiale = {};
	
	/**
	 * Finds the pole of inaccessibility for a GeoJSON feature. Depends on `npm polylabel`.
	 * 
	 * @param {Object} arg0_feature
	 * @param {number} [arg1_precision=0.0001]
	 * 
	 * @returns {number[]|null} - [lat, lng]
	 */
	Geospatiale.getPoleOfInaccessibility = function (arg0_feature, arg1_precision) {
		//Convert from parameters
		let geometry = arg0_feature.geometry;
		let precision = Math.returnSafeNumber(arg1_precision, 0.0001);
		
		if (!geometry) return null; //Internal guard clause if geometry does not exist
		
		if (geometry.type === "Polygon") {
			let poi = polylabel.default(geometry.coordinates, precision);
			
			//Return statement
			return [poi[1], poi[0]];
		} else if (geometry.type === "MultiPolygon") {
			//For MultiPolygons, find the POI of the largest part by area
			let best_poi = null;
			let largest_area = -1;
			
			//Iterate over all shells
			geometry.coordinates.forEach((local_polygon_coords) => {
				//Create a temporary polygon to calculate area
				let poly_part = turf.polygon(local_polygon_coords);
				let poly_part_area = turf.area(poly_part);
				
				if (poly_part_area > largest_area) {
					largest_area = poly_part_area;
					best_poi = polylabel.default(local_polygon_coords, precision);
				}
			});
			
			//Return statement
			return [best_poi[1], best_poi[0]];
		}
		
		//Return statement
		return null;
	};
}