在 R 地图中查找国家/地区的经纬度 class

Finding countries latitude and longitude in the R map class

我正在尝试使用 R 在世界地图上标记一些国家/地区。

    # World map is available in the maps package
    library(maps)
    library(dplyr)
    
    # No margin
    par(mar=c(0,0,0,0))
    
    # World map
    m <- map('world',
        col="#f2f2f2", fill=TRUE, bg="white", lwd=0.05,
        mar=rep(0,4),border=0, ylim=c(-80,80) 
    )

# Get coordinates        
brazil <- c(m$x[which(m$names=="Brazil")], m$y[which(m$names=="Brazil")])
netherlands <- c(m$x[which(m$names=="Netherlands")], m$y[which(m$names=="Netherlands")])

# Data frame 
data <- rbind(brazil, netherlands) %>% 
  as.data.frame()
colnames(data) <- c("long","lat")

# No margin
    par(mar=c(0,0,0,0))
     map('world',
        col="#f2f2f2", fill=TRUE, bg="white", lwd=0.05,
        mar=rep(0,4),border=0, ylim=c(-80,80) 
    )
    points(x=data$long, y=data$lat, col="slateblue", cex=3, pch=20)

但是,点数与要求的国家相去甚远。

有没有正确指出国家/地区的想法?

地图数据结构中的县名与 x 和 y 值之间的比例不是一比一的。

例如:

str(m)
List of 4
 $ x    : num [1:100375] -69.9 -69.9 -69.9 -70 -70.1 ...
 $ y    : num [1:100375] 12.5 12.4 12.4 12.5 12.5 ...
 $ range: num [1:4] -180 190 -80 80
 $ names: chr [1:1599] "Aruba" "Afghanistan" "Angola" "Angola:Cabinda" ...
 - attr(*, "class")= chr "map"

有 1599 个名称和超过 100,000 个 x-y 对。

这是一种查找感兴趣的国家/地区、提取该信息然后从范围值中找到中点的方法。此分辨率足够接近。
您可能希望将 exact=TRUE 添加到地图功能,以隔离到国家的主要地理区域并删除离岛和领土。美国是应用此选项的一个很好的例子。

# World map is available in the maps package
library(maps)

# World map
m <- map('world',
         col="#f2f2f2", fill=TRUE, bg="white", lwd=0.05,
         mar=rep(0,4),border=0, ylim=c(-80,80), plot=FALSE
)

# Get coordinates        
brazil <- map('world', regions = "brazil", plot=FALSE, exact=TRUE)
  brazil_long <- mean(brazil$range[1:2])
  brazil_lat <- mean(brazil$range[3:4])

netherlands <- map('world', regions = "Netherlands", plot=FALSE)    
  netherland_long <- mean(netherlands$range[1:2])
  netherland_lat <- mean(netherlands$range[3:4])

# Data frame 
data <- data.frame(long = c(brazil_long, netherland_long), lat= c(brazil_lat, netherland_lat))

# No margin
par(mar=c(0,0,0,0))
map('world',
    col="#f2f2f2", fill=TRUE, bg="white", lwd=0.05,
    mar=rep(0,4),border=0, ylim=c(-80,80) 
)
points(x=data$long, y=data$lat, col="slateblue", cex=3, pch=20)