2016-06-19 2 views
0

저는 postgres/postgis를 처음 사용하며 포스트 기어가있는 빈 타일 래스터를 만드는 방법을 알아 내려고하고 있습니다.PostGIS에서 빈 타일 된 래스터 테이블을 만듭니다.

5000 x 2000 셀을 포함하는 빈 래스터를 생성하고 싶습니다. 나중에 x/y 위치의 특정 셀을 찾거나 x/y 위치의 셀 값을 추가하기 위해 쿼리하고 싶습니다. 기본적으로 미래의 빈 래스터에 개별 셀 값을 추가 할 것입니다 (예 : 시간 경과에 따른 셀의 동물 관찰).

INSERT INTO myRasterTable(rid,rast) 
VALUES(1, ST_MakeEmptyRaster(5000, 2000, 2485869.5728, 1299941.7864, 100, 100, 0, 0, 2056)); 

(참조 : http://suite.opengeo.org/docs/latest/dataadmin/pgGettingStarted/raster2pgsql.html)

빈 래스터를 첨가 한 다음

CREATE TABLE myRasterTable(rid serial primary key, rast raster); 

하고 :

는 I이 대부분이 제 래스터 테이블을 생성함으로써 가능하다는 것을 알았다

또한 밴드를 추가하고 하나의 래스터 셀에 값을 추가했습니다.

,776,

(참조 : https://gis.stackexchange.com/questions/14960/postgis-raster-value-of-a-lat-lon-point) 내가 지금 내가 설정 한 래스터 셀의 값을 조회 할 수 있습니다

: 나는 수많은 게시물이 말을 발견했다

// Location with value 
SELECT rid, ST_Value(rast, ST_Transform(ST_SetSRID(ST_MakePoint(7.5,48.5),4326),2056),false) val FROM myRasterTable 
// Return = 987.654296875 in 0.5224609375 Seconds 

// Location without value: 
SELECT rid, ST_Value(rast, ST_Transform(ST_SetSRID(ST_MakePoint(7.0,48.5),4326),2056),false) val FROM myRasterTable 
// Return = 0 in 0.51311993598938 Seconds 

, 즉 더 큰 래스터를 들어, 그것은 필수적이다 나도 몰라 이제

: 관해서는 래스터 타일 당 약 100X100 세포 (http://postgis.17.x6.nabble.com/raster-loading-and-ST-Value-performance-td4999924.htmlhttps://duncanjg.wordpress.com/2013/09/21/effect-of-tile-size-and-data-storage-on-postgis-raster-query-times/ 참조)의 범위 타일로되어, 성능을 조회 할 수

  1. PostGIS에서 내 큰 래스터에서 타일을 만드는 방법 또는 PostGIS에서 처음부터 타일 된 래스터를 만들 수있는 방법은 무엇입니까? 즉 : 여러 개의 밴드가 포함 된 100X100 셀 크기의 타일이있는 5000X2000 래스터를 포함하는 래스터 타일 컬렉션을 만들기 위해 어떤 쿼리를 사용해야합니까?
  2. 타일을 만든 후에는 별도의 공간 인덱스를 만들어야합니까, 아니면 자동으로 완료해야합니까?
  3. 마지막으로 래스터가 바둑판 모양으로 배열 된 후 특정 위치의 셀 값을 쿼리하는 방법은 무엇입니까?

도움이 필요하십니까?

답변

0

많은 시행 착오 끝에 나는 해결책을 찾은 것 같다.

CREATE TABLE myRasterTable (rid integer, rast raster); 
INSERT INTO myRasterTable(rast) VALUES(ST_Tile(ST_MakeEmptyRaster(5000, 2000, 2485869.5728, 1299941.7864, 100, 100, 0, 0, 2056), 10,10, TRUE, NULL)); 

이 X 2000 5000의 범위와 임시 래스터한다 :

는 5000 X 2000 개 세포의 확장을 추가 빈 타일을 포함 PostGIS와의 새 테이블을 만들려면,이 쿼리를 사용 ST_MakeEmptyRaster를 사용합니다. 그런 다음 ST_Tile을 사용하여 임시 래스터를 10X10 셀 타일로 바꿔 타일에 추가합니다.

UPDATE myRasterTable SET rast = ST_AddBand(rast, 1, '32BUI'::text, 0, NULL); 

을 그리고 마지막으로, 나는 추가로 값을 검색 할 수 있습니다 :

그때 내 밴드를 추가 할 수 있습니다

// Add cell value 
UPDATE myRasterTable SET rast = ST_SetValue(rast, 1,ST_Transform(ST_SetSRID(ST_MakePoint(7.5,48.5),4326),2056),987654321) WHERE ST_Intersects(rast, ST_Transform(ST_SetSRID(ST_MakePoint(7.5,48.5),4326),2056)); 

// Get cell value 
SELECT rid, ST_Value(rast, ST_Transform(ST_SetSRID(ST_MakePoint(7.5,48.5),4326),2056), false) FROM myRasterTable WHERE ST_Intersects(rast, ST_Transform(ST_SetSRID(ST_MakePoint(7.5,48.5),4326),2056)); 
// Return = 987654321 in 0.22717499732971 Seconds 

당신이 볼 수 있듯이,이 이미 감소 질의 시간에 ~ 2/원래 시간의 5. 내가 추가로 인덱스 추가하면

는 :

CREATE INDEX myRasterTable_rast_gist_idx ON myRasterTable USING GIST (ST_ConvexHull(rast)); 

을 그리고 다시 쿼리를 수행, 내가 얻을 : 당신이 볼 수 있듯이

// Get cell value 
SELECT rid, ST_Value(rast, ST_Transform(ST_SetSRID(ST_MakePoint(7.5,48.5),4326),2056), false) FROM myRasterTable WHERE ST_Intersects(rast, ST_Transform(ST_SetSRID(ST_MakePoint(7.5,48.5),4326),2056)); 
// Return = 987654321 in 0.084153890609741 Seconds 

에서, querytime 다시 더 후 약간의 절단 반으로, 원래 쿼리의 1/5 미만의 쿼리 시간이 발생합니다. 다른 타일 크기를 시도해 보았을 때 10 x 10 크기의 타일 크기가 최상의 성능을 나타내지 만 100 x 100 크기의 타일 크기보다 약간 낫다는 것을 알게되었습니다.

누구나 추가 최적화 기능이 있다면 언제든지 추가하십시오. .

EDIT (2016년 7월 8일)

나는 이것에 대해 작은 블로그 게시물을 작성했습니다. 관심이 있으시면 여기를 참조하십시오 : http://www.geonet.ch/postgres-postgis-of-rasters-and-geojsons/

관련 문제