Create point layer and project into CRS 2278
Mean Center of the points
mean_feature <- apply(st_coordinates(results.proj), MARGIN = 2, FUN = mean)
mean_feature <- data.frame(place = "meanfeature", x = mean_feature[1], y = mean_feature[2])
mean_feature <- st_as_sf(mean_feature, coords = c("x", "y"), crs = 2278)
tmap_mode("view")
tm_basemap("OpenStreetMap.Mapnik")+
tm_shape(results.proj)+
tm_dots(col = "green", size = .1)+
tm_shape(mean_feature)+
tm_dots(col = "red", size = .5)
Convex Hull of the points
chull <- st_convex_hull(st_union(results.proj))
tmap_mode("view")
tm_basemap("OpenStreetMap.Mapnik")+
tm_shape(results.proj)+
tm_dots(col = "green")+
tm_shape(chull)+
tm_polygons(col = "brown", alpha = .25)
Spatial Join of the points - bars per 1000 people
library(tidycensus)
sa_acs <- get_acs(geography = "tract",
state = "TX",
county = "Bexar",
year = 2019,
variables = c("DP05_0001E"),
geometry = T,
output = "wide")
sa_acs2 <- sa_acs %>%
mutate(totpop = DP05_0001E) %>%
dplyr::select(totpop)
sa_acs2 <- st_transform(sa_acs2, crs = 2278)
# sa_trol <- st_cast(sa_acs2, "MULTILINESTRING")
spjoin <- st_join(results.proj, sa_acs2)
sa_acs2$nbars <- lengths(st_intersects(sa_acs2, results.proj))
sa_acs2$bars_per_capita <- 1000*(sa_acs2$nbars / sa_acs2$totpop)
tmap_mode("plot")
nbarspc_map <- tm_basemap("OpenStreetMap.Mapnik")+
tm_shape(sa_acs2)+
tm_polygons("bars_per_capita")+
tm_shape(spjoin, is.master = T)+
tm_dots(size = .2)
nbarspc_map

Nearest Neighbor Analysis of the bar layer
library(spatstat)
bars.pp <- as.ppp(as(results.proj, "Spatial"))
plot(nearest.neighbour(bars.pp))

