diff --git a/backend/src/routes/properties.js b/backend/src/routes/properties.js index 44ce1e9..0099609 100644 --- a/backend/src/routes/properties.js +++ b/backend/src/routes/properties.js @@ -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(