2014-09-10 2 views
0

x, y, shapeid (총 289 개)으로 그룹화되고 다각형을 형성하는 + 500k 행을 포함하는 하나의 표가 있습니다.인접한 다각형 찾기 R

shapeid  x   y 
1   679400.3 6600354 
1   679367.9 6600348 
1   679313.3 6600340 
1   679259.5 6600331 
1   679087.5 6600201 
0   661116.3 6606615 
0   661171.5 6606604 
0   661182.7 6606605 
0   661198.9 6606606 
0   661205.9 6606605 
...   ...  ... 

내가 교차 또는 서로 가까운 자리 잡고 좌표를 찾으려면, 각각의 물리적 이웃을 찾는 본질적으로 을 shapeid. 내가 클래스를 실행하면

library(sp) 
library(rgeos) 

mydata <- read.delim('d:/temp/testfile.txt', header=T, sep=",") 

sp.mydata <- mydata 
coordinates(sp.mydata) <- ~x+y 

, 다 괜찮 은데 :

class(sp.mydata) 
[1] "SpatialPointsDataFrame" 
attr(,"package") 
[1] "sp" 
shapeid shapeid_neighbour1 shapeid_neighbour2 

그래서 내가 지금처럼 SP와 rgeos를 사용하여 시도 :

결과는 같을한다

이제 각 지점별로 거리를 계산해보십시오.

d <- gDistance(sp.mydata, byid=T) 

R Studio에서 치명적인 오류가 발생했습니다. 어떤 아이디어?

min.d <- apply(d, 1, function(x) order(x, decreasing=F)[2]) 

하는, 즉 가장 가까운 지점 두 번째 최단 거리를 찾으려면 : 내 계획은 사용 후입니다. 그러나 아마도 이것은 내가 원하는 것을 할 수있는 최선의 방법이 아니겠습니까? 각 셰이드 아이디에 대한 물리적 이웃을 찾는 것일까요? 당신의 dataframe의 각 shapeid 다각형의 정점을 식별하는 가정

+0

정말 모양 사이의 유클리드 거리에 관심이 있습니까? 일반적으로 SHP는 지구 타원체의 기하학을 나타냅니다. –

+0

질문 주제로 돌아 가기. 다각형 사이의 거리 행렬을 계산 중입니다. 100k x 100k는 RAM보다 좋을 수 있습니다. 이 행렬을 계산하여 행 단위로 파일에 저장해보십시오. –

+0

다각형의 모든 꼭지점에서'SpatialPOINTSDataFrame'을 생성했습니다. 'SpatialPOLYGONS'가 필요합니다. 2 열 매트릭스의 집합에서 spatialPolygons을 만드는 방법을 연구하면,'spdep '패키지의 함수를 사용하여 인접성을 계산할 수 있습니다. – Spacedman

답변

1

, 당신은 다각형의 쌍 사이의 거리 (즉, 가정 알게 기능 gDistance를 적용 한 후 좌표로부터 SpatialPolygons 객체를 생성하기 위해 먼저 무엇입니다 필요 를 찾고 있습니다). SpatialPolygons을 만들려면 Polygons이 필요하고 차례로 Polygon 개체가 필요합니다. 자세한 내용은 sp 패키지의 도움말 페이지 Polygon에 있습니다.

곧 문제가 발생할 수 있습니다. 각 폴리곤의 좌표를 닫아야합니다. 즉, 마지막 꼭지점은 각 셰이드 ID의 첫 번째 꼭지점과 동일해야합니다. 귀하의 데이터에서 볼 수있는 한, 귀하에게는 해당되지 않습니다. 따라서 데이터의 각 하위 집합에 대해 행을 "수동으로"추가해야합니다.

이 (df이 시작 dataframe이라고 가정) 시도 할 수 있습니다 :

require(rgeos) 
    #split the dataframe for each shapeid and coerce to matrix 
    coordlist<-lapply(split(df[,2:3],df$shapeid),as.matrix) 
    #apply the following command only if the polygons don't close 
    #coordlist<-lapply(coordilist, function(x) rbind(x,x[1,])) 
    #create a SpatialPolygons for each shapeid 
    SPList<-lapply(coordlist,function(x) SpatialPolygons(list(Polygons(list(Polygon(x)),1)))) 
    #initialize a matrix of distances 
    distances<-matrix(0,ncol=length(SPList),nrow=length(SPList)) 
    #calculate the distances 
    for (i in 1:(length(SPList)-1)) 
     for (j in (i+1):length(SPList)) 
     distances[i,j]<-gDistance(SPList[[i]],SPList[[j]]) 

이것은 약간의 시간이 필요할 수 있습니다, 당신은 289 * 2분의 288 다각형의 거리를 계산하기 때문에. 결국 거리의 행렬을 얻을 수 있습니다.

+0

공간 배열 중 하나가 좌표 행렬에서 하나의 링을 만들 때 "공간 목록 목록의 폴리곤 목록"을 바로 가기하는 기능을 가지고 있다고 확신하지만, 그것이 무엇인지 그리고 그것의 쉬운 점을 결코 기억할 수는 없습니다 어쨌든 쓰려면 ... – Spacedman

+0

일반적인 용어로는 대답하기가 어려울 것입니다.하지만이 계산을 계산하는 데 얼마나 걸릴 것이라고 생각하십니까? 나는 8GB RAM과 I5-2400 CPU @ 3.10ghz를 가지고있다. – user3471881

+0

그것은 당신의 폴리곤이 얼마나 복잡한가에 달려 있지만, 2 분이면 충분하다고 생각한다. 그러나, 당신은'system.time()'안에서 루프를 시작하고, 언제든지 멈추고,'289 * 288/2/(sum (289-1 : (i-1)) + ji)'라고 말합니다. – nicola

관련 문제