端口之间的距离计算器

Lee*_*eya 1 google-maps r distance google-maps-api-3

我有一个端口数据库,其中包含近1万个端口名称及其对应的位置。我想找到端口之间的距离。

根据使用Google距离矩阵API的理解,对于一组特定的出行方式,例如自行车,行车,步行和内部交通,我们只能找到两点之间的距离。

但以我为例,我想在航行中找到两个港口之间的距离。如果有人做过类似的工作,请分享您的知识...

参考网站:[ http://www.portworld.com/map]

谢谢!

Jan*_*ter 5

我遇到了同样的问题,并找到了解决方案。

1)首先,您必须创建一个世界地图栅格,其中包含船舶可以升值的所有部分以及所有船舶不能升值的所有地方。

为此,我首先从所有国家/地区边界的形状文件开始,然后使用QGIS手动添加了苏伊士和巴拿马运河。然后,我还在北冰上添加了冰块。我在R中使用rgdal,raster和gdistance软件包完成了其余工作。

install.packages("rgdal")
install.packages("raster")
install.packages("gdistance")
library(rgdal)
library(raster)
library(gdistance)
Run Code Online (Sandbox Code Playgroud)

我首先创建了一个空栅格:

 new  <- raster(ncol=360*5, nrow= 180*5)
 projection(new) <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
Run Code Online (Sandbox Code Playgroud)

(通过更改列数,可以使栅格更加精确。当栅格较低时,地图看起来好像是由点构建而成的,而当栅格很大时,它们看起来都非常平滑。当绘制栅格时,绘制的“运河”也会消失您将分辨率设置得太低。因为它们无法与周围环境区分开。但是当计算时间随着光栅的分辨率而大大增加时!!)

#Import Shapefile
map <- readOGR(dsn = "location of shape file" , layer = "name shape file")
#Create map from shapefile and empty map
r <- rasterize(map, new)

#replace values to 1 and 99999
values(r)[is.na(values(r))] <- 1
values(r)[values(r)>1] <- 99999
Run Code Online (Sandbox Code Playgroud)

因此,您最终得到了一张地图,其中船可以航行的所有地点都等于1,而船不能航行的所有地点都等于99999。

2)将端口的坐标保存在名为“端口”的矩阵中。第一列为经度,第二列为纬度。

应用计算最短路径所需的过渡,并在此处找到有关地理校正的更多信息,以进行地理校正。

p <- transition(r, function(x){1/mean(x)}, 8)
p <- geoCorrection(p)
Run Code Online (Sandbox Code Playgroud)

3)运行循环以计算所有端口之间的最短路径。最短路径的长度存储在称为“结果”的三列矩阵中。整个循环并行运行以加快处理速度。

install.packages("doParallel")
install.packages("foreach")
library(foreach)
library(doParallel)
# Create cluster with number of cores of the system.
cl <- makeCluster(detectCores())
registerDoParallel(cl)

i <- 1
nrow_data <- nrow(ports)
results <- foreach(i=icount(nrow_data), .combine='rbind', .packages="gdistance") %dopar% {
        A <- cbind(ports[i,1],ports[i,2])
        r <- matrix(NA, ncol=3,nrow=nrow_data)
        r[,1] <- i
        j <- i+1
        while(j<=nrow_data){
                r[j,2] <- j
                B <- cbind(ports[j,1],ports[j,2])
                tryCatch({
                        path <- shortestPath(p, A,B, output = "SpatialLines")
                        r[j,3] <- SpatialLinesLengths(path ,longlat=TRUE)
                }, error=function(e){})
                j <- j+1
        }
        r[1:nrow_data,]
}
Run Code Online (Sandbox Code Playgroud)

我添加了“ tryCatch”以消除当两个端口彼此非常靠近时有时会收到的错误。由于栅格的分辨率较低,因此无法在这两个端口之间进行区分。

这可能不是执行所有操作的最佳方法,但对我来说效果很好!