【问题标题】:Convert SVG paths to KML placemarks?将 SVG 路径转换为 ​​KML 地标?
【发布时间】:2013-01-08 22:08:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 第一句话:你的意思是你找到很多关于如何将 KML 多边形转换为 SVG 的文档?还是问题标题倒退了?
  • 糟糕——第一句话是错字:问题标题是正确的。我现在已经修正了错字,感谢您发现它。

标签: javascript svg kml


【解决方案1】:

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

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

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

祝你好运!

【讨论】:

    【解决方案2】:

    我找到了一种在 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 地标中的坐标标记中。您只需用新行替换空格。虽然这不是很有效,但它是进行转换的最简单方法。

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多