3

我可以找到很多关于如何将 KML 多边形转换为 SVG 对象的文档,但没有做相反的事情。是否存在这样的脚本,或者有人知道如何编写脚本吗?

基本上,我想从 wikimedia commons 获取一些 GPL SVG 地图,例如this,它为每个国家/省制作单独的形状(可能包括其他地理覆盖),并将它们转换为 KML。我猜想带有 SVG 地图坐标系和原点纬度/经度的脚本可以进行这种转换,但这看起来是一项不平凡的任务,所以我希望已经完成了一些事情。

我在http://kml2svg.free.fr/找到了这些工具,但这只能转换由同一站点上的 KML->SVG 转换器生成的 SVG 文件。

我还认为我可能会反转在将 kml 多边形转换为 svg 路径上发布的 jsfiddle 示例,但我无法让该示例在本地 Web 项目中工作(我对 SVG/KML 开发和Javascript,并且不熟悉 Proj.4 库的工作原理)。

或者,如果有人能想到一种更好的方法来解决快速创建“政治地图”样式 KML 图层的原始问题,我愿意接受建议。

4

2 回答 2

3

只是在寻找相同的内容,我找到了您的帖子,所以这是我的谷歌列表中的另一个热门内容。

对于初始步骤,您可能需要查看此页面:

https://bitbucket.org/tbrugz/kmlutils/

祝你好运!

于 2013-01-17T22:20:27.757 回答
0

我找到了一种在 JavaScript 中将 SVG 路径转换为 ​​SVG 多边形的简单方法。SVG 多边形可以轻松转换为 KML 地标,因为两者都使用坐标列表。该脚本可以放置在 HTML 文件中,并且可以直接在浏览器上运行。它将从您的计算机中获取一个 SVG 文件并将修改后的文件保存为文本文件。我建议使用 Chrome,因为 SVG 在其上保持固定大小,从而确保坐标系保持完全相同。

<!DOCTYPE html>
<html lang="en">
<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 地标中的坐标标记中。您只需用新行替换空格。虽然这不是很有效,但它是进行转换的最简单方法。

于 2019-08-02T09:14:09.450 回答