在 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)
我正在尝试使用 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)