我正在尝试将an online SVG map导入R,以查看是否可以在R中重现结果。
首先,我可以使用以下代码下载SVG的html代码:
svg <- html("https://dce2015.thestandnews.com") %>% html_nodes("g")
并进一步使用
... %>% html_nodes("polygon") %>% html_attr("points")
... %>% html_nodes("polyline") %>% html_attr("points")
... %>% html_nodes("path") %>% html_attr("d")
获取字符串中的坐标。
我可以处理<polygon ...>
和<polyline ...>
但是当我尝试提取<path ...>
内的坐标时,我发现有很多曲线命令(例如s
,S
,c
等)。是否有任何方法可以在曲线上找到一些平滑的点?
此外,还有更优雅的方式将R中的在线SVG作为多边形导入吗?
谢谢!
答案 0 :(得分:2)
你试图找到一个选区的实际形状文件会更好很多(我并没有真正尝试找到一个,但快速谷歌建议它确实存在)。然而,这是一个有趣的想法。
我认为从DOM-javascript将svg-to-wkt移植到R最终会很酷。但是,如果这是一次性解决方案,那么您可以执行以下操作:
library(rvest)
library(rgeos)
URL <- "https://dce2015.thestandnews.com/"
pg <- read_html(URL)
svg_map <- html_nodes(pg, "svg#hkmap")
writeLines(as.character(svg_map), "hk.txt")
# use http://svg-to-wkt.linfiniti.com/ with svg from hk.txt
# saving it to hk.wkt
wkt_txt <- paste0(readLines("hk.wkt"), sep="", collapse="")
svg_wkt <- readWKT(wkt_txt)
svg_wkt
是SpatialCollections
对象,无法与ggplot2一起使用。但是,大多数SVG都转换为多边形:
plot(svg_wkt@polyobj)
请注意 svg_wkt@lineobj
中的某些元素(即使您在R IMO中进行了完整转换,也会遇到这些元素)。这些将需要处理。
您可以将ID传递给readWKT
,以便有希望能够在R中更多地使用此ID(即绘制您想要绘制的选举数据)但我必须回到我的身边如果你真的想绘制选举数据,那么主张使用正确的shapefile的原始建议。