如何获取从网站上的svg到R的路径坐标

时间:2015-11-25 10:01:16

标签: html r svg

我正在尝试将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 ...>内的坐标时,我发现有很多曲线命令(例如sSc等)。是否有任何方法可以在曲线上找到一些平滑的点?

此外,还有更优雅的方式将R中的在线SVG作为多边形导入吗?

谢谢!

1 个答案:

答案 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_wktSpatialCollections对象,无法与ggplot2一起使用。但是,大多数SVG都转换为多边形:

plot(svg_wkt@polyobj)

enter image description here

请注意 svg_wkt@lineobj中的某些元素(即使您在R IMO中进行了完整转换,也会遇到这些元素)。这些将需要处理。

您可以将ID传递给readWKT,以便有希望能够在R中更多地使用此ID(即绘制您想要绘制的选举数据)但我必须回到我的身边如果你真的想绘制选举数据,那么主张使用正确的shapefile的原始建议。