为了账号安全,请及时绑定邮箱和手机立即绑定

KML 多边形的 SVG 路径

KML 多边形的 SVG 路径

幕布斯7119047 2023-05-10 13:37:28
我想用 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.2c0.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 创建的,现在我无法访问该软件。由于没有空格或常规逗号,我无法理解如何正确读取字符串。
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

我找到了一种在 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++){

    p=path.getPointAtLength(i);

    stp=stp+" "+p.x+","+p.y;

    //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) {

  var element = document.createElement('a');

  element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));

  element.setAttribute('download', filename);


  element.style.display = 'none';

  document.body.appendChild(element);


  element.click();


  document.body.removeChild(element);

}


// Starting file download.

download("output.txt", text1);

}

fr.readAsText(this.files[0]);

})

</script>

</body>

</html>


然后您可以直接获取该points属性并将其放置在 KML 中的坐标标记中。您只需要用新行替换空格。


查看完整回答
反对 回复 2023-05-10
  • 1 回答
  • 0 关注
  • 192 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信