Postgis 데이터베이스 쿼리 최적화


10

raster2pgsql 명령 줄 도구를 사용하여 PostGIS 데이터베이스에로드하는 DTED 형식의 래스터 세트가 있습니다.

각 래스터는 단순히 행에 저장되며 rid 및 래스터 형식의 값으로 설명됩니다.

이제 포인트의 경도와 위도를 사용 하여이 포인트에 해당하는 픽셀 값을 반환하는 데이터베이스 함수를 만들고 싶습니다.

내가 가진 문제는 데이터베이스가 Odroid 보드에서 작동하기 때문에 그렇게하는 데 꽤 많은 시간 (3-4 초)이 걸린다는 것입니다.

나는 처리하는 데이터 세트가 상당히 크다는 것을 알고 있지만 (래스터는 영국 전체를 포괄합니다) PostgreSQL 및 PostGIS에 익숙하지 않기 때문에 더 빨리 수행 할 수 있다고 생각합니다.

이것이 내가 지금까지 한 일입니다.

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그리고 $2길고 위도 각각이다.


2
postgis로 가져올 때 래스터를 타일로 자르셨습니까? (매개 변수 -t 너비 x 높이)?
mutolisp

그래, 내가 했어. 성능이 약간 향상되었습니다. 또한 데이터베이스가 Odroid 보드에 있다고 추가해야하므로 데스크톱 PC보다 훨씬 느리게 작동합니다. 래스터 처리 방식을 변경하여 불필요한 계산을 덜 할 수 있는지 궁금합니다. 예를 들어 처음에 모든 래스터에서 ST_Value 함수를 호출 한 다음 실제로 일부 값이 포함 된 행을 찾습니다. 가장 간단한 접근 방법이지만 훨씬 느리게 작동했습니다.
zedsdead

2
사용 ST_SetSRID(ST_MakePoint($1, $2),4326)문자열 concats 대신에 당신에게 충분한 반복이있는 경우 시간을 절약 할 수 있습니다.
Scro

1
많이 도움이되지 않지만 감사합니다. 테이블을 만들 때 단일 래스터에 대한 경계 상자를 포함하는 다른 열을 추가하려고 생각했습니다. 어쩌면이 방법으로 올바른 래스터를 더 빨리 찾을 수 있습니다 ... 또한 코너 좌표와 lon / lat의 픽셀 단계를 기반으로 래스터의 픽셀 위치를 사전 계산하는 것이 도움이 될지 궁금합니다. 내가 그들을 공유해 주셔서 감사 할 것이라고 생각 :)
zedsdead

2
병목의 위치를 ​​확인하기 위해“설명”을 사용하려고 할 수도 있습니다.
mutolisp

답변:


1

당신은 이것을 시도 할 수 있습니다 :

--calculate and store geom point just One time
WITH point_geom AS 
(
    SELECT ST_setsrid(ST_GeomFromText('POINT('|| $1 || ' '|| $2 || ')'), 4326) as geom
)
-- Your subquery is maybe useless , alias "x" isn't used
SELECT ST_Value( rast, point_geom.geom )
FROM rasters
WHERE rast && point_geom.geom;

그러나 실제 문제는 래스터 쿼리입니다. 데이터 세트를 타일링하면 쿼리 속도가 빨라집니다. PostGIS WKT Raster를 사용 하고이 튜토리얼을 따르십시오 .

도움이 되길 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.