2015-01-07 17 views
5

Tương tự như câu hỏi trước của tôi: Closest point to a pathĐiểm gần nhất với đường dẫn ước tính

Tôi muốn có thể tìm thấy tất cả các trung tâm gần nhất với đường dẫn. Tuy nhiên, một số dữ liệu bị thiếu trong đường dẫn và tôi muốn làm các đoạn tuyến tính để nội suy giữa các điểm để 'ước tính' một con đường có thể, và vẫn tìm thấy các trung tâm có khả năng gần với 'đường dẫn ước tính' đó.

set.seed(1) 
n <- 10000 
x <- 100*cumprod(1 + rnorm(n, 0.0001, 0.002)) 
y <- 50*cumprod(1 + rnorm(n, 0.0001, 0.002)) 

# original path 
path <- data.frame(cbind(x=x, y=y)) 

# path with missing points/points every hundred 
path.w.missing <- path[seq(1,n,by=100),] 


centers <- expand.grid(x=seq(0, 500,by=0.5) + rnorm(1001), 
         y=seq(0, 500, by=0.2) + rnorm(2501)) 

centers$id <- seq(nrow(centers)) 

ngắn của mô phỏng hàng triệu điểm tuyến tính giữa các điểm được đưa ra trong con đường .... Tôi không chắc chắn làm thế nào một sẽ đi về việc này ...

Đối với tôi nó hơi giống tìm giao điểm của một dòng và một ma trận của các tế bào ... các loại .... nhưng có lẽ tôi là dặm ngoài khơi ...

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều.

+0

Bạn có nghĩa là để tìm tất cả các điểm nằm trên con đường trong một ngưỡng nhất định? –

+0

Chia đường dẫn thành các đoạn đường. Đối với mỗi phân khúc, hãy xác định điểm gần nhất. Lặp lại các phân đoạn bằng cách sử dụng một số phiên bản áp dụng. Có thể dễ hiểu nhất nếu bạn xoay phân đoạn thành ngang hoặc dọc sao cho khoảng cách tới các điểm chỉ là tọa độ y (hoặc x). –

+0

Nếu đưa ra một ngưỡng là cách duy nhất có thể thì vui lòng giới thiệu một giá trị ngưỡng cho vấn đề ... nhưng lý tưởng là không ... –

Trả lời

-1

Sử dụng chức năng smooth.spline (Fit một Smoothing Spline)

mx=path.w.missing$x 
my=path.w.missing$y 
s<-smooth.spline(mx,my) 
plot(mx,my) 
lines(s) #draw the estimated path 

enter image description here

predict(s,1:10) #And now you can generate all the points on the estimated path 

> predict(s,1:10) 
$x 
[1] 1 2 3 4 5 6 7 8 9 10 

$y 
[1] 2.418294 2.904019 3.389744 3.875469 4.361195 4.846920 5.332645 5.818370 6.304095 6.789820 

Và bạn có thể sử dụng mô hình tuyến tính để phù hợp với nó.

> summary(lm(my~mx)) 

Call: 
lm(formula = my ~ mx) 

Residuals: 
    Min  1Q Median  3Q  Max 
-12.772 -8.642 3.112 5.831 17.237 

Coefficients: 
      Estimate Std. Error t value Pr(>|t|)  
(Intercept) -12.60098 3.46583 -3.636 0.000444 *** 
mx   0.56579 0.02138 26.469 < 2e-16 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 7.896 on 98 degrees of freedom 
Multiple R-squared: 0.8773, Adjusted R-squared: 0.876 
F-statistic: 700.6 on 1 and 98 DF, p-value: < 2.2e-16 

như bạn có thể thấy, p < 0.05, vì vậy mx của tôi và có thể phù hợp như một dòng:

my=-12.60098+0.56579*mx 

ggplot2 có thể vẽ đường này một cách dễ dàng:

d=data.frame(mx,my) 
library(ggplot2) 
ggplot(d,aes(mx,my))+geom_point()+geom_smooth(method="lm") 

enter image description here

giả sử rằng một dòng là Ax+By+C=0 và điểm là (X0,Y0) , Trỏ chuột tới dòng khoảng cách:

|AX0+BY0+C|/√(A²+B²) 

như vậy trong trường hợp này, 0,56579 * mx-my-12,60098 = 0, A = 0,56579, B = -1, C = -12,60098, thật dễ dàng để tính toán khoảng cách từ chỉ vào dòng và tìm điểm gần nhất với đường thẳng.

