如何将含经纬度的犯罪数据框与圣保罗区shapefile合并并统计分区犯罪数
解决空间点数据与区域面数据的匹配及汇总问题
看起来你卡在空间数据匹配和犯罪数量汇总这一步了,别担心,这是空间分析里非常常见的操作,核心问题大概率是坐标系不匹配——你的犯罪点数据用的是经纬度(WGS84坐标系),而圣保罗区域的shapefile显示的是UTM投影坐标(比如352436.9这种平面坐标),不统一坐标系的话空间匹配肯定会失败。
下面我给你两种解决方案:一种基于你已经在用的sp包,另一种是更现代易用的sf包(强烈推荐,现在是R空间数据处理的标准工具)。
方法一:基于sp包的实现步骤
1. 读取并检查shapefile的坐标系
首先你需要读取圣保罗的区域shapefile,并确认它的投影信息:
library(sp) library(rgdal) # 替换成你的shapefile路径和图层名 districts_sp <- readOGR(dsn = "你的shapefile所在文件夹路径", layer = "shapefile的图层名") # 查看shapefile的投影参数 print(proj4string(districts_sp))
2. 统一点数据与面数据的坐标系
你的df.sp是经纬度格式(WGS84),需要转换为和shapefile完全一致的投影:
# 转换点数据的投影 df.sp_proj <- spTransform(df.sp, CRSobj = proj4string(districts_sp))
3. 空间匹配:将点关联到对应区域
用over()函数完成点与面的空间匹配,得到每个犯罪点所属的区域:
# 匹配每个点对应的区域信息 point_district_mapping <- over(df.sp_proj, districts_sp) # 将匹配结果合并回原始数据 df_with_district <- cbind(df.sp_proj@data, point_district_mapping)
4. 按区域汇总犯罪数量
最后用aggregate()函数按区域名称(NOME_DIST)汇总n_homdol的总和:
# 按区域分组求和 crime_count_by_district <- aggregate(n_homdol ~ NOME_DIST, data = df_with_district, sum)
方法二:基于sf包的实现步骤(推荐)
sf包比sp包更直观,语法更贴近常规数据框操作,处理大数量数据(比如你的10000+条观测)效率也更高:
1. 读取shapefile并转换点数据为sf对象
library(sf) # 读取圣保罗区域shapefile districts_sf <- st_read("你的shapefile所在文件夹路径") # 将原始犯罪数据框转换为sf空间对象(经纬度对应EPSG:4326,即WGS84) df_sf <- st_as_sf(df, coords = c("longitude", "latitude"), crs = 4326)
2. 统一坐标系
将点数据转换为和shapefile一致的投影:
df_sf_proj <- st_transform(df_sf, crs = st_crs(districts_sf))
3. 空间连接与汇总
用st_join()完成点面匹配,再直接分组求和:
# 空间连接:将点匹配到所在区域(st_within确保点完全在区域内) joined_data <- st_join(df_sf_proj, districts_sf, join = st_within) # 按区域汇总n_homdol总和 crime_count_by_district_sf <- aggregate(n_homdol ~ NOME_DIST, data = joined_data, sum)
额外注意事项
- 如果有部分犯罪点不在任何圣保罗区域内,匹配结果会出现
NA,你可以用na.omit()过滤,或者根据需求处理这些异常点。 - 确保shapefile的路径和图层名正确,
readOGR或st_read如果找不到文件会报错,注意检查路径格式。
内容的提问来源于stack exchange,提问作者mmramame
相关产品推荐
相关产品推荐

