端口之间的距离计算器

时间:2015-02-18 03:18:25

标签: r google-maps google-maps-api-3 distance

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

使用Google距离矩阵API形成我的理解,我们只能找到两个点之间的距离,用于一组特定的旅行模式,如自行车,驾驶,步行和内部运输。

但在我的情况下,我想在船舶航行期间找到两个港口之间的距离。如果有人做了类似的工作,请分享你的知识......

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

谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

为此,我开始使用所有国家边界的形状文件,使用QGIS手动添加了苏伊士运河和巴拿马运河。然后我还在Artic中添加了Ice。 我使用包rgdal,raster和gdistance在R中完成的其余工作。

install.packages("rgdal")
install.packages("raster")
install.packages("gdistance")
library(rgdal)
library(raster)
library(gdistance)

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

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

(通过改变你使光栅更精确的列数。当它低时,地图看起来像是用点构建的,而当它非常大时,它看起来都非常平滑。&#34;运河& #34;当你将分辨率设置得太低时,你的绘制也会消失。因为它们无法与周围环境区分开来。但是当计算时间随着光栅的分辨率增加而非常强烈时!!)

#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

因此,您最终会得到一张地图,其中船舶可以等于1的所有地方以及船舶无法前往的所有地方都是99999.

2)将端口的坐标保存在名为&#34; ports&#34;的矩阵中。第一列是经度,第二列是纬度。

应用计算最短路径所需的转换,并在地理修正中应用地理修正更多信息here

p <- transition(r, function(x){1/mean(x)}, 8)
p <- geoCorrection(p)

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

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,]
}

我添加了&#34; tryCatch&#34;消除我有时在两个彼此非常靠近的端口时收到的错误。由于光栅的分辨率较低,因此无法区分这两个端口。

这可能不是做所有事情最好的方式,但它对我来说效果很好!

答案 1 :(得分:-1)

如果您使用谷歌,那么您将能够找到:Reference

我认为公式会以某种可能的方式帮助你。