当前位置: 首页 > 知识库问答 >
问题:

如何通过shapefile多边形聚合地理编码数据以使用R进行可视化?

刘海
2023-03-14

我有一个地理编码的数据集,我正在尝试将其聚合为多边形,以便将结果绘制为不同级别(例如郊区、地方政府区域等)的一系列地图。

为此,我遵循一种方法 - 如下所示 - 它使用 sp 包中的 over 函数将数据与空间对象连接起来,并查找我的坐标(来自单独的文件)落入的多边形。然后,我使用 ggplot2 强化了要绘制的空间对象

shapefile可从澳大利亚统计局网站下载(文件:“ESRI Shapefile格式的ASGS郊区非ABS结构Ed 2011数字边界”)。我在google sheet中保存了一些地理编码的示例数据,可以通过运行下面的代码来访问。

我最初的尝试在下面的代码中:

## LOAD REQUIRED PACKAGES

library(googlesheets)
library(dplyr)
library(ggplot2)
library(sp)
library(rgdal)
library(maptools)

## READ DATA FROM GOOGLE SHEETS FILE

googleDocKey <- "1IyXSC0dtOCh1xGFiBG38nKzK2nO8wKUECRCEhvtZVS0"
geoCodedData <- googleDocKey %>% gs_key()
geoData <- geoCodedData %>% gs_read(ws = "geoData", range = cell_limits()) 
suburbList <- geoCodedData %>% gs_read(ws = "suburbList", range = cell_limits())

## SET COORDINATES FROM GEOCODED DATA

geoData <- as.data.frame(geoData)
coordinates(geoData) <- c("Longitude","Latitude")

## LOAD AUSTRALIA SHAPEFILE AND SUBSET FOR NSW 
## YOU WILL NEED TO DOWNLOAD THIS FILE FROM THE ABS MANUALLY (LINK ABOVE)

ausSuburbs <- readOGR(dsn ="02 - Shapefiles", layer="SSC_2011_AUST")
suburbList$SSC_CODE_2011 <- as.numeric(suburbList$SSC_CODE_2011)
nswSuburbList <- suburbList %>%
        filter(SSC_CODE_2011 < 20000) %>%
        filter(SSC_CODE_2011 > 9999) %>%
        select(SSC_CODE_2011)
nswSuburbs <- ausSuburbs[ausSuburbs$SSC_CODE %in% nswSuburbList$SSC_CODE_2011, ]   
nswSuburbs <- nswSuburbs[!nswSuburbs$SSC_CODE %in% 11408,] # exclude Lord Howe Island

## TELL R THAT THE COORDINATES IN THE SHAPEFILE MATCH THOSE IN THE SPATIAL POINTS DATA FRAME

proj4string(geoData) <- proj4string(nswSuburbs)

## ASSIGN UNIQUE IDENTIFIER TO EACH SPATIAL OBJECT

nswSuburbs@data$id <- rownames(nswSuburbs@data)

nswSuburbs@data <- mutate(nswSuburbs@data, id_poly = as.numeric(rownames(nswSuburbs@data)))

geoData@data <- mutate(geoData@data, id_shape = as.numeric(rownames(geoData@data)))

## GET THE SUBURB THAT THE POINT IS LOCATED IN

gpsSuburb <- over(geoData, nswSuburbs)

## ADD 'id_shape' TO THE DATA FRAME

gpsSuburbID <- mutate(gpsSuburb, id_shape = as.numeric(rownames(gpsSuburb)))

## AGGREGATE DROP BEAR DATA BY SUBURB

gpsSuburbJoin <- left_join(geoData@data, gpsSuburbID, by = c("id_shape" = "id_shape"))
gpsSuburbData <- gpsSuburbJoin %>%
        group_by(SSC_CODE) %>%
        summarise(DropBearSightings = sum(DropBearSightings))
gpsSuburbData <- as.data.frame(gpsSuburbData)

## CONVERT SHAPEFILE TO DATA FRAME TO ALLOW DATA TO BE JOINED TO IT

nswPoints <- fortify(nswSuburbs, region="id")
nswData <- merge(nswPoints, nswSuburbs, by="id", stringsAsFactors=FALSE)
nswData$id <- as.numeric(nswData$id)

