将 Lat/Lon 点映射到 R 中的形状文件
Map Lat/Lon Points to a Shape File in R
我正在尝试使用 shapefile 识别每组 lat/lon 坐标的邮政编码。
Lat Lon 数据提取自:https://data.cityofchicago.org/Public-Safety/Crimes-2017/d62x-nvdr (Crimes_-_2001_to_present.csv)
形状文件:https://www2.census.gov/geo/tiger/PREVGENZ/zt/z500shp/
zt17_d00.shp(伊利诺伊州的邮政编码定义)
library(rgeos)
library(maptools)
ccs<-read.csv("Crimes_-_2001_to_present.csv")
zip.map <- readOGR("zt17_d00.shp")
latlon<-ccs[,c(20,21)]
str(latlon)
'data.frame': 6411517 obs. of 2 variables:
$ Latitude : num 42 41.7 41.9 41.8 42 ...
$ Longitude: num -87.7 -87.6 -87.7 -87.6 -87.7 ...
coordinates(latlon) = ~Longitude+Latitude
write.csv(cbind(latlon,over(zip.map,latlon)),"zip.match.csv")
这是我得到的错误:
错误 (函数 (类, fdef, mtable) :
无法为签名“"SpatialPolygonsDataFrame"、"data.frame"”
的函数“over”找到继承方法
我错过了什么?感谢您的帮助!
从错误消息来看,您的 coordinates(latlon) = ~Longitude+Latitude
行似乎没有成功将数据框转换为空间对象。您可能希望在转换后先通过 class(latlon)
调用进行检查。
绘制 shapefile 并将其与 latlon 层叠加也很有帮助,只是为了确保您的数据集确实重叠。如果他们不这样做,请检查他们是否共享相同的投影 (sp::identicalCRS
)。
以下是使用虚拟数据的示例,因为问题中的 shapefile link 不起作用。
library(rgdal)
# load Scotland shapefile, which came with the package
dsn <- system.file("vectors", package = "rgdal")[1]
shapefile <- readOGR(dsn=dsn, layer="scot_BNG")
shapefile <- spTransform(shapefile, CRS("+proj=longlat +datum=WGS84")) #change CRS
# create dummy data frame with coordinates in Scotland (I clicked randomly on Google Maps)
csvfile <- data.frame(lat = c(-4.952, -4.359, -2.425),
long = c(57.57, 56.59, 57.56))
# convert data frame to SpatialPoints class
coordinates(csvfile) <- ~lat+long
# make sure the two files share the same CRS
csvfile@proj4string <- shapefile@proj4string
# visual check
plot(shapefile, border = "grey")
points(csvfile, col = "red", cex = 5)
axis(1) # showing the axes helps to check whether the coordinates are what you expected
axis(2)
# if everything works out so far, the following should work
points_in_shape <- over(csvfile, shapefile)
> points_in_shape
SP_ID NAME ID_x COUNT SMR LONG LAT PY EXP_ AFF X_COOR Y_COOR ID_y
1 50 Ross-Cromarty 5 15 352.1 57.71 5.09 129271 4.3 10 220678.6 870935.6 5
2 11 Perth-Kinross 29 16 111.3 56.60 4.09 346041 14.4 10 291372.7 746260.5 29
3 3 Banff-Buchan 2 39 450.3 57.56 2.36 231337 8.7 16 385776.1 852378.2 2
> cbind(csvfile, points_in_shape["NAME"])
lat long NAME
1 -4.952 57.57 Ross-Cromarty
2 -4.359 56.59 Perth-Kinross
3 -2.425 57.56 Banff-Buchan
我正在尝试使用 shapefile 识别每组 lat/lon 坐标的邮政编码。
Lat Lon 数据提取自:https://data.cityofchicago.org/Public-Safety/Crimes-2017/d62x-nvdr (Crimes_-_2001_to_present.csv)
形状文件:https://www2.census.gov/geo/tiger/PREVGENZ/zt/z500shp/ zt17_d00.shp(伊利诺伊州的邮政编码定义)
library(rgeos)
library(maptools)
ccs<-read.csv("Crimes_-_2001_to_present.csv")
zip.map <- readOGR("zt17_d00.shp")
latlon<-ccs[,c(20,21)]
str(latlon)
'data.frame': 6411517 obs. of 2 variables:
$ Latitude : num 42 41.7 41.9 41.8 42 ...
$ Longitude: num -87.7 -87.6 -87.7 -87.6 -87.7 ...
coordinates(latlon) = ~Longitude+Latitude
write.csv(cbind(latlon,over(zip.map,latlon)),"zip.match.csv")
这是我得到的错误:
错误 (函数 (类, fdef, mtable) : 无法为签名“"SpatialPolygonsDataFrame"、"data.frame"”
的函数“over”找到继承方法我错过了什么?感谢您的帮助!
从错误消息来看,您的 coordinates(latlon) = ~Longitude+Latitude
行似乎没有成功将数据框转换为空间对象。您可能希望在转换后先通过 class(latlon)
调用进行检查。
绘制 shapefile 并将其与 latlon 层叠加也很有帮助,只是为了确保您的数据集确实重叠。如果他们不这样做,请检查他们是否共享相同的投影 (sp::identicalCRS
)。
以下是使用虚拟数据的示例,因为问题中的 shapefile link 不起作用。
library(rgdal)
# load Scotland shapefile, which came with the package
dsn <- system.file("vectors", package = "rgdal")[1]
shapefile <- readOGR(dsn=dsn, layer="scot_BNG")
shapefile <- spTransform(shapefile, CRS("+proj=longlat +datum=WGS84")) #change CRS
# create dummy data frame with coordinates in Scotland (I clicked randomly on Google Maps)
csvfile <- data.frame(lat = c(-4.952, -4.359, -2.425),
long = c(57.57, 56.59, 57.56))
# convert data frame to SpatialPoints class
coordinates(csvfile) <- ~lat+long
# make sure the two files share the same CRS
csvfile@proj4string <- shapefile@proj4string
# visual check
plot(shapefile, border = "grey")
points(csvfile, col = "red", cex = 5)
axis(1) # showing the axes helps to check whether the coordinates are what you expected
axis(2)
# if everything works out so far, the following should work
points_in_shape <- over(csvfile, shapefile)
> points_in_shape
SP_ID NAME ID_x COUNT SMR LONG LAT PY EXP_ AFF X_COOR Y_COOR ID_y
1 50 Ross-Cromarty 5 15 352.1 57.71 5.09 129271 4.3 10 220678.6 870935.6 5
2 11 Perth-Kinross 29 16 111.3 56.60 4.09 346041 14.4 10 291372.7 746260.5 29
3 3 Banff-Buchan 2 39 450.3 57.56 2.36 231337 8.7 16 385776.1 852378.2 2
> cbind(csvfile, points_in_shape["NAME"])
lat long NAME
1 -4.952 57.57 Ross-Cromarty
2 -4.359 56.59 Perth-Kinross
3 -2.425 57.56 Banff-Buchan