R 为什么从OSM/M获得的空间数据帧无效?

R 为什么从OSM/M获得的空间数据帧无效?,r,openstreetmap,sf,tmap,nominatim,R,Openstreetmap,Sf,Tmap,Nominatim,我想使用从OpenStreetMap获取可绘制的空间(边界/多边形)数据 namitm::osm\u search\u spatial请求似乎成功运行,但结果数据(尽管被发现为“SpatialPolygonsDataFrame”)显示为无效,我无法使用plot或tmap进行打印。它似乎也缺少CRS 我不确定我是否遗漏了一两步,或者从OSM检索到的数据是否确实有问题(似乎不太可能,但可能) 编辑:收到的数据中似乎存在纬度和经度问题,因此已使用新的reprex编辑了此问题。看起来可能需要在GIS论坛

我想使用从OpenStreetMap获取可绘制的空间(边界/多边形)数据

namitm::osm\u search\u spatial
请求似乎成功运行,但结果数据(尽管被发现为“SpatialPolygonsDataFrame”)显示为无效,我无法使用
plot
tmap
进行打印。它似乎也缺少CRS

我不确定我是否遗漏了一两步,或者从OSM检索到的数据是否确实有问题(似乎不太可能,但可能)

编辑:收到的数据中似乎存在纬度和经度问题,因此已使用新的reprex编辑了此问题。看起来可能需要在GIS论坛上提问,而不是在R中提问

删除了之前的reprex显示了多余的步骤和结果(移至gist)-这是Eugene Chong在其第一次回复中的回应

下面是我的新的、更专注的reprex,它显示了问题(OSM API密钥隐藏)。您可以看到多边形@coords从第一个点的-1,-1向右跳跃到第二个点的53,53,因此绘制了对角线

库(m)
#>数据(c)OpenStreetMap贡献者,ODbL 1.0。http://www.openstreetmap.org/copyright
#>提名使用政策:http://wiki.openstreetmap.org/wiki/Nominatim_usage_policy
#>MapQuest提名M使用条款:http://info.mapquest.com/terms-of-use/
图书馆(sf)
#>链接至GEOS 3.6.1、GDAL 2.2.3、项目4.9.3
图书馆(tmap)
图书馆(tibble)
#获取阿什菲尔德区(英国)的OSM搜索结果
ashfield[1]“列表”
#从列表中提取SPDF
ashfield[1]“空间多边形框架”
#>属性(,“包”)
#>[1]“sp”
#转换为SF对象并重试
ashfield_sf[1]“sf”数据帧
#设置CRS(感谢Eugene Chong)
st_crs(ashfield_sf)警告:ashfield_sf形状无效。请参见sf::st_是否有效

一瞥(ashfield@data)
#>意见:1
#>变量:15
#>$place_id“186877616”
#>$license“数据©OpenStreetMap贡献者,ODbL 1.0。https://...
#>$osm_类型“关系”
#>$osm_id“154043”
#>$lat 53.08977
#>$lon-1.251877
#>$display_name“联合国英格兰东米德兰郡诺丁汉郡阿什菲尔德”。。。
#>$class“边界”
#>$type“管理”
#>$0.2116014
#>$icon“http://ip-10-98-176-55.mq-us-east-1.ec2.aolcloud.net/...
#>$bbox_左53.0080617
#>$bbox_top 53.1714343
#>$bbox_右-1.3445928
#>$bbox_底部-1.1642542
头(ashfield@polygons[[1]]@Polygons[[1]]@coords)
#>           [,1]      [,2]
#> [1,] -1.344593 -1.344409
#> [2,] 53.063537 53.063260
#> [3,] 53.064985 53.063764
#> [4,] 53.065520 53.065521
#> [5,] 53.065553 53.065526
#> [6,] 53.065725 53.065656
ashfield_sf$几何
#>1要素的几何图形集
#>几何体类型:多边形
#>尺寸:XY
#>bbox:xmin:-1.344593 ymin:-1.344593 xmax:53.17143 ymax:53.17142
#>epsg(SRID):4326
#>proj4string:+proj=longlat+datum=WGS84+no_defs
#>多边形(-1.344593-1.344409,53.06354,53.0632。。。
由(v0.3.0)于2020年2月20日创建

下一步:我将尝试从Namingm直接下载,而不是通过R软件包,看看我得到了什么。

使用
lwgeom
软件包中的
st\u make\u valid()
可以消除警告:

将WGS84添加为crs

ashfield_sf <- sf::st_as_sf(ashfield)
st_crs(ashfield_sf) <- 4326

sf::st_is_valid(ashfield_sf, reason = TRUE)

[1] "Self-intersection[53.0709899483331 53.0709561246412]"
然而,就几何体本身而言,它仍然只是从俄罗斯延伸到非洲西海岸的一条线,而不是预期的阿什菲尔德多边形


至于为什么几何体在一开始是无效的,我不确定,但自相交错误表明多边形在某个点越过了自身(就像蝴蝶结一样)。请参阅这篇文章,其中有更多关于有效几何体和无效几何体的讨论:

这对Eugene很有帮助(嗨,再次!)-谢谢。我刚刚注意到一件事,它给了我一个很大的线索,告诉我这里到底出了什么问题。在OSM的数据中,我们有:``bbox\u left bbox\u top bbox\u right bbox\u bottom 53.0080617 53.1714343-1.3445928-1.1642542``这个一开始看起来还行,但当然错了:`code>bbox\u leftnumber(在俄罗斯!)应分配给
bbox\u bottom
,以及
bbox\u bottom
编号(非洲!)应该是左边的编号。53.*应该是纬度,-1.*应该是经度,但是经度被表示为经度,反之亦然。再次您好!嗯,我明白了。我不确定这两种方法是否可行,但可能有两种解决方案。第一种可能是
st_cast()
将多边形转换为点,使用
st_坐标()
获取坐标,使用翻转坐标的
st_as_sf()
获取坐标,然后
st_cast()
返回多边形。第二个可能是
应用()
通过geometry列,用第二个数字翻转每个坐标的第一个数字。这个github问题看起来可能是相关的:搜索Namingm会给出有效的输出,但只是位置数据而不是空间数据(比如执行
Namingm::osm_搜索
而不是
Namingm::osm_搜索空间
)我不清楚如何在mapquest/Namingm网站上进行“空间”搜索。啊-只需在mapquest api的搜索查询中添加
&polygon=1
,即可返回多边形。我已将此作为Namingm R软件包的一个问题提交:
library(lwgeom)
ashfield_sf_2 <- st_make_valid(ashfield_sf)
sf::st_is_valid(ashfield_sf_2, reason = TRUE)

[1] "Valid Geometry"