nswSuburbMapData <- merge(nswData, gpsSuburbData, by="SSC_CODE", stringsAsFactors=FALSE)
nswSuburbMapData <- nswSuburbMapData[order(nswSuburbMapData$id,     nswSuburbMapData$id),]

## SET THEME FOR GGPLOT

theme_clean <- function(base_size = 12) {
        require(grid)
        theme_grey(base_size) %+replace%
                    theme(
                                axis.title = element_blank(),
                                axis.text = element_blank(),
                                panel.background = element_blank(),
                                panel.grid = element_blank(),
                                axis.ticks.length = unit(0,"cm"), 
                                axis.ticks.margin = unit(0,"cm"),
                                panel.margin = unit(0,"lines"),
                                plot.margin = unit(c(0, 0, 0, 0), "lines"),
                                complete = TRUE
                    )}

## PLOT TEST MAP USING GGPLOT

dropBearMap <- ggplot(nswSuburbMapData) +
        aes(long, lat, group=group, fill=DropBearSightings) +
        geom_polygon() +
        coord_map(projection = "mercator", xlim = c(140.0, 154.0), ylim = c(-38.0, -27.0)) +
theme_clean()
dropBearMap
#ggsave("dropBearMap.png", type = "cairo-png")

对于如何解决这个问题,我非常感谢任何建议。干杯

共有1个答案

陶腾
2023-03-14

好吧,我的第一个答案是wayyyy off…我没有太多使用dplyr的经验,并且在编辑数据槽时过于紧张。问题要简单得多。合并功能会打乱需要在绘图前恢复的强化形状文件的顺序,因此:

< code>nswSuburbMapData

需要变成这样:

< code>nswSuburbMapData

绘制时会产生以下结果:

为了使地图更有用,您可能需要做一些额外的更改,但这应该是正确表示的数据。

 类似资料:
  • 我想将光栅数据聚合到自定义形状文件中的每个多边形。 在这种情况下,我想获得撒哈拉以南非洲次国家区域城市化的平均程度。 我的sf如下所示: 或绘制: 另一方面,光栅数据采用以下形式: 这些比整个星球所需的要细得多。为了加速计算,我首先聚合光栅,然后将其转换为shapefile,剩余的每个光栅像素都转换为shapefile中的点几何形状。然后,这个shapefile可以聚合到我的区域边界。诚然,这不是

  • **有没有办法使用gganimate包对此地图进行动画处理,其中第一帧仅填充检测日期为2002年的多边形,第二帧填充的多边形,检测日期为2003年或更早(因此为2002年和2003年),第三帧用于检测日期为2004年或更早(2002年,2003年, 2004年),等等?**澄清:我希望所有县多边形始终可见,并且最初用白色填充,并且动画的每个帧都会根据检测年份添加县的填充。 我尝试使用与静态绘图,但

  • 我正试图弄清楚如何使用Spring Batch进行聚合。例如,我有一个带有姓名列表的CSV文件: 我想要文本文件中的姓名计数: 根据我从Spring Batch中学到的,ETL批处理过程(itemReader- Spring Batch是正确的工具吗?还是我应该用Spark?谢谢

  • 我将如何在Spring靴中使用? 我需要一个“yildiz”平均值。 我的收藏 avg_yildiz MongoDBConfig。Java语言 MongoDB配置类。如何添加mongoTemplate? 编辑 Java语言lang.IllegalArgumentException:不支持的实体com。应用领域八一!无法确定IsNewStrategy。 如何保存存储库?

  • 如何从多个地理位置(长,晚值)创建多边形地理围栏。也可以在Android上跟踪用户进入或退出该地理区域的情况。

  • 我正在使用R中的ggmap包和Google Maps API对街道地址(n=18,000)进行地理编码,据我所知,每天对地址的地理编码请求限制为2,500次。 我正在使用的地理编码脚本非常简单,适用于我尝试过的小型测试df(如下面的示例),但我想知道在接下来的~7天内为每个2500行块拼接所有18000个位置的最终地理编码df的最简单/优雅的方法。 我考虑过只按天对它们进行编号,然后在最后将它们绑