首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在专属经济区而不是国家边界上使用R中的coords2country函数

在专属经济区而不是国家边界上使用R中的coords2country函数
EN

Stack Overflow用户
提问于 2016-12-13 00:17:05
回答 1查看 762关注 0票数 1

我想将国家专属经济区分配给来自栅格的点数据,这些点表示海洋中的文石饱和度水平。光栅是为海洋中的许多纬度/经度点提供文石值的单个图层。我想将每个纬度/经度点分配给一个专属经济区。This site是针对单个坐标对的,但我有15,000个点,所以我希望它可以在R中实现。

数据如下所示:

代码语言:javascript
复制
      long      lat Aragonite
1 20.89833 84.66917  1.542071
2 22.69496 84.66917  1.538187
3 24.49159 84.66917  1.537830
4 26.28822 84.66917  1.534834
5 28.08485 84.66917  1.534595
6 29.88148 84.66917  1.532505

以前,我使用下面的代码将国家分配给栅格点,但这会为国家专属经济区内的海洋中的许多点返回NA。

代码语言:javascript
复制
#convert the raster to points for assigning countries
r.pts <- rasterToPoints(r, spatial = TRUE)

#view new proj 4 string of spatialpointsdataframe
proj4string(r.pts)
##[1] "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"

###converting reclassified points to countries
# The single argument to this function, points, is a data.frame in which:
#   - column 1 contains the longitude in degrees
#   - column 2 contains the latitude in degrees
coords2country = function(r.pts)
{
countriesSP <- getMap(resolution='high')
#countriesSP <- getMap(resolution='high') #you could use high res map from rworldxtra if you were concerned about detail

#setting CRS directly to that from rworldmap
r.pts = SpatialPoints(r.pts, proj4string=CRS(proj4string(countriesSP))) 

# use 'over' to get indices of the Polygons object containing each point 
indices = over(r.pts, countriesSP)
# return the ADMIN names of each country
indices$ADMIN 
#indices$ISO3 # returns the ISO3 code
#indices$continent   # returns the continent (6 continent model)
#indices$REGION   # returns the continent (7 continent model)
}

#get country names for each pair of points
rCountries <- coords2country(r.pts)

除了海洋中的专属经济区之外,有没有办法实现与coords2countries类似的功能?

编辑:可重现示例的一些数据

代码语言:javascript
复制
dput(head(r.pts))
structure(list(layer = c(5, 5, 5, 5, 5, 5), x = c(-178.311660375408,-176.511660375408, -174.711660375408, -172.911660375408, -171.111660375408,-169.311660375408), y = c(73.1088933113454, 73.1088933113454,73.1088933113454, 73.1088933113454, 73.1088933113454, 73.1088933113454),.Names = c("layer", "x", "y"),row.names = c(NA, 6L), class = "data.frame") 
EN

回答 1

Stack Overflow用户

发布于 2017-02-10 09:10:13

您需要一个包含EEZ的shapefile。下载这里: World EEZ v9 (2016-10-21,123MB) http://www.marineregions.org/downloads.php#marbound

您可以使用rgdal包中的readOGR()函数加载EEZ shapefile。将EEZ shapefile压缩文件解压缩到您的工作目录中,然后运行countriesSP <- rgdal::readOGR(dsn = ".", layer = "eez_boundaries")代替countriesSP <- getMap(resolution='high')

您提供的示例数据都不在某个国家的专属经济区内,所以我不知道这是否真的有效,但它可能会……

代码语言:javascript
复制
library(sp)
library(rworldmap)
library(rgeos)

r <- read.table(header = TRUE, text = "
long lat Aragonite
1 20.89833 84.66917  1.542071
2 22.69496 84.66917  1.538187
3 24.49159 84.66917  1.537830
4 26.28822 84.66917  1.534834
5 28.08485 84.66917  1.534595
6 29.88148 84.66917  1.532505
")
# or
#r <- data.frame(long = c(-178.311660375408,-176.511660375408, -174.711660375408, -172.911660375408, -171.111660375408,-169.311660375408), 
#                lat = c(73.1088933113454, 73.1088933113454,73.1088933113454, 73.1088933113454, 73.1088933113454, 73.1088933113454))

r.pts <- sp::SpatialPoints(r)

# download file from here: http://www.marineregions.org/download_file.php?fn=v9_20161021
# put the zip file in your working directory: getwd()
unzip('World_EEZ_v9_20161021.zip')

# countriesSP <- rworldmap::getMap(resolution = "high")
# or
countriesSP <- rgdal::readOGR(dsn = ".", layer = "eez_boundaries")

r.pts <- sp::SpatialPoints(r.pts, proj4string = sp::CRS(proj4string(countriesSP))) 
indices <- over(r.pts, countriesSP)
indices$ADMIN
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41105042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档