亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 252 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號