Как мне отфильтровать все точки в фигуре OSM? - PullRequest
1 голос
/ 26 февраля 2020

Я пытаюсь найти все станции внутри Манхэттена из набора данных CitiBikes. Я могу получить форму Манхэттена из OpenStreetMap по

q <- opq(bbox="Manhattan")
q <- add_osm_feature(q, key="name", value="Manhattan")
q <- add_osm_feature(q, key="boundary", value="administrative")
administrative <- osmdata_sf (q)
manhattan = administrative$osm_multipolygons[1]
plot(manhattan, main="Manhattan borough")

, и я могу преобразовать данные в точки простой геометрии по

cbike <- read.csv(file="201903-citibike-tripdata.csv", stringsAsFactors=F, 
                  sep=",", na.strings=c("NA","NaN", "NULL"))
cbike$start.sf <- cbike %>%
  select(lat=start.station.latitude, lon=start.station.longitude) %>%
  st_as_sf(coords=c("lon", "lat"), crs=st_crs(manhattan))

, но я не могу получить, какие точки l ie внутри manhattan. Я предполагаю, что хочу использовать st_intersection или st_intersects для получения логического вектора, но я немного растерялся из-за того, как это работает: любой предикат выглядит пустым.

> inside = cbike$start.sf[1,1]
> inside
Simple feature collection with 1 feature and 0 fields
geometry type:  POINT
dimension:      XY
bbox:           xmin: -74.00945 ymin: 40.71107 xmax: -74.00945 ymax: 40.71107
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
                    geometry
1 POINT (-74.00945 40.71107)

Это точка на Фултон-стрит, явно внутри Манхэттена. Однако st_intersects(inside, manhattan) и st_within(inside, manhattan) оба пусты. (st_intersects(inside, inside) и st_intersects(manhattan, manhattan) оба TRUE, поэтому я предполагаю, что это не то, что точки или мультиполигоны вообще не могут пересекаться)

(Это с osmdata, sf и dplyr пакеты.)

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вы проверили правильность геометрии Манхэттена? Проверьте https://www.r-spatial.org/r/2017/03/19/invalid.html#corrup -или-неверно-геометрии ! Похоже, вы не используете библиотеку lwgeom. Установка его (вероятно, из источников), загрузка и последующий запуск st_make_valid на manhattan дает допустимую геометрию, которая имеет непустое пересечение с точками в Манхэттене:

manhattan <- st_make_valid(manhattan)

cbike$start.sf <- cbike %>%
  select(lat=start.station.latitude, lon=start.station.longitude) %>%
  st_as_sf(coords=c("lon", "lat"), crs=st_crs(manhattan))

cbike$starts.inside.manhattan <- st_intersects(cbike$start.sf, manhattan, sparse=FALSE)[,1]

(возвращаемое значение st_intersects - это матрица парных пересечений n × 1, для которой требуется только первый столбец)

> cbike$starts.inside.manhattan
   [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
  [21]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
1 голос
/ 26 февраля 2020

Если вы хотите выбрать только стартовые станции Манхэттена, это можно сделать только из координат bbox:

xmin <- as.numeric(sub("(.*),.*,.*,.*", "\\1", administrative[[1]]))
xmax <- as.numeric(sub(".*,.*,(.*),.*", "\\1", administrative[[1]]))
ymin <- as.numeric(sub(".*,.*,.*,(.*)", "\\1", administrative[[1]]))
ymax <- as.numeric(sub(".*,(.*),.*,.*", "\\1", administrative[[1]]))

cbike$start_sf <- cbike %>%
  select(lat=`Start Station Latitude`, lon=`Start Station Longitude`) %>% 
subset(., (lat>=xmin & lat<=xmax & lon<=ymin & lon>=ymax)) %>%
  st_as_sf(coords=c("lon", "lat"), crs=st_crs(manhattan))
...