Mam zestaw rastrów w formacie DTED, które ładuję do bazy danych PostGIS za pomocą narzędzia wiersza polecenia raster2pgsql.
Każdy z rastrów jest po prostu przechowywany w rzędzie i opisywany przez rid oraz wartość formatu rastrowego.
Teraz chcę utworzyć funkcję bazy danych, która pobiera długość i szerokość geograficzną punktu i zwraca wartość piksela odpowiadającą temu punktowi.
Problem, który mam, polega na tym, że zajmuje to sporo czasu (3-4 sekundy), ponieważ baza danych działa na płycie Odroid.
Wiem, że zestaw danych, który przetwarzam, jest dość duży (rastry obejmują cały obszar Wielkiej Brytanii), ale ponieważ nie jestem zbyt obeznany z PostgreSQL i PostGIS, podejrzewam, że można to zrobić szybciej.
Oto co zrobiłem do tej pory:
SELECT ST_Value(rast, ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326))
FROM (
SELECT * FROM rasters
WHERE rast && ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326)
) x;
$1
i $2
są odpowiednio długie i łat.
źródło
ST_SetSRID(ST_MakePoint($1, $2),4326)
zamiast konkatek łańcuchowych może zaoszczędzić trochę czasu, jeśli jest wystarczająca liczba iteracji.Odpowiedzi:
Możesz spróbować:
Ale prawdziwym problemem jest pytanie o raster; sąsiadowanie zestawu danych powinno przyspieszyć zapytania. Możesz spróbować użyć PostGIS WKT Raster i postępować zgodnie z tym samouczkiem .
Mam nadzieję, że przyda się
źródło