2014-07-06 1 views
0

[0,1] x [0,1]에 R을 사용하여 1'000'000의 무작위 랜덤 포인트를 만든 다음 CSV로 내 보내면 그것을 Postgres/PostGIS에로드 할 수 있습니다.PostGIS에서 경계 상자를 쿼리하면 의도하지 않은 결과 집합

R :

N <- 1000000 
df <- data.frame(id=1:N, lon=runif(N), lat=runif(N)) 
write.table(df,"/media/Volume/temp/random_points.csv",row.names=FALSE,sep=";") 
# manually remove header from CSV 

head(df) 
# id  lat  lon 
#1 1 0.9094180 0.1208861 
#2 2 0.8009161 0.8499304 
#3 3 0.9800282 0.3757218 
#4 4 0.5795991 0.4551454 
#5 5 0.8988043 0.7801994 
#6 6 0.9456310 0.2343178 

PostGIS와 :

create table random_points (id serial, lat float, lon float); 
ALTER TABLE random_points ADD PRIMARY KEY (id); 

# now I import CSV into table 

ALTER TABLE random_points ADD COLUMN geom geometry(POINT,4326); 

UPDATE random_points SET geom = ST_SetSRID(ST_MakePoint(lon,lat),4326); 

CREATE INDEX idx_lon_lat ON random_points USING GIST(geom); 

그리고 지금은 경계 상자 안에 누워있는 모든 포인트를 조회하고 싶습니다 - 인덱스에 의해 구동 :

분 위도 = 0.342, 최대 lat = 0.352, 최소 lon = 0.793, 최대 lon = 0.812

SELECT * 
FROM random_points 
WHERE random_points.geom && ST_MakeEnvelope(0.342, 0.352, 0.793, 0.812, 4326); 
이 지역에 대한 예상 값은 이미 첫 번째 레코드는 않습니다 (190)

것 - 3,691,363,210

하지만 단지 (177) 내가 R로 얻을 수있는 것보다 훨씬 더 크기 207'376의 결과 세트를받을 수 있나요 의도 한 바운딩 박스에 속하지 않는다; 위도와 경도를 어딘가에 혼란스럽게하더라도 :

4;0.579599140677601;0.45514538907446;"...138CE23F" 
9;0.618269162718207;0.392739744856954;"...9DCC8E33F" 
10;0.742938967887312;0.58326911740005;"...127C6E73F" 
17;0.665668761124834;0.475526283029467;"...92284DE53F" 
27;0.668456399813294;0.747356393141672;"...ACFE63E53F" 

내가 뭘 잘못하고 있는지 알기라도 해?


내 의도는 데이터 프레임/테이블 도구를 사용하는 것이 아니라 R에서 그 목적을 위해 PostGIS와를 사용하는 의미가 때 평가 PostGIS와의 경계 상자와 벤치 마크 질의 점이다.

+1

당신은, 포스트 그레스 내 R 저장 프로 시저 PL/R에 관심이있을 수 있습니다 http://www.joeconway.com/plr/ –

답변