首页 > 解决方案 > R中的SVG路径分析

问题描述

我在 R 中有以下 SVG 路径对象,笔画宽度为 300:

[\"M2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2216 800L2208 800L2197 803L2181 814L2164 830L2142 852L2117 877L2093 901L2071 923L2055 939L2039 950L2032 958L2024 966L2017 981L2013 989\",\"M1594 698L1594 698L1594 698L1594 698L1594 698L1594 698L1587 698L1582 698L1578 700L1571 708L1563 725L1561 765L1561 818L1561 864L1561 903L1563 929L1566 953L1566 968L1566 984L1566 990L1571 999L1575 1007L1583 1010\"] 

我的最终目标是计算印迹覆盖的区域。此刻我坚持使用这种数据格式。关于如何将此对象转换为能够在 R 中进行空间分析的格式的任何想法?

标签: rsvg

解决方案


在 SVG 路径中,“M”表示“移动到”,“L”表示“行到”。您有两条路径,它们都只使用一个 M,然后使用一堆 L,因此您可以对它们进行解码,而无需理解和解析 SVG 路径的全部可能性。

如果您将发布的内容拆分为两个 R 字符串,则可以得到两个字符串的向量,如下所示:

> s
[1] "M2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2227 800L2216 800L2208 800L2197 803L2181 814L2164 830L2142 852L2117 877L2093 901L2071 923L2055 939L2039 950L2032 958L2024 966L2017 981L2013 989"
[2] "M1594 698L1594 698L1594 698L1594 698L1594 698L1594 698L1587 698L1582 698L1578 700L1571 708L1563 725L1561 765L1561 818L1561 864L1561 903L1563 929L1566 953L1566 968L1566 984L1566 990L1571 999L1575 1007L1583 1010"           

然后在 M 或 L 上拆分字符串,得到像“1594 698”这样的字符中的坐标,然后将其拆分为空格字符,然后将其转换为数字,然后可以将其转换为两列矩阵。所以对于第一个:

> matrix(as.numeric(unlist(strsplit(strsplit(s[1],"[ML]")[[1]]," "))), ncol=2, byrow=TRUE)
      [,1] [,2]
 [1,] 2227  800
 [2,] 2227  800
 [3,] 2227  800
 [4,] 2227  800
 [5,] 2227  800

前十一点都是相同的。重复此操作以s[1]使用基本的 R 数据处理,您将获得两条如下所示的路径:

在此处输入图像描述

R 中可能有一个完整的 SVG 路径处理程序 - 你搜索过吗?我确信 Python 中至少有一个,Javascript 中可能有几个。如果您的路径更复杂并且除了 M 和 L 之外还有更多可能的 SVG 路径控制字符,请使用其中之一。


推荐阅读