反向聚类分析;用经度和纬度识别R中的空白空间或缺乏密度?

时间:2016-11-17 16:31:19

标签: r gis spatial rgdal

我正在开展一个项目,我有一个非常大的积分,我正在寻找识别区域(由缺乏聚类定义),其中这些点的密度在统计上显着低于其他点。通常视觉就足够但我有很多点,很难分辨出这些空白区域和密度热图不会帮助我在较小的区域上归零。也许我在这里错过了一些非常简单的东西,但我希望有人至少可以把我送到正确的方向去看看。下面是一个可重复的样本quick and dirty让我们从开放数据中获取这些点并将它们映射到NYC的行政区文件:

#libraries--------------------------

library(ggplot2)
library(ggmap)
library(sp)
library(jsonlite)
library(RJSONIO)
library(rgdal)

#call api data--------------------------

df =  fromJSON("https://data.cityofnewyork.us/resource/24t3-xqyv.json?$query= SELECT Lat, Long_")
df <- data.frame(t(matrix(unlist(df),nrow=length(unlist(df[1])))))
names(df)[names(df) == 'X2'] = 'x'
names(df)[names(df) == 'X1'] = 'y'
df = df[, c("x", "y")]
df$x = as.numeric(as.character(df$x))
df$y = as.numeric(as.character(df$y))
df$x = round(df$x, 4)
df$y = round(df$y, 4)
df$x[df$x < -74.2] = NA
df$y[df$y < 40.5] = NA
df = na.omit(df)

#map data----------------------------


cd = readOGR("nybb.shp", layer = "nybb")
cd = spTransform(cd, CRS("+proj=longlat +datum=WGS84"))
cd_f = fortify(cd)


#map data
nyc = ggplot() +
  geom_polygon(aes(x=long, 
                   y=lat, group=group), fill='grey', 
               size=.2,color='black', data=cd_f, alpha=1)


nyc + geom_point(aes(x = x, y = y), data = df, size = 1)

#how would I go about finding the empty spaces? That is the regions where there are no clusters?

在这种情况下,没有很多要点,但为了示范,我将如何:

  1. 识别低密度口袋
  2. 可能会在这些口袋上绘制多边形边界?
  3. 感谢帮助!

1 个答案:

答案 0 :(得分:0)

获得低密度多边形区域的一种方法是构建 Dirichlet / Voronoi确定并选择最大的。

下面我使用spatstatdeldir(由spatstat加载)来执行此操作。 它不是那么快,所以有更多的点,我不知道它会有多好 去。

要在ggmap和您可以转换的其他空间包中使用结果 从owinppp返回sp的空间类并使用 spTransform获取lat,long坐标。

首先加载包:

library(maptools)
library(spatstat)
library(jsonlite)

shapefile坐标中的地图和点(注意我从中读取数据) 从www)下载的本地文件:

cd = readOGR("nybb.shp", layer = "nybb")
#> OGR data source with driver: ESRI Shapefile 
#> Source: "nybb.shp", layer: "nybb"
#> with 5 features
#> It has 4 fields
df <- fromJSON("NYC_data.json")
df <- as.data.frame(matrix(as.numeric(unlist(df)), ncol = 2, byrow = TRUE))
df <- df[, c(2, 1)]
names(df) <- c("x", "y")
df <- df[df$x > -74.2 & df$y > 40.5, ]
coordinates(df) <- ~x+y
proj4string(df) <- CRS("+proj=longlat +datum=WGS84")
df2 <- spTransform(df, proj4string(cd))

切换到spatstat班级:

cd2 <- as(cd, "SpatialPolygons")
W <- as(cd2, "owin")

X <- as(df2, "ppp")
Window(X) <- W

plot(X, main = "")

计算Dirichlet曲面细分和区域并绘制曲面细分:

d <- dirichlet(X)
#> Warning: 96 duplicated points were removed
a <- tile.areas(d)
plot(d, main = "")

结合曲面细分的n_areas个最大区域:

n_areas <- 30
empty <- tess(tiles = d$tiles[tail(order(a), n = n_areas)])
empty2 <- as.owin(empty)

绘制结果:

plot(W, main = "")
plot(empty2, col = "red", add = TRUE)
plot(X, add = TRUE)