diff --git a/app/Helpers/GeometryHelper.php b/app/Helpers/GeometryHelper.php index a105bbf35..07d4677b0 100755 --- a/app/Helpers/GeometryHelper.php +++ b/app/Helpers/GeometryHelper.php @@ -406,4 +406,49 @@ public static function getPolygonGeojson($uuid) 'geometry' => $geometry, ]; } + + public static function generateGeoJSON($project = null, $siteUuid = null) + { + $query = SitePolygon::query(); + + if ($project) { + $query->whereHas('site', function ($query) use ($project) { + $query->where('project_id', $project->id); + }); + } + + if ($siteUuid) { + $query->where('site_id', $siteUuid); + } + + $sitePolygons = $query->active()->get(); + + $features = []; + foreach ($sitePolygons as $sitePolygon) { + $polygonGeometry = PolygonGeometry::where('uuid', $sitePolygon->poly_id) + ->select(DB::raw('ST_AsGeoJSON(geom) AS geojsonGeom')) + ->first(); + + if (! $polygonGeometry) { + throw new \Exception('No polygon geometry found for the given UUID.'); + } + + $fieldsToValidate = ['poly_name', 'plantstart', 'plantend', 'practice', 'target_sys', 'distr', 'num_trees', 'site_id', 'uuid']; + $properties = []; + foreach ($fieldsToValidate as $field) { + $properties[$field] = $sitePolygon->$field; + } + + $features[] = [ + 'type' => 'Feature', + 'geometry' => json_decode($polygonGeometry->geojsonGeom), + 'properties' => $properties, + ]; + } + + return [ + 'type' => 'FeatureCollection', + 'features' => $features, + ]; + } } diff --git a/app/Http/Controllers/V2/Exports/ExportProjectEntityAsProjectDeveloperController.php b/app/Http/Controllers/V2/Exports/ExportProjectEntityAsProjectDeveloperController.php index 89941f52e..1d90a6357 100644 --- a/app/Http/Controllers/V2/Exports/ExportProjectEntityAsProjectDeveloperController.php +++ b/app/Http/Controllers/V2/Exports/ExportProjectEntityAsProjectDeveloperController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\V2\Exports; use App\Exports\V2\EntityExport; +use App\Helpers\GeometryHelper; use App\Http\Controllers\Controller; use App\Models\V2\Forms\Form; use App\Models\V2\Nurseries\Nursery; @@ -70,17 +71,13 @@ private function getModelClass(string $entity) private function exportShapefiles(Project $project) { - $filename = storage_path('./'.Str::of($project->name)->replace(['/', '\\'], '-') . ' Sites Shapefiles - ' . now() . '.zip'); - $zip = new \ZipArchive(); - $zip->open($filename, \ZipArchive::CREATE); + $geoJson = GeometryHelper::generateGeoJSON($project); + $filename = Str::of($project->name)->replace(['/', '\\'], '-') . ' Sites GeoJSON - ' . now() . '.geojson'; + $path = storage_path('./' . $filename); - rescue(function () use ($project, $zip) { - $this->addSiteShapefiles($project, $zip); - }); + file_put_contents($path, json_encode($geoJson, JSON_PRETTY_PRINT)); - $zip->close(); - - return response()->download($filename)->deleteFileAfterSend(); + return response()->download($path)->deleteFileAfterSend(); } private function addSiteShapefiles(Project $project, \ZipArchive $mainZip): void diff --git a/app/Http/Controllers/V2/Terrafund/TerrafundCreateGeometryController.php b/app/Http/Controllers/V2/Terrafund/TerrafundCreateGeometryController.php index ec6e8a911..c4fb3105f 100755 --- a/app/Http/Controllers/V2/Terrafund/TerrafundCreateGeometryController.php +++ b/app/Http/Controllers/V2/Terrafund/TerrafundCreateGeometryController.php @@ -1073,45 +1073,9 @@ public function getAllPolygonsAsGeoJSONDownload(Request $request) { try { $siteUuid = $request->query('uuid'); - $polygonsUuids = SitePolygon::where('site_id', $siteUuid) - ->active() - ->pluck('poly_id'); - $features = []; - foreach ($polygonsUuids as $polygonUuid) { - $feature = []; - $polygonGeometry = PolygonGeometry::where('uuid', $polygonUuid) - ->select(DB::raw('ST_AsGeoJSON(geom) AS geojsonGeom')) - ->first(); - if (! $polygonGeometry) { - return response()->json(['message' => 'No polygon geometry found for the given UUID.'], 404); - } - - $sitePolygon = SitePolygon::where('poly_id', $polygonUuid)->first(); - if (! $sitePolygon) { - return response()->json(['message' => 'No site polygon found for the given UUID.'], 404); - } - - $properties = []; - $fieldsToValidate = ['poly_name', 'plantstart', 'plantend', 'practice', 'target_sys', 'distr', 'num_trees', 'site_id', 'uuid']; - foreach ($fieldsToValidate as $field) { - $properties[$field] = $sitePolygon->$field; - } - - $propertiesJson = json_encode($properties); + $geoJson = GeometryHelper::generateGeoJSON(null, $siteUuid); - $feature = [ - 'type' => 'Feature', - 'geometry' => json_decode($polygonGeometry->geojsonGeom), - 'properties' => json_decode($propertiesJson), - ]; - $features[] = $feature; - } - $featureCollection = [ - 'type' => 'FeatureCollection', - 'features' => $features, - ]; - - return response()->json($featureCollection); + return response()->json($geoJson); } catch (\Exception $e) { return response()->json(['message' => 'Failed to generate GeoJSON.', 'error' => $e->getMessage()], 500); }