如何将夏威夷和阿拉斯加添加到 R 中的空间多边形?
How to add Hawaii and Alaska to spatial polygons in R?
如何将夏威夷和阿拉斯加添加到以下代码(取自 Josh O'Brien 的回答:Latitude Longitude Coordinates to State Code in R)?
library(sp)
library(maps)
library(maptools)
# The single argument to this function, pointsDF, is a data.frame in which:
# - column 1 contains the longitude in degrees (negative in the US)
# - column 2 contains the latitude in degrees
latlong2state <- function(pointsDF) {
# Prepare SpatialPolygons object with one SpatialPolygon
# per state (plus DC, minus HI & AK)
states <- map('state', fill=TRUE, col="transparent", plot=FALSE)
IDs <- sapply(strsplit(states$names, ":"), function(x) x[1])
states_sp <- map2SpatialPolygons(states, IDs=IDs,
proj4string=CRS("+proj=longlat +datum=wgs84"))
# Convert pointsDF to a SpatialPoints object
pointsSP <- SpatialPoints(pointsDF,
proj4string=CRS("+proj=longlat +datum=wgs84"))
# Use 'over' to get _indices_ of the Polygons object containing each point
indices <- over(pointsSP, states_sp)
# Return the state names of the Polygons object containing each point
stateNames <- sapply(states_sp@polygons, function(x) x@ID)
stateNames[indices]
}
# Test the function using points in Alaska (ak) and Hawaii (hi)
ak <- data.frame(lon = c(-151.0074), lat = c(63.0694))
hi <- data.frame(lon = c(-157.8583), lat = c(21.30694))
nc <- data.frame(lon = c(-77.335), lat = c(34.671))
latlong2state(ak)
latlong2state(hi)
latlong2state(nc)
latlong2state(ak)
和latlong2state(hi)
代码returns NA,但如果正确修改代码,将返回阿拉斯加和夏威夷作为结果。
感谢任何帮助!
您需要使用包含 50 个州的地图,您使用 states <- map('state', fill=TRUE, col="transparent", plot=FALSE)
加载的地图没有夏威夷和阿拉斯加。
例如,您可以从 here 下载 20m 美国地图,并将其解压缩到当前目录。然后你应该在你的 R 当前目录中有一个名为 cb_2013_us_state_5m
的文件夹。
我已经对你发布的代码进行了一些修改,在夏威夷和阿尔萨卡工作,没有尝试过其他状态。
library(sp)
library(rgeos)
library(rgdal)
# The single argument to this function, pointsDF, is a data.frame in which:
# - column 1 contains the longitude in degrees (negative in the US)
# - column 2 contains the latitude in degrees
latlong2state <- function(pointsDF) {
states <-readOGR(dsn='cb_2013_us_state_5m',layer='cb_2013_us_state_5m')
states <- spTransform(states, CRS("+proj=longlat"))
pointsSP <- SpatialPoints(pointsDF,proj4string=CRS("+proj=longlat"))
# Use 'over' to get _indices_ of the Polygons object containing each point
indices <- over(pointsSP, states)
indices$NAME
}
# Test the function using points in Alaska (ak) and Hawaii (hi)
ak <- data.frame(lon = c(-151.0074), lat = c(63.0694))
hi <- data.frame(lon = c(-157.8583), lat = c(21.30694))
latlong2state(ak)
latlong2state(hi)
这是基于包 maps
中的数据集,其中仅包括较低的 48 个。对于您的任务,它需要一个包含所有州的 shapefile。 Census.gov 网站始终是查找这些内容的好地方。我对您发布的函数做了一些更改,以便它可以与这个新的 shapefile 一起使用。
#download a shapefile with ALL states
tmp_dl <- tempfile()
download.file("http://www2.census.gov/geo/tiger/GENZ2013/cb_2013_us_state_20m.zip", tmp_dl)
unzip(tmp_dl, exdir=tempdir())
ST <- readOGR(tempdir(), "cb_2013_us_state_20m")
latlong2state <- function(pointsDF) {
# Just copied the earlier code with some key changes
states <- ST
# Convert pointsDF to a SpatialPoints object
# USING THE CRS THAT MATCHES THE SHAPEFILE
pointsCRS <- "+proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0"
pointsSP <- SpatialPoints(pointsDF, proj4string=CRS(pointsCRS))
# Use 'over' to get _indices_ of the Polygons object containing each point
indices <- over(pointsSP, states)
# Return the state names of the Polygons object containing each point
as.vector(indices$NAME)
}
我们来测试一下!
ak <- data.frame(lon = c(-151.0074), lat = c(63.0694))
hi <- data.frame(lon = c(-157.8583), lat = c(21.30694))
nc <- data.frame(lon = c(-77.335), lat = c(34.671))
latlong2state(ak)
[1] "Alaska"
latlong2state(hi)
[1] "Hawaii"
latlong2state(nc)
[1] "North Carolina"
如何将夏威夷和阿拉斯加添加到以下代码(取自 Josh O'Brien 的回答:Latitude Longitude Coordinates to State Code in R)?
library(sp)
library(maps)
library(maptools)
# The single argument to this function, pointsDF, is a data.frame in which:
# - column 1 contains the longitude in degrees (negative in the US)
# - column 2 contains the latitude in degrees
latlong2state <- function(pointsDF) {
# Prepare SpatialPolygons object with one SpatialPolygon
# per state (plus DC, minus HI & AK)
states <- map('state', fill=TRUE, col="transparent", plot=FALSE)
IDs <- sapply(strsplit(states$names, ":"), function(x) x[1])
states_sp <- map2SpatialPolygons(states, IDs=IDs,
proj4string=CRS("+proj=longlat +datum=wgs84"))
# Convert pointsDF to a SpatialPoints object
pointsSP <- SpatialPoints(pointsDF,
proj4string=CRS("+proj=longlat +datum=wgs84"))
# Use 'over' to get _indices_ of the Polygons object containing each point
indices <- over(pointsSP, states_sp)
# Return the state names of the Polygons object containing each point
stateNames <- sapply(states_sp@polygons, function(x) x@ID)
stateNames[indices]
}
# Test the function using points in Alaska (ak) and Hawaii (hi)
ak <- data.frame(lon = c(-151.0074), lat = c(63.0694))
hi <- data.frame(lon = c(-157.8583), lat = c(21.30694))
nc <- data.frame(lon = c(-77.335), lat = c(34.671))
latlong2state(ak)
latlong2state(hi)
latlong2state(nc)
latlong2state(ak)
和latlong2state(hi)
代码returns NA,但如果正确修改代码,将返回阿拉斯加和夏威夷作为结果。
感谢任何帮助!
您需要使用包含 50 个州的地图,您使用 states <- map('state', fill=TRUE, col="transparent", plot=FALSE)
加载的地图没有夏威夷和阿拉斯加。
例如,您可以从 here 下载 20m 美国地图,并将其解压缩到当前目录。然后你应该在你的 R 当前目录中有一个名为 cb_2013_us_state_5m
的文件夹。
我已经对你发布的代码进行了一些修改,在夏威夷和阿尔萨卡工作,没有尝试过其他状态。
library(sp)
library(rgeos)
library(rgdal)
# The single argument to this function, pointsDF, is a data.frame in which:
# - column 1 contains the longitude in degrees (negative in the US)
# - column 2 contains the latitude in degrees
latlong2state <- function(pointsDF) {
states <-readOGR(dsn='cb_2013_us_state_5m',layer='cb_2013_us_state_5m')
states <- spTransform(states, CRS("+proj=longlat"))
pointsSP <- SpatialPoints(pointsDF,proj4string=CRS("+proj=longlat"))
# Use 'over' to get _indices_ of the Polygons object containing each point
indices <- over(pointsSP, states)
indices$NAME
}
# Test the function using points in Alaska (ak) and Hawaii (hi)
ak <- data.frame(lon = c(-151.0074), lat = c(63.0694))
hi <- data.frame(lon = c(-157.8583), lat = c(21.30694))
latlong2state(ak)
latlong2state(hi)
这是基于包 maps
中的数据集,其中仅包括较低的 48 个。对于您的任务,它需要一个包含所有州的 shapefile。 Census.gov 网站始终是查找这些内容的好地方。我对您发布的函数做了一些更改,以便它可以与这个新的 shapefile 一起使用。
#download a shapefile with ALL states
tmp_dl <- tempfile()
download.file("http://www2.census.gov/geo/tiger/GENZ2013/cb_2013_us_state_20m.zip", tmp_dl)
unzip(tmp_dl, exdir=tempdir())
ST <- readOGR(tempdir(), "cb_2013_us_state_20m")
latlong2state <- function(pointsDF) {
# Just copied the earlier code with some key changes
states <- ST
# Convert pointsDF to a SpatialPoints object
# USING THE CRS THAT MATCHES THE SHAPEFILE
pointsCRS <- "+proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0"
pointsSP <- SpatialPoints(pointsDF, proj4string=CRS(pointsCRS))
# Use 'over' to get _indices_ of the Polygons object containing each point
indices <- over(pointsSP, states)
# Return the state names of the Polygons object containing each point
as.vector(indices$NAME)
}
我们来测试一下!
ak <- data.frame(lon = c(-151.0074), lat = c(63.0694))
hi <- data.frame(lon = c(-157.8583), lat = c(21.30694))
nc <- data.frame(lon = c(-77.335), lat = c(34.671))
latlong2state(ak)
[1] "Alaska"
latlong2state(hi)
[1] "Hawaii"
latlong2state(nc)
[1] "North Carolina"