3

我有一个文本文件包含如下信息:

   Grid Point Index, Latitude, Longitude, Cell
 167,    0.000000,    9.432301, 1350
 169,    0.000000,    9.544590, 1350
 171,    0.000000,    9.656878, 1350
 173,    0.000000,    9.769168, 1350
 175,    0.000000,    9.881457, 1350
 177,    0.000000,    9.993747, 1350
 179,    0.000000,   10.106036, 1386
 181,    0.000000,   10.218326, 1386

我想找出这个纬度和经度的相应网格点和单元格:0.000000、11.902665。好吧,我可以手动完成,但这需要很多时间。可以肯定的是,没有与我的输入相对应的确切坐标,所以我想要文件中最接近输入的坐标。谁能帮我建立这个功能

   insert lat and long

然后会在文件中找到最近的lat-long和对应的网格点索引和单元格

读取文件

      das= read.table("C:\\Users\\lonlatnter.txt", sep=",",header=TRUE)
4

4 回答 4

6

gdistImap 包中的函数计算大圆距离。尝试这个:

install.packages("Imap")
library("Imap")

#Dummy data
dat <- read.table(text="   Grid Point Index, Latitude, Longitude, Cell
 167,    0.000000,    9.432301, 1350
 169,    0.000000,    9.544590, 1350
 171,    0.000000,    9.656878, 1350
 173,    0.000000,    9.769168, 1350
 175,    0.000000,    9.881457, 1350
 177,    0.000000,    9.993747, 1350
 179,    0.000000,   10.106036, 1386
 181,    0.000000,   10.218326, 1386", header=T, sep=",")

#MyPoint
myLatitude <- 0.000000 
myLongitude <- 11.902665

#gdist Geodesic distance (great circle distance) between points
dat$Dist <- gdist(lat.1=dat$Latitude,
                       lon.1=dat$Longitude,
                       lat.2=myLatitude,
                       lon.2=myLongitude)

#Output the shortest distance - Min
dat[dat$Dist == min(dat$Dist),]

#Output
#   Grid.Point.Index Latitude Longitude Cell     Dist
#8              181        0  10.21833 1386 101.2418
于 2013-06-24T13:18:52.713 回答
4

非常简单,但不是 100% 精确(地球不平坦 :-)):

df <- read.table(text="   Grid Point Index, Latitude, Longitude, Cell
 167,    0.000000,    9.432301, 1350
 169,    0.000000,    9.544590, 1350
 171,    0.000000,    9.656878, 1350
 173,    0.000000,    9.769168, 1350
 175,    0.000000,    9.881457, 1350
 177,    0.000000,    9.993747, 1350
 179,    0.000000,   10.106036, 1386
 181,    0.000000,   10.218326, 1386", header=T, sep=",")


findGrid <- function(lat, lon){
  index <- which.min(sqrt((df$Latitude-lat)^2+(df$Longitude-lon)^2))
  df$Grid.Point.Index[index]
}

> findGrid(0,9.9)
[1] 175
> findGrid(0,9.7)
[1] 171
于 2013-06-24T13:22:44.860 回答
3

另一种选择是使用,ggmap以及mapdist使用Google Maps计算地图距离。

library(ggmap)
origin <- revgeocode(c( 11.902665,0.000000))
do.call(rbind,apply(DT,1,function(x){
  end <- revgeocode(c(x['Longitude'],x['Latitude']))
  mapdist(from=origin,to=end)[,c('from','to','km')]
  }))

我们有一个带有位置名称(notlat/long)的智能结果,距离以公里为单位。

        from                       to      km
1 R14, Gabon       Komo-Mondah, Gabon      NA
2 R14, Gabon       Komo-Mondah, Gabon      NA
3 R14, Gabon       Komo-Mondah, Gabon      NA
4 R14, Gabon       Komo-Mondah, Gabon      NA
5 R14, Gabon              Komo, Gabon 324.206
6 R14, Gabon                N1, Gabon 281.145
7 R14, Gabon N1, Ekouk Village, Gabon 304.186
8 R14, Gabon          N1, Oyan, Gabon 308.246

我不知道为什么它会给出一些 NA。但是如果我们省略这个细节:) 近点是:

res [which.min(res$km),]
 from        to      km
6 R14, Gabon N1, Gabon 281.145
于 2013-06-24T14:06:25.277 回答
1

尝试这个

data = read.table("C:\\Users\\lonlatnter.txt", sep=",",header=TRUE)

distance = function(Latitude, Longitude,x,y)
{
    sqrt((Latitude-y)^2+(Longitude-x)^2)
}
nearby <- function(y,x)
{
    dist= (with(data,distance(Latitude, Longitude,x,y)))
    data[match(min(dist),dist),]
}

nearby(0,9.6)

# Grid.Point.Index Latitude Longitude Cell
# 2              169        0   9.54459 1350
于 2013-06-24T13:30:18.033 回答