Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.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 在地图上画一定半径的圆,确保距离正确_R_Ggplot2_Map Projections - Fatal编程技术网

R 在地图上画一定半径的圆,确保距离正确

R 在地图上画一定半径的圆,确保距离正确,r,ggplot2,map-projections,R,Ggplot2,Map Projections,在R中,我试图在地图上画一个圆,给定它的质心为lat,即长点,具有一定的距离。我找到并使用了@lukeA的代码来实现我想要的。然而,似乎距离不对。我在某个纬度的两个经度之间得到的距离与所绘制的不一致。可用于测量距离的网站是: 下面是代码。spTransform中的单位指定为us mi,因此我们应该能够以英里为单位给出圆直径 我想要一个以lat=45,long=-90为中心的圆。到lat=45,long=-86的距离约为195英里。因此,直径等于2*195=390 mi。但画出的圆圈太远了。问题可

在R中,我试图在地图上画一个圆,给定它的质心为lat,即长点,具有一定的距离。我找到并使用了
@lukeA
的代码来实现我想要的。然而,似乎距离不对。我在某个纬度的两个经度之间得到的距离与所绘制的不一致。可用于测量距离的网站是:

下面是代码。
spTransform
中的单位指定为
us mi
,因此我们应该能够以英里为单位给出圆直径

我想要一个以lat=45,long=-90为中心的圆。到lat=45,long=-86的距离约为195英里。因此,直径等于2*195=390 mi。但画出的圆圈太远了。问题可能与预测有关

有人能帮我找到我缺少的东西吗

library(tidyverse)
library(data.table)
library(rgeos)
library(sp)

states = c('illinois', 'wisconsin', 'iowa', 'minnesota')
state_4s =  map_data('state') %>% data.table() %>% subset(region %in% states)
counties_4s = counties[region %in% states ]

map_4s <- ggplot(data = state_4s, 
                 mapping = aes(x = long, y = lat, group = group)) +
    geom_polygon(color = "black", fill = "gray", size = 0.1) +
    theme_bw()

map_4s = map_4s +
    geom_polygon(data = counties_4s, fill = NA, color = 'white', size = 0.1) + 
    geom_polygon(color = "black", fill = NA, size = 0.1) +
    coord_map("mercator")


long = c(-90)
lat = c(45)
center = data.frame(long, lat)


d <- SpatialPointsDataFrame(coords = center, 
                            data = center, 
                            proj4string = CRS("+init=epsg:4326"))



d_mrc <- spTransform(d, CRS("+proj=merc +init=epsg:4326 +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k_0=1.0 +units=us-mi +nadgrids=@null +no_defs"))


# Now, the width can be specified in miles:
d_mrc_bff_mrc <- gBuffer(d_mrc, byid = T, width = 195*2, capStyle = 'round')

d_mrc_bff <- spTransform(d_mrc_bff_mrc, CRS("+init=epsg:4326"))
d_mrc_bff_fort <- fortify(d_mrc_bff)

map_4s + 
    geom_point(data = center, aes(x = long, y = lat, group = 1)) + 
    geom_path(data=d_mrc_bff_fort, aes(long, lat, group=group), color="red") 
库(tidyverse)
库(数据表)
图书馆(rgeos)
图书馆(sp)
州=c(“伊利诺伊州”、“威斯康星州”、“爱荷华州”、“明尼苏达州”)
state_4s=map_data('state')%%>%data.table()%%>%子集(区域%在%状态中)
Countries_4s=县[州百分比中的区域%]
地图库(tidyverse)
库(数据表)
图书馆(rgeos)
图书馆(sp)
州=c(“伊利诺伊州”、“威斯康星州”、“爱荷华州”、“明尼苏达州”)
state_4s=map_data('state')%%>%data.table()%%>%子集(区域%在%状态中)

我想你不必把半径乘以2。由于
gBuffer
的文档说明宽度是“从原始几何体到新几何体的距离”。那么它太小了。请尝试这样更改您的CR:
d_mrc@ahly这似乎可行。你是怎么找到这个信息的?我可以在哪里检查正确的分区、投影等?您可以使用此函数计算分区:
函数(长){(楼层((长+180)/6)%%60)+1}
。有关投影系统的详细信息,请参阅
library(tidyverse)
library(data.table)
library(rgeos)
library(sp)

states = c('illinois', 'wisconsin', 'iowa', 'minnesota')
state_4s =  map_data('state') %>% data.table() %>% subset(region %in% states)

map_4s <- ggplot(data = state_4s, 
                 mapping = aes(x = long, y = lat, group = group)) +
    geom_polygon(color = "black", fill = "gray", size = 0.1) +
    theme_bw()



long = c(-90)
lat = c(45)
center = data.frame(long, lat)


d <- SpatialPointsDataFrame(coords = center, 
                            data = center, 
                            proj4string = CRS("+init=epsg:4326"))

long2UTMZone <- function(long) { (floor((long + 180)/6) %% 60) + 1 }

d_mrc <- spTransform(d, CRS(paste0("+proj=utm +zone=", long2UTMZone(long)," +datum=WGS84 +units=us-mi")))

# Now, the width can be specified in miles:
d_mrc_bff_mrc <- gBuffer(d_mrc, byid = T, width = 195, capStyle = 'round')

d_mrc_bff <- spTransform(d_mrc_bff_mrc, CRS("+init=epsg:4326"))
d_mrc_bff_fort <- fortify(d_mrc_bff)

map_4s + 
    geom_point(data = center, aes(x = long, y = lat, group = 1)) + 
    geom_path(data=d_mrc_bff_fort, aes(long, lat, group=group), color="red")