首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何过滤OSM形状中的所有点?

如何过滤OSM形状中的所有点?
EN

Stack Overflow用户
提问于 2020-02-27 02:19:57
回答 2查看 65关注 0票数 0

我在试着从CitiBikes数据集中找到曼哈顿所有的站点。我可以从OpenStreetMap上得到曼哈顿的形状

代码语言:javascript
复制
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")

我可以通过以下方法将数据转换为简单的几何点

代码语言:javascript
复制
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))

但是我不知道manhattan里面有哪些点。我假设我想使用st_intersectionst_intersects来获得一个布尔向量,但是我对它的工作原理有点迷惑:任何谓词都是空的。

代码语言:javascript
复制
> 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,所以我假设通常不是点或多面体不能相交)

(这是与osmdatasfdplyr包一起使用的。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-27 08:29:27

你检查过曼哈顿几何的有效性吗?看看https://www.r-spatial.org/r/2017/03/19/invalid.html#corrup-or-invalid-geometries吧!您似乎没有使用lwgeom库。安装它(可能来自源代码),加载,然后在manhattan上运行st_make_valid,得到一个与曼哈顿的点具有非空交叉点的有效几何体:

代码语言:javascript
复制
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矩阵,只需要第一列)

代码语言:javascript
复制
> 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
EN

Stack Overflow用户

发布于 2020-02-27 03:51:32

如果您只想选择曼哈顿起点站点,则可以从bbox的坐标中选择:

代码语言:javascript
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60420178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档