fix lawn section creation

This commit is contained in:
Jake Kasper
2025-08-22 14:38:59 -04:00
parent 219f6e0256
commit c3a8b5dcd8

View File

@@ -8,7 +8,12 @@ const router = express.Router();
// Helper function to calculate polygon area (in square feet)
const calculatePolygonArea = (coordinates) => {
if (!coordinates || coordinates.length < 3) return 0;
if (!coordinates || coordinates.length < 3) {
console.log('Invalid coordinates for area calculation:', coordinates);
return 0;
}
console.log('Calculating area for coordinates:', coordinates);
// Shoelace formula for polygon area
let area = 0;
@@ -21,14 +26,26 @@ const calculatePolygonArea = (coordinates) => {
}
area = Math.abs(area) / 2;
console.log('Raw shoelace area (in deg²):', area);
// Convert from decimal degrees to square feet (approximate)
// This is a rough approximation - in production you'd use proper geodesic calculations
// Convert from decimal degrees to square feet
// Assuming coordinates are [longitude, latitude] (GeoJSON standard)
const avgLat = coordinates.reduce((sum, coord) => sum + coord[1], 0) / n;
const meterToFeet = 3.28084;
const degToMeter = 111320 * Math.cos(avgLat * Math.PI / 180);
console.log('Average latitude:', avgLat);
return area * Math.pow(degToMeter * meterToFeet, 2);
// More accurate conversion using Haversine-based approach
const latInRadians = avgLat * Math.PI / 180;
const metersPerDegreeLat = 111320; // meters per degree latitude (constant)
const metersPerDegreeLng = 111320 * Math.cos(latInRadians); // meters per degree longitude (varies with latitude)
// Convert to square meters, then to square feet
const areaInSquareMeters = area * metersPerDegreeLat * metersPerDegreeLng;
const areaInSquareFeet = areaInSquareMeters * 10.7639; // 1 m² = 10.7639 ft²
console.log('Area in square meters:', areaInSquareMeters);
console.log('Area in square feet:', areaInSquareFeet);
return areaInSquareFeet;
};
// @route GET /api/properties
@@ -273,7 +290,10 @@ router.post('/:id/sections', validateParams(idParamSchema), validateRequest(lawn
// Calculate area from polygon if provided
let calculatedArea = area;
if (polygonData && polygonData.coordinates && polygonData.coordinates[0]) {
console.log('Original polygon data:', JSON.stringify(polygonData, null, 2));
console.log('Coordinates for calculation:', polygonData.coordinates[0]);
calculatedArea = calculatePolygonArea(polygonData.coordinates[0]);
console.log('Calculated area:', calculatedArea);
}
const result = await pool.query(