Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.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 纬度和经度、x和y以及绘制时的差异:地球层和ggmap_R_Ggplot2_Latitude Longitude_Ggmap_Geosphere - Fatal编程技术网

R 纬度和经度、x和y以及绘制时的差异:地球层和ggmap

R 纬度和经度、x和y以及绘制时的差异:地球层和ggmap,r,ggplot2,latitude-longitude,ggmap,geosphere,R,Ggplot2,Latitude Longitude,Ggmap,Geosphere,我正在使用纬度和经度数据,并试图以图形方式显示斯德哥尔摩地图上每个点的指标(基于与该点的接近程度)。我更感兴趣的是图像上的点间距相等,而不是实际距离相等:从这个意义上说,我理解赤道纬度点之间的距离比它们沿着极地圈的距离长,这可能是一个关键问题 我的目标是将地图分成一个网格,在x和y方向上以大约1km的增量进行划分。因此,我取了最小和最大纬度和经度,计算它们与斯德哥尔摩中心的x和y距离,然后将纬度和经度的跨度除以x和y坐标的跨度(使用地球圈)。我这样做是因为我希望在绘制点时,它们的间距相等(否则,

我正在使用纬度和经度数据,并试图以图形方式显示斯德哥尔摩地图上每个点的指标(基于与该点的接近程度)。我更感兴趣的是图像上的点间距相等,而不是实际距离相等:从这个意义上说,我理解赤道纬度点之间的距离比它们沿着极地圈的距离长,这可能是一个关键问题

我的目标是将地图分成一个网格,在x和y方向上以大约1km的增量进行划分。因此,我取了最小和最大纬度和经度,计算它们与斯德哥尔摩中心的x和y距离,然后将纬度和经度的跨度除以x和y坐标的跨度(使用地球圈)。我这样做是因为我希望在绘制点时,它们的间距相等(否则,由于接近赤道,地图顶部的x点之间的距离将小于底部的x点之间的距离)

然后我将这些点绘制在地图上(使用ggmap),并观察到y方向上的点之间的距离大于x方向。我想这张地图可能只是以一种扭曲的方式画出来的,但它似乎有点扭曲,令人难以置信。我怀疑我可能做错了什么,但找不到可能是什么

代码示例如下:

library("ggmap")
library("RgoogleMaps")
library("geosphere")

stockholm <- get_map("stockholm", zoom=11)
ggmap(stockholm)

places <- c('Tensta', 'Hanviken')

pos <- data.frame(Places = places, lat = NA, lon = NA, x = NA, y = NA)
reflatlon = getGeoCode('Stockholm, Sweden')

for(i in 1:length(places)) {
  latlon <- getGeoCode(paste0(places[i], ', Stockholm'))
  pos$lat[i] <- as.numeric(latlon[1])
  pos$lon[i] <- as.numeric(latlon[2])

  dist_y <- distGeo(c(latlon[1], reflatlon[2]), reflatlon) * sign(latlon[1] - reflatlon[1]) # same longitude
  dist_x <- distGeo(c(reflatlon[1], latlon[2]), reflatlon) * sign(latlon[2] - reflatlon[2]) # same latitude

  pos$x[i] <- dist_x
  pos$y[i] <- dist_y
}

deglatperm <- ( max(pos$lat) - min(pos$lat) ) / ( max(pos$y) - min(pos$y) ) # degrees latitude per metre
deglonperm <- ( max(pos$lon) - min(pos$lon) ) / ( max(pos$x) - min(pos$x) ) # degrees longitude per metre

seqlat <- seq(min(pos$lat), max(pos$lat), by = deglatperm*1000) # sequence with a point every ~1km
seqlon <- seq(min(pos$lon), max(pos$lon), by = deglonperm*1000) # sequence with a point every ~1km

seqlatlon <- expand.grid(seqlat, seqlon)
names(seqlatlon) <- c('lat', 'lon')

ggmap(stockholm) + geom_point(aes(x = lon, y = lat), data=seqlatlon)
库(“ggmap”)
图书馆(“RgoogleMaps”)
图书馆(“地球圈”)

斯德哥尔摩我尽量避免在任何使用度而不是距离的坐标系中工作。在美国,我经常使用我们的国家飞机系统。瑞典似乎使用RT系统。一旦你把坐标从度数中移到距离基准的距离中,你就可以用更传统的距离来建立你的网格。如果你愿意的话,你可以把坐标放回度数

我使用函数进行坐标转换,并使用指南获取坐标系的参考代码

library("ggmap")
library("RgoogleMaps")
library("geosphere")
library("sp")

stockholm <- get_map("stockholm", zoom=11)
ggmap(stockholm)

places <- c('Tensta', 'Hanviken')

pos <- data.frame(Places = places, lat = NA, lon = NA)
reflatlon <- getGeoCode('Stockholm, Sweden')

for(i in 1:length(places)) {
  latlon <- getGeoCode(paste0(places[i], ', Stockholm'))
  pos$lat[i] <- as.numeric(latlon[1])
  pos$lon[i] <- as.numeric(latlon[2])
}

p <- SpatialPoints(data.frame(pos$lon, pos$lat), proj4string = CRS("+init=epsg:4326"))
p <- spTransform(p, CRS("+init=epsg:3022"))

seqx <- seq(min(p@coords[,1]), max(p@coords[,1]), by = 1000)
seqy <- seq(min(p@coords[,2]), max(p@coords[,2]), by = 1000)

pgrid <- expand.grid(seqx, seqy)
pgrid <- SpatialPoints(pgrid, proj4string = CRS("+init=epsg:3022"))
pgrid <- spTransform(pgrid, CRS("+init=epsg:4326"))
pgrid <- data.frame(pgrid@coords)

names(pgrid) <- c('lon', 'lat')

ggmap(stockholm) + geom_point(aes(x = lon, y = lat), data=pgrid)
库(“ggmap”)
图书馆(“RgoogleMaps”)
图书馆(“地球圈”)
图书馆(“sp”)

斯德哥尔摩很好的回答-谢谢!因此,问题在于我对地球圈的使用:我没有意识到坐标系如此复杂,但事后看来这是有道理的。如果我理解正确的话,你把世界epsg:4362的坐标转换成本地epsg:3022地形坐标系?具体来说,在选择epsg:3022时,您是通过搜索spatialreference.org来实现的吗?我搜索了斯德哥尔摩,没有得到这个参考,但得到了11个不同的代码。或者是否有一种特定的/自动的方式/位置来查找用于指定区域的epsg代码?再次感谢!转换到以距离为单位的坐标系是关键。为了找到RT90坐标系,我在谷歌上搜索了“瑞典坐标系”。您会注意到SR.org中有几个RT坐标系。我确实第一次尝试在SR搜索斯德哥尔摩,但结果也是空手而归。我不知道找到本地坐标系的具体来源(然而,projfinder.org做的正好相反,这很酷)。EPSG只是一个目录号。每个坐标系都是唯一的,大多数坐标系都由EPSG识别。搜索“地理坐标系”。沉重的东西。此外,如果您正在寻找其他答案,您可能希望发布到GIS堆栈交换。如果这对你有效,你可以投票或者把它标记为答案。太好了!我在谷歌上搜索,试图找出答案,但很快就遇到了困难:的确是很重的东西!但是我认为如果我在其他地方工作的话,这足以让我在将来计算出相关的坐标系。非常有帮助!这实际上是我的第一篇StackOverflow帖子,所以我没有足够的“声誉”来提升投票率,但我现在会将其标记为已回答-以前没有注意到该按钮。再次感谢!网络使用WGS 84来处理所有事情是有原因的——一个坐标系来管理它们——我只是认为这使得距离计算变得非常困难。可能有一种工具可以在飞行中正确地进行距离到角度的转换。如果您需要在各种各样的地方进行此操作,那么GIS堆栈交换可能会进一步阐明此问题。祝你好运