options(qgisprocess.path = "C://Program Files//QGIS 3.16.16//bin//qgis_process-qgis-ltr.bat")
library(qgisprocess)
qgis_configure()
bars_nn <- qgis_run_algorithm(alg="native:nearestneighbouranalysis",
INPUT=results.proj,
OUTPUT_HTML_FILE=file.path(tempdir(), "barsnn.html"),
load_output = TRUE)
bars_nn
## <Result of `qgis_run_algorithm("native:nearestneighbouranalysis", ...)`>
## List of 6
## $ EXPECTED_MD : num 1885
## $ NN_INDEX : num 0.963
## $ OBSERVED_MD : num 1815
## $ OUTPUT_HTML_FILE: 'qgis_outputHtml' chr "C:\\Users\\r_lab\\AppData\\Local\\Temp\\RtmpeYV0Qz/barsnn.html"
## $ POINT_COUNT : num 25
## $ Z_SCORE : num -0.352
Numeric summary of the analysis: The nearest neighbor index is less than 1 (0.963), indicating the pattern is clustered.
However, the graph generally indicates dispersion at the shorter distances (observed distances greater than expected distances) and then changes to clustering at the higher distances (observed distances less than expected distances).
LS0tDQp0aXRsZTogIjcwOTNfSFc2Ig0KYXV0aG9yOiAiUnlhbiBMYWJpbyINCmRhdGU6ICIzLzgvMjAyMiINCm91dHB1dDoNCiAgIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2hlaWdodDogNw0KICAgIGZpZ193aWR0aDogNw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQoNCmxpYnJhcnkobWFwdmlldykNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGNlbnN1c3h5KQ0KbGlicmFyeShkcGx5cikNCg0KYGBgDQoNCiMjIENyZWF0ZSBwb2ludCBsYXllciBhbmQgcHJvamVjdCBpbnRvIENSUyAyMjc4DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KDQphZGRyIDwtIHJlYWQuY3N2KCJDOi8vVVRTQS8vT25lRHJpdmUgLSBVbml2ZXJzaXR5IG9mIFRleGFzIGF0IFNhbiBBbnRvbmlvLy8zX1dfNzA5M19HSVMvL0dJU0NsYXNzd29yay8vNTgxM2RyaW5raW5ncGxhY2VzLmNzdiIpDQoNCmFkZHIgPC0gYWRkciAlPiUNCiAgZHBseXI6OnNlbGVjdChuYW1lcyhhZGRyKVtjKDQsNiwxNCwyMzoyNCw0MSw0MildKQ0KDQpyZXN1bHRzIDwtIHN0X2FzX3NmKGFkZHIsIGNvb3JkcyA9IGMoIkxvbmdpdHVkZSIsICJMYXRpdHVkZSIpLCBjcnM9NDI2OSwgYWdyPSJjb25zdGFudCIpDQoNCnJlc3VsdHMucHJvaiA8LSBzdF90cmFuc2Zvcm0ocmVzdWx0cywgY3JzID0gMjI3OCkNCg0KYGBgDQoNCiMjIyBNYXBzaG90DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KDQphbGNvaG9sbWFwIDwtIG1hcHZpZXcocmVzdWx0cy5wcm9qKQ0KDQptYXBzaG90KGFsY29ob2xtYXAsIGZpbGUgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9tYXAxLnBuZyIpKQ0KDQphbGNvaG9sbWFwDQoNCmBgYA0KDQojIyMgT3BlblN0cmVldE1hcCAtIGRvdHMNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQoNCmxpYnJhcnkodG1hcCkNCmxpYnJhcnkodG1hcHRvb2xzKQ0KbGlicmFyeShPcGVuU3RyZWV0TWFwKQ0KDQpiZyA8LSByZWFkX29zbShyZXN1bHRzLnByb2osIGV4dD0xLjEpDQoNCnRtYXBfbW9kZSgidmlldyIpDQoNCnRtX2Jhc2VtYXAoIk9wZW5TdHJlZXRNYXAuTWFwbmlrIikrDQogIHRtX3NoYXBlKHJlc3VsdHMucHJvaikrDQogIHRtX2RvdHMoKQ0KDQp0bWFwX21vZGUoInBsb3QiKQ0KDQpgYGANCg0KIyMjIExlYWZsZXQgLSBtYXJrZXJzDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdnbWFwKQ0KbGlicmFyeShnZ3NwYXRpYWwpDQpsaWJyYXJ5KGxlYWZsZXQpDQoNCmxlYWZsZXQoKSAlPiUNCiAgYWRkVGlsZXMoKSU+JQ0KICBhZGRNYXJrZXJzKGxuZyA9IGFkZHIkTG9uZ2l0dWRlLCBsYXQ9IGFkZHIkTGF0aXR1ZGUpDQoNCmBgYA0KDQojIyBNZWFuIENlbnRlciBvZiB0aGUgcG9pbnRzDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KDQptZWFuX2ZlYXR1cmUgPC0gYXBwbHkoc3RfY29vcmRpbmF0ZXMocmVzdWx0cy5wcm9qKSwgTUFSR0lOID0gMiwgRlVOID0gbWVhbikNCg0KbWVhbl9mZWF0dXJlIDwtIGRhdGEuZnJhbWUocGxhY2UgPSAibWVhbmZlYXR1cmUiLCB4ID0gbWVhbl9mZWF0dXJlWzFdLCB5ID0gbWVhbl9mZWF0dXJlWzJdKQ0KDQptZWFuX2ZlYXR1cmUgPC0gc3RfYXNfc2YobWVhbl9mZWF0dXJlLCBjb29yZHMgPSBjKCJ4IiwgInkiKSwgY3JzID0gMjI3OCkNCg0KdG1hcF9tb2RlKCJ2aWV3IikNCg0KdG1fYmFzZW1hcCgiT3BlblN0cmVldE1hcC5NYXBuaWsiKSsNCiAgdG1fc2hhcGUocmVzdWx0cy5wcm9qKSsNCiAgdG1fZG90cyhjb2wgPSAiZ3JlZW4iLCBzaXplID0gLjEpKw0KICB0bV9zaGFwZShtZWFuX2ZlYXR1cmUpKw0KICB0bV9kb3RzKGNvbCA9ICJyZWQiLCBzaXplID0gLjUpDQoNCmBgYA0KDQojIyBDb252ZXggSHVsbCBvZiB0aGUgcG9pbnRzDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KDQpjaHVsbCA8LSBzdF9jb252ZXhfaHVsbChzdF91bmlvbihyZXN1bHRzLnByb2opKQ0KDQp0bWFwX21vZGUoInZpZXciKQ0KDQp0bV9iYXNlbWFwKCJPcGVuU3RyZWV0TWFwLk1hcG5payIpKw0KICB0bV9zaGFwZShyZXN1bHRzLnByb2opKw0KICB0bV9kb3RzKGNvbCA9ICJncmVlbiIpKw0KICB0bV9zaGFwZShjaHVsbCkrDQogIHRtX3BvbHlnb25zKGNvbCA9ICJicm93biIsIGFscGhhID0gLjI1KQ0KDQpgYGANCg0KIyMgU3BhdGlhbCBKb2luIG9mIHRoZSBwb2ludHMgLSBiYXJzIHBlciAxMDAwIHBlb3BsZQ0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQoNCmxpYnJhcnkodGlkeWNlbnN1cykNCg0Kc2FfYWNzIDwtIGdldF9hY3MoZ2VvZ3JhcGh5ID0gInRyYWN0IiwNCiAgICAgICAgICAgICAgICAgIHN0YXRlID0gIlRYIiwNCiAgICAgICAgICAgICAgICAgIGNvdW50eSA9ICJCZXhhciIsIA0KICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMTksDQogICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSBjKCJEUDA1XzAwMDFFIiksDQogICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFQsIA0KICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gIndpZGUiKQ0KDQpzYV9hY3MyIDwtIHNhX2FjcyAlPiUNCiAgbXV0YXRlKHRvdHBvcCA9IERQMDVfMDAwMUUpICU+JQ0KICAgIGRwbHlyOjpzZWxlY3QodG90cG9wKQ0KDQpzYV9hY3MyIDwtIHN0X3RyYW5zZm9ybShzYV9hY3MyLCBjcnMgPSAyMjc4KQ0KDQojIHNhX3Ryb2wgPC0gc3RfY2FzdChzYV9hY3MyLCAiTVVMVElMSU5FU1RSSU5HIikNCg0Kc3Bqb2luIDwtIHN0X2pvaW4ocmVzdWx0cy5wcm9qLCBzYV9hY3MyKQ0KDQpgYGANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQoNCnNhX2FjczIkbmJhcnMgPC0gbGVuZ3RocyhzdF9pbnRlcnNlY3RzKHNhX2FjczIsIHJlc3VsdHMucHJvaikpDQoNCnNhX2FjczIkYmFyc19wZXJfY2FwaXRhIDwtIDEwMDAqKHNhX2FjczIkbmJhcnMgLyBzYV9hY3MyJHRvdHBvcCkNCg0KdG1hcF9tb2RlKCJwbG90IikNCg0KbmJhcnNwY19tYXAgPC0gdG1fYmFzZW1hcCgiT3BlblN0cmVldE1hcC5NYXBuaWsiKSsNCiAgdG1fc2hhcGUoc2FfYWNzMikrDQogIHRtX3BvbHlnb25zKCJiYXJzX3Blcl9jYXBpdGEiKSsNCiAgdG1fc2hhcGUoc3Bqb2luLCBpcy5tYXN0ZXIgPSBUKSsNCiAgdG1fZG90cyhzaXplID0gLjIpDQoNCm5iYXJzcGNfbWFwDQoNCmBgYA0KDQojIyBOZWFyZXN0IE5laWdoYm9yIEFuYWx5c2lzIG9mIHRoZSBiYXIgbGF5ZXINCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KDQpsaWJyYXJ5KHNwYXRzdGF0KQ0KDQpiYXJzLnBwIDwtIGFzLnBwcChhcyhyZXN1bHRzLnByb2osICJTcGF0aWFsIikpDQoNCnBsb3QobmVhcmVzdC5uZWlnaGJvdXIoYmFycy5wcCkpDQoNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQoNCm9wdGlvbnMocWdpc3Byb2Nlc3MucGF0aCA9ICJDOi8vUHJvZ3JhbSBGaWxlcy8vUUdJUyAzLjE2LjE2Ly9iaW4vL3FnaXNfcHJvY2Vzcy1xZ2lzLWx0ci5iYXQiKQ0KDQpsaWJyYXJ5KHFnaXNwcm9jZXNzKQ0KDQpxZ2lzX2NvbmZpZ3VyZSgpDQoNCmJhcnNfbm4gPC0gcWdpc19ydW5fYWxnb3JpdGhtKGFsZz0ibmF0aXZlOm5lYXJlc3RuZWlnaGJvdXJhbmFseXNpcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlBVVD1yZXN1bHRzLnByb2osDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVRQVVRfSFRNTF9GSUxFPWZpbGUucGF0aCh0ZW1wZGlyKCksICJiYXJzbm4uaHRtbCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9vdXRwdXQgPSBUUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KDQpiYXJzX25uDQoNCmBgYA0KDQoqKk51bWVyaWMgc3VtbWFyeSBvZiB0aGUgYW5hbHlzaXM6KiogVGhlIG5lYXJlc3QgbmVpZ2hib3IgaW5kZXggaXMgbGVzcyB0aGFuIDEgKCoqMC45NjMqKiksIGluZGljYXRpbmcgdGhlIHBhdHRlcm4gaXMgY2x1c3RlcmVkLiANCg0KSG93ZXZlciwgdGhlIGdyYXBoIGdlbmVyYWxseSBpbmRpY2F0ZXMgZGlzcGVyc2lvbiBhdCB0aGUgc2hvcnRlciBkaXN0YW5jZXMgKG9ic2VydmVkIGRpc3RhbmNlcyBncmVhdGVyIHRoYW4gZXhwZWN0ZWQgZGlzdGFuY2VzKSBhbmQgdGhlbiBjaGFuZ2VzIHRvIGNsdXN0ZXJpbmcgYXQgdGhlIGhpZ2hlciBkaXN0YW5jZXMgKG9ic2VydmVkIGRpc3RhbmNlcyBsZXNzIHRoYW4gZXhwZWN0ZWQgZGlzdGFuY2VzKS4NCg==