R-如何在R中用shapefile掩膜兴趣点

0. 数据及软件包准备

  1. 随机生成的兴趣点
  2. 全球大洲尺度shapefile
  3. 非洲shapefile
# 0. import required packages
require(ggplot2)
require(raster)
# 1. import world and asia shp
setwd('...文件路径...')
world = shapefile('world_continent2.shp')
africa = shapefile('africa.shp')
print(class(world))
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
print(class(africa))
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
#2. Generate Random Points
long = runif(500,min = -180,max = 180)
lat = runif(500,min = -90, max = 83)
df = data.frame(long, lat)

1. 目标

利用Africa shapefile 掩膜裁剪随机生成的世界范围的兴趣点

# 3. 图1 绘图代码
 a = ggplot()+
  geom_polygon(data = world,
               aes(x = long,
                   y = lat,
                   group = group),
               color ='black',
               fill = '#CFCFCF',
               size = 1)+
  geom_polygon(data = africa,
               aes(x = long,
                   y = lat,
                   group = group),
               color = 'black',
               fill = '#CD5C5C',
               size =1)+
  coord_fixed(1.3)+
  geom_point(data = df, aes(x = long,
                            y = lat),
             shape = 21, color = '#1E90FF',
             size = 3)+
  
  geom_point(data = df, aes(x = long,
                            y = lat),
             shape = 21, color = '#1E90FF',
             size = 2.8)+
  
  geom_point(data = df, aes(x = long,
                            y = lat),
             shape = 21, color = '#1E90FF',
             size = 3.2)+
  theme(panel.background = element_rect(fill='white',color = 'black',linetype = 'solid',size=1))+
  xlab('Longitude')+
  ylab('Latitude')
a

图1 随机生成全球范围内的随机点

2. 问题分析

shapefile 格式为SpatialPolygonDataFrame,点坐标为data.frame,传统解决思路为:

方案一

将data.frame 转为 SpatialPoints, 然而利用raster包中的mask 函数进行掩膜

# 4. 将data.frame 转化为 SpatialPoints
coordinates(df) = ~ long+lat
proj4string(df) = crs(world)
df
class       : SpatialPoints 
features    : 500 
extent      : -179.4668, 179.8964, -89.98775, 82.8965  (xmin, xmax, ymin, ymax)
crs         : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 

# 5. 利用raster 包中的mask 工具裁剪
df_m = mask(df, asia) 
Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘mask’ for signature ‘"SpatialPoints", "SpatialPolygonsDataFrame"’
方案一报错
Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘mask’ for signature ‘"SpatialPoints", "SpatialPolygonsDataFrame"’
方案二

基于africa.shp 的Extent,采用raster包中的crop函数对兴趣点进行裁剪(图2)。根据图2,我们可以发现基于Extent的裁剪会保留边界外的点。

# 6. 基于Africa Extent 裁剪
df_m = crop(df, extent(africa))
df_m
class       : SpatialPoints 
features    : 216 
extent      : -156.5301, 178.1786, -22.17424, 55.17034  (xmin, xmax, ymin, ymax)
crs         : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 

df_m.df = as.data.frame(df_m)

#7. Visualize the result
b = ggplot()+
  geom_polygon(data = africa,
               aes(x = long,
                   y = lat,
                   group = group),
               color = 'black',
               fill = '#CD5C5C',
               size = 1)+
  geom_point(data = df_m.df,
             aes(x = long,y = lat),
             shape = 21,
             color = '#1E90FF',
             size = 3)+
  coord_fixed(1.3)+
xlab('Longitude')+
ylab('Latitude')
b
图2 基于Extent 裁剪后的结果图

3. 解决方案-实测有效

基于over函数对兴趣点进行掩膜裁剪。

# 8. 基于over函数对兴趣点进行掩膜裁剪
df_m = over(df, africa)
df_index = which(!is.na(df_m))
df_m = df[df_index,]
df_m.df = as.data.frame(df_m,xy = T)

#9. Visualize the result.
c = ggplot()+
  geom_polygon(data = africa,
               aes(x = long,
                   y = lat,
                   group = group),
               color = 'black',
               fill = '#CD5C5C',
               size = 1)+
  geom_point(data = df_m.df,
             aes(x = long,y = lat),
             shape = 21,
             color = '#1E90FF',
             size = 3)+
  coord_fixed(1.3)+
  xlab('Longitude')+
  ylab('Latitude')

c
图3 基于Over函数裁剪后的结果图
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容