Hơn nữa, nếu bạn muốn tìm điểm gần nhất, loại bỏ các √ mẫu (A² + B²) sẽ không ảnh hưởng đến các loại, vì vậy, việc tối ưu hóa công thức:

|AX0+BY0+C| 

quả

> for(i in 1:2503501){ 
+ temp=abs(centers[[1]][i]*0.56579-centers[[2]][i]-12.60098) 
+ if(m>temp){ 
+ m=temp 
+ pos=i 
+ } 
+ } 
> m 
[1] 2.523392e-05 
> pos 
[1] 638133 

Sử dụng Rcpp để tăng tốc chương trình "kiểm tra.cpp"

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
int closest(NumericVector a, NumericVector b) { 
    int length = a.size(); 
    double temp,m=10000; 
    int pos=0; 
    for(int i=0;i<length;i++){ 
    temp=a[i]*0.56579-b[i]-12.60098; 
    if(temp>=0){ 
     if(m>temp){m=temp;pos=i;}  
    }else{ 
     if(m>-temp){m=-temp;pos=i;} 
    } 
    } 
    return pos+1; 
} 

quả (các Rcpp chi phí khoảng 2 giây):

> sourceCpp("test.cpp") 
> closest(centers[[1]],centers[[2]]) 
[1] 974698 
> abs(centers[[1]][974698]*0.56579-centers[[2]][974698]-12.60098) 
[1] 0.0002597022 
+1

Cảm ơn bạn, nhưng tôi đã yêu cầu cụ thể cho con đường ước tính tuyến tính giữa các điểm và thứ hai tôi đang tìm kiếm các điểm trên lưới gần nhất với đường dẫn đó, vui lòng xem câu hỏi được liên kết trước đó –

1

có giúp đỡ này:

## create data 
set.seed(1) 
n <- 10000 
x <- 100 * cumprod(1 + rnorm(n, 0.0001, 0.002)) 
y <- 50 * cumprod(1 + rnorm(n, 0.0001, 0.002)) 

# original path 
path <- data.frame(cbind(x=x, y=y)) 

# path with missing points/points every hundred 
path.w.missing <- path[seq(1,n,by=100),] 


## proposed solution 
library(raster) 

l <- SpatialLines(list(Lines(list(Line(path.w.missing)), "1"))) 
r <- raster(extent(bbox(l)), res = c(0.5, 0.2)) 
r <- rasterize(l, r, field = 1) 

## xy will be a matrix 
xy <- rasterToPoints(r) 

plot(r) 
points(xy) 
points(path.w.missing, col = "red") 

enter image description here

0

Gói marmap thực hiện chính xác những gì bạn cần :

library(marmap) 
bcenters <- as.bathy(centers) 
out <- path.profile(path.w.missing,bcenters) 

     lon  lat dist.km depth 
2 100.0512 50.04129 0.00000 247451 
3 101.2070 50.11430 82.87177 247450 
4 101.3687 50.18730 95.33454 247449 
5 101.5973 50.26030 112.81665 248453 
6 102.6877 50.33330 190.48139 248454 
7 103.2105 50.40630 228.37510 248458 

id nằm trong cột depth. Hàm này được mã hóa để lấy độ sâu trong ma trận độ sâu dọc theo một đường dẫn. Nó tìm thấy tất cả các ô của ma trận độ sâu "dưới" đường dẫn (tức là các ô gần nhất với đường dẫn) và xuất ra giá trị của các ô này. Bằng cách chuyển đối tượng centers thành ma trận của lớp bathy, cột của bạn id được sử dụng như thể nó là độ sâu. Do đó, path.profile() sẽ xuất ra các số id của các ô gần nhất với đường dẫn của bạn trong cột depth.

Tại đây, bạn bắt đầu với 100 điểm trong đối tượng path.w.missing của mình. path.profile() giúp bạn id của các tế bào

nrow(out) 
795 

đó là gần gũi nhất với con đường này.

Dưới đây là một âm mưu của các dữ liệu path.w.missing với điểm gần nhất phủ lên màu đỏ:

plot(path.w.missing,type="o",cex=.3, lwd=5) 
points(out[,1],out[,2], col=rgb(1,0,0,.8), cex=.3) 

enter image description here

Các vấn đề liên quan