/
petrhlam
/
project_moon
Обзор
Документация
Войти
/
petrhlam
/
project_moon
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
api/app/Http/Controllers/MapController.php
171 строка
7 KB
Andrey Sukhikh
Added new python service
19 май 2025, 20:30
19 май 2025, 20:30
aced71a
Код
Авторство
О чём код?
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; use App\Models\Map; use Illuminate\Support\Facades\Storage; class MapController extends Controller { public function index() { $maps = Map::all(); return response()->json([ 'maps' => $maps ]); } public function upload(Request $request) { $UrlGEO = env('GEOSERVER_URL'); $request->validate([ 'file' => 'required|file|mimes:tif,tiff', ], [ 'file.required' => 'Файл обязателен для загрузки.', 'file.file' => 'Некорректный файл.', 'file.mimes' => 'Разрешены только файлы формата .tif или .tiff.', ]); $file = $request->file('file'); $filename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME); // без расширения // Сохраняем файл локально $path = $file->storeAs('uploads', $filename . '.tiff', 'public'); $filePath = storage_path("app/public/$path"); $fileContent = file_get_contents($filePath); $workspace = 'Moon'; // $geoserverStore = $filename; // $layerName = $filename; // $filename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME); $filename = preg_replace('/[^A-Za-z0-9_\-]/', '_', $filename); $filename = mb_convert_encoding($filename, 'UTF-8', 'auto'); $geoserverStore = $filename; $layerName = $filename; // $geoserverStore = mb_convert_encoding($filename, 'UTF-8', 'auto'); // $layerName = mb_convert_encoding($filename, 'UTF-8', 'auto'); // 1. Создание coverage store $createStoreUrl = "$UrlGEO/rest/workspaces/$workspace/coveragestores"; $storeCreatePayload = [ 'coverageStore' => [ 'name' => $geoserverStore, 'type' => 'GeoTIFF', 'enabled' => true, 'workspace' => $workspace ] ]; $createStoreResponse = Http::withBasicAuth(env('GEOSERVER_USER'), env('GEOSERVER_PASS')) ->withHeaders([ 'Content-Type' => 'application/json' ]) ->post($createStoreUrl, $storeCreatePayload); if (!$createStoreResponse->successful() && $createStoreResponse->status() !== 401) { \Log::error('Ошибка при создании хранилища в GeoServer', [ 'status' => $createStoreResponse->status(), 'body' => $createStoreResponse->body(), ]); return response()->json([ 'error' => 'Не удалось создать хранилище в GeoServer.', 'geoserver_response' => $createStoreResponse->body(), // ← покажет точную причину 'status' => $createStoreResponse->status() ], 500); } // 2. Загрузка GeoTIFF файла $uploadUrl = "$UrlGEO/rest/workspaces/$workspace/coveragestores/$geoserverStore/file.geotiff"; $uploadResponse = Http::withBasicAuth(env('GEOSERVER_USER'), env('GEOSERVER_PASS')) ->withHeaders([ 'Content-Type' => 'application/geotiff' ]) ->withBody($fileContent, 'application/geotiff') ->put($uploadUrl); if (!$uploadResponse->successful()) { \Log::error('Ошибка загрузки GeoTIFF файла в GeoServer', [ 'status' => $uploadResponse->status(), 'body' => $uploadResponse->body(), 'headers' => $uploadResponse->headers() ]); return response()->json([ 'error' => 'Ошибка загрузки GeoTIFF файла в GeoServer.', 'geoserver_response' => $uploadResponse->body(), 'status' => $uploadResponse->status() ], 500); } $publishLayerUrl = "$UrlGEO/rest/workspaces/$workspace/coveragestores/$geoserverStore/coverages"; $coveragePayload = [ 'coverage' => [ 'name' => $layerName, 'nativeName' => $layerName, 'title' => $layerName, 'srs' => 'EPSG:3010', 'enabled' => true ] ]; $coverageResponse = Http::withBasicAuth(env('GEOSERVER_USER'), env('GEOSERVER_PASS')) ->withHeaders([ 'Content-Type' => 'application/json' ]) ->post($publishLayerUrl, $coveragePayload); if (!$coverageResponse->successful()) { // Обработка ошибки } // 3. Обновление свойств слоя (coverage) - PUT запрос для установки projectionPolicy и nativeCRS $updateCoverageUrl = "$UrlGEO/rest/workspaces/$workspace/coveragestores/$geoserverStore/coverages/$layerName.json"; $updatePayload = [ 'coverage' => [ 'projectionPolicy' => 'FORCE_DECLARED', 'nativeCRS' => 'EPSG:3010', 'srs' => 'EPSG:3010', 'enabled' => true ] ]; $updateResponse = Http::withBasicAuth(env('GEOSERVER_USER'), env('GEOSERVER_PASS')) ->withHeaders([ 'Content-Type' => 'application/json' ]) ->put($updateCoverageUrl, $updatePayload); if (!$updateResponse->successful()) { \Log::error('Ошибка обновления свойства слоя в GeoServer', [ 'status' => $updateResponse->status(), 'response' => $updateResponse->body() ]); return response()->json([ 'error' => 'Ошибка обновления свойства слоя в GeoServer.', 'details' => $updateResponse->body(), 'status' => $updateResponse->status() ], 500); } $wmsUrl = "$UrlGEO/$workspace/wms"; // 4. Сохраняем в БД $layer = new Map(); $layer->filename = $filename . '.tiff'; $layer->geoserver_path = "$workspace:$layerName"; $layer->url = $wmsUrl; $layer->save(); return response()->json([ 'message' => 'Файл успешно загружен и опубликован в GeoServer.', 'layer' => $layer ]); } }