KML 多边形的 SVG 路径

我想用 Java 创建一个 svg 到 kml 转换器。我为此任务创建了一种翻译器,它接收 svg 格式的文本并打印出 kml 格式的文本。到目前为止,我能够处理圆形和矩形标签。我无法处理路径。


如何读取 svg 路径(d 属性)并在 kml 中重建它们?


主要问题源于这样一个事实,即 svg 路径不是简单的坐标序列,它们中有曲线。这是我需要处理的 svg 路径输入示例:


<html>

<body>


<svg width="10000" height="1000">

<path id="square" fill="#0000FF" 

d="M351.3,251 l-3.1-2.2c-0.3-0.2-0.3-0.5-0.1-0.8l2.2-3.1c0.2-0.3,0.5-0.3,0.8-0.1l3.1,2.2

c0.3,0.2,0.3,0.5,0.1,0.8l-2.2,3.1C355,251.1,354.6,251.2,354.3,251z"/>


</body>

</html>

如果我能弄清楚如何评估 d 属性中的字符串,唯一的另一个问题是如何使用从 d 属性中的字符串中提取的值来创建曲线。


这种路径格式不是网上常见的格式;它是由其他人使用 adobe illustrator 创建的,现在我无法访问该软件。由于没有空格或常规逗号,我无法理解如何正确读取字符串。


幕布斯7119047
浏览 193回答 1
1回答

料青山看我应如是

我找到了一种在 JavaScript 中将 SVG 路径转换为 SVG 多边形的简单方法。SVG 多边形可以轻松转换为 KML 地标,因为两者都使用坐标列表。这个脚本可以放在一个 HTML 文件中,并且可以直接在浏览器上运行。它将从您的计算机获取 SVG 文件并将修改后的文件保存为文本文件。我建议使用 Chrome,因为 SVG 在其上保持固定大小,从而确保坐标系保持完全相同。<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Reader</title></head><body><h1>SVG paths to polygons</h1><input type="file" id="fileReader" /><br><p id="Content"></p><script>document.getElementById("fileReader").addEventListener('change',function(){var fr = new FileReader();fr.onload = function(){;var d = new DOMParser().parseFromString( this.result.toString(), "image/svg+xml" );var nodelist = d.querySelectorAll('path');console.log("Number of paths: " + nodelist.length);nodelist.forEach(function(path){//This replaces each path with a polygon, keeping the same id.var polygon = d.createElementNS("http://www.w3.org/2000/svg", "polygon");polygon.setAttribute("id", path.getAttribute("id"));console.log("Converting " + path.getAttribute("id"));var length = path.getTotalLength();var p=path.getPointAtLength(0);var stp=p.x+","+p.y;for(var i=1; i<length; i++){&nbsp; &nbsp; p=path.getPointAtLength(i);&nbsp; &nbsp; stp=stp+" "+p.x+","+p.y;&nbsp; &nbsp; //This places points along the path at one unit distance apart.}polygon.setAttribute("points", stp);path.replaceWith(polygon);});var text1 = new XMLSerializer().serializeToString(d);document.write(text1);function download(filename, text) {&nbsp; var element = document.createElement('a');&nbsp; element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));&nbsp; element.setAttribute('download', filename);&nbsp; element.style.display = 'none';&nbsp; document.body.appendChild(element);&nbsp; element.click();&nbsp; document.body.removeChild(element);}// Starting file download.download("output.txt", text1);}fr.readAsText(this.files[0]);})</script></body></html>然后您可以直接获取该points属性并将其放置在 KML 中的坐标标记中。您只需要用新行替换空格。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java