2010-08-04 5 views
4

как мне построить участок вокруг множества точек на карте в R? напримерПостроение сглаженной области на карте из набора точек в R

map('world') 
map.axes() 
p <- matrix(c(50, 50, 80, 100, 70, 40, 25, 60), ncol=2) # make some points 
points(p, pch=19, col="red") 

polygon(p, col="blue") 

... который дает мне многоугольник с вершиной в каждой точке, но выглядит довольно дерьмовым. Есть ли способ «сгладить» многоугольник на какую-то кривую?

ответ

3

Один из вариантов заключается в создании полигона, ограниченного кривой Безье, с использованием функции bezier в пакете Hmisc. Однако я не могу получить начальную/конечную точку, чтобы объединиться аккуратно. Например:

## make some points 
p <- matrix(c(50, 50, 80, 100, 70, 40, 25, 60), ncol=2) 
## add the starting point to the end 
p2 <- cbind(1:5,p[c(1:4,1),]) 
## linear interpolation between these points        
t.coarse <- seq(1,5,0.05) 
x.coarse <- approx(p2[,1],p2[,2],xout=t.coarse)$y 
y.coarse <- approx(p2[,1],p2[,3],xout=t.coarse)$y 
## create a Bezier curve           
library(Hmisc) 
bz <- bezier(x.coarse,y.coarse) 
library(maps) 
map('world') 
map.axes() 
polygon(bz$x,bz$y, col=rgb(0,0,1,0.5),border=NA) 
0

Вот один из способов, нарисуйте многоугольник и сделайте его таким же красивым, как вам нравится. Это действительно не имеет ничего общего с областями на картах, больше о том, как вы создаете вершины вашего многоугольника.

library(maps) 
    p <- matrix(c(50, 50, 80, 100, 70, 40, 25, 60), ncol=2)  
    plot(p, pch = 16, col = "red", cex = 3, xlim = range(p[,1]) + c(-10,10), ylim = range(p[,2]) + c(-5, 5)) 
    map(add = TRUE) 
    #click until happy, right-click "stop" to finish 
    p <- locator(type = "l") 
    map() 
    polygon(cbind(p$x, p$y), col = "blue") 

В противном случае вы можете интерполировать промежуточные вершины и разгладить их каким-то образом, и в контексте долготу/лат может быть карта с использованием перепроецирования, чтобы получить более реалистичные отрезки - но зависит от вашей цели.

Смежные вопросы