Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据纬度数据创建到岸距离(km)变量?_R - Fatal编程技术网

R 根据纬度数据创建到岸距离(km)变量?

R 根据纬度数据创建到岸距离(km)变量?,r,R,我有一个数据帧,其中3k+数据点分布在墨西哥湾北部(这里我只提供6个)。我正在尝试为is到岸距离(km)创建一个新变量。我有一个shape文件(gulf.shape),我想使用它,但不清楚如何使用 这里有一些数据 require(maptools) require(sp) library(rgdal) library(lubridate) df <- data.frame(Lat = c(26.84853, 28.38329, 28.00364,

我有一个数据帧,其中3k+数据点分布在墨西哥湾北部(这里我只提供6个)。我正在尝试为is到岸距离(km)创建一个新变量。我有一个shape文件(
gulf.shape
),我想使用它,但不清楚如何使用

这里有一些数据

require(maptools)
require(sp)
library(rgdal)
library(lubridate)


df <- data.frame(Lat = c(26.84853, 28.38329, 28.00364, 
                     29.53840, 29.32030, 26.81622, 25.28146), 
             Lon = c(-96.55716, -94.29307, -91.21581, 
                     -88.42556, -84.20031, -83.89737, -82.95665))

我发现了一个堆栈溢出post(),它允许我使用下面的代码获得答案。他们使用的形状文件可用

require(rgdal)#用于readOGR(…);同时加载包sp
需要(rgeos)#用于距离(…)
需要(并联)#用于检测磁芯
需要(foreach)#foreach(…)
需要(雪)#用于makeCluster(…)
要求(doSNOW)#用于抵抗doSNOW(…)

wgs.84我将尝试回答你的第三个问题。 CRS(坐标参考系)在映射中非常重要,因为它定义了点的坐标系。这里有一个有用的概述。

对于您的特定情况,当您更改为其他形状文件时,您需要(1)了解您的形状文件(gulf.shape)的CRS是什么。通常,它位于shapefile附带的.prj文件或元数据中。(2) 选择一个适合你目标的CRS。您正在计算距离,因此等距投影可能对您最有帮助。(3) 在计算距离之前,将原始CR转换为目标CR。 你引用的代码也在这样做。世界形状文件附带wgs84 crs;选择的靶crs为mollweide;它使用spTransform()函数将wgs84转换为mollweide

另一方面,与您的第一个问题相关,您的计算精度与您使用的crs有关,但也与您的形状文件的比例和点的精度(lat/long)有关

gulf.shape <- "Shape\\stateshigh.shp"
gulf.shape <- maptools::readShapePoly(gulf.shape)
plot(df$Lon, df$Lat,
     xlim = c(-97.5, -80.7), ylim = c(25, 30.5),
     xlab ="Latitude", ylab = "Longitude",
     pch = 20, col="red", cex=1.5)
par(new=T)
sp::plot(gulf.shape, add= T,
         xlim = c(-97.5, -80.7), ylim = c(25, 30.5),
         xlab ="Latitude", ylab = "Longitude",
         col = "gray")
require(rgdal)   # for readOGR(...); loads package sp as well
require(rgeos)   # for gDistance(...)


require(parallel) # for detect cores
require(foreach)   # for foreach(...)
require(snow)      # for makeCluster(...)
require(doSNOW)    # for resisterDoSNOW(...)


wgs.84    <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
mollweide <- "+proj=moll +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs"
sp.points <- SpatialPoints(df[,c("Lon","Lat")], proj4string=CRS(wgs.84))

coast  <- rgdal::readOGR(dsn=".",layer="ne_10m_coastline",p4s=wgs.84);str(coast)

coast.moll <- spTransform(coast,CRS(mollweide))

point.moll <- spTransform(sp.points,CRS(mollweide))

no_cores <- detectCores()

cl <- makeCluster(no_cores,type="SOCK")  # create a 4-processor cluster
registerDoSNOW(cl)                # register the cluster

get.dist.parallel <- function(n) {
  foreach(i=1:n, .combine=c, .packages="rgeos", .inorder=TRUE, 
          .export=c("point.moll","coast.moll")) %dopar% gDistance(point.moll[i],coast.moll)
}

df$Dis.to.SHORE <- get.dist.parallel(length(sp.points))

df$Dis.to.SHORE <- df$Dis.to.SHORE/1000

df

plot(coast)

points(sp.points,pch=20,col="red")