首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用几层kmz文件更新Google

用几层kmz文件更新Google
EN

Stack Overflow用户
提问于 2014-08-22 01:31:37
回答 1查看 1.4K关注 0票数 2

明年九月我将骑自行车在三个月内旅行。我将使用iPhone与移动-X全球定位系统应用程序安装,以记录每天的跟踪。这次旅行的目的是吸引公众的注意,因此,我正在建立一个网站,在这里,我打算上传每天骑自行车散落在谷歌地图上。我不能花太多时间处理文件或执行手动任务。任何事情都需要由一个事件触发。每天都是。到目前一切尚好。

移动X全球定位系统记录全球定位系统的跟踪,并允许通过电子邮件共享它们。通过电子邮件发送的文件是一个gpx文件和一个kmz文件作为附件在一个电子邮件的正文中。那是我的扳机。

在我的网站上,我成功地加载了一个Google (带有Google Api),并绘制了路径点和KmlLayers。我还运行了一个Google脚本,它可以自动下载带有kmz或gpx扩展的电子邮件附件,并将它们保存在Google文件夹中。我还可以通过另一个脚本检索这些文件的permalinks。我想我甚至可以想出每次将一个新的KMZ文件添加到文件夹中时,如何在站点上的javascript代码中添加一个新的层,但我还没有走那么远。

噩梦就从这里开始。

第一步。我能够用KmlLayer在地图上绘制一个KMZ文件。这没问题。但是Google的层数限制在15-20层左右,行程将持续100天左右,每天增加一个新的图层。这意味着,当达到极限时,地图上可能会出现多层停电。由于许多人将访问该网站,我不希望这种情况发生。

第二个选择是有一个脚本,该脚本:

  1. 解开KMZ。
  2. 将解压缩的KML保存在另一个文件夹中。
  3. 将所有的KML合并在一个KML中。

我无法克服第一步。我试图用脚本解压缩驱动器上的KMZ文件,但我无法。这是我在测试时使用的代码:

代码语言:javascript
复制
function unZip() {

 var kmzs = DriveApp.getFilesByType('application/vnd.google-earth.kmz');
 while (kmzs.hasNext()){
  var kmz = kmzs.next();
  var zipBlob = kmz.getBlob();
  var unzipBlob = Utilities.unzip(zipBlob);
  var unzipBlobName = unzipBlob[1].getName();

  Logger.log(unzipBlobName);
 }
}

这会在"unzipBlob“上引发一个错误。此路径在此结束,除非我找到解压缩和合并文件的选项。

我也尝试过kmz提取器,但是它不承认kmz文件是不可压缩的。我甚至将.kmz文件重命名为.zip,没有成功。

https://github.com/googledrive/zipextractor

第三个选项是绘制gpx文件。在谷歌搜索了几个小时之后,我找到了这个链接来在Google上绘制一个gpx文件:

http://www.jacquet80.eu/blog/post/2011/02/Display-GPX-tracks-using-Google-Maps-API

这是代码片段:

代码语言:javascript
复制
 $.ajax({
    type: "GET",
    url: "URL to the GPX file",
    dataType: "xml",
    success: function(xml) {
    var points = [];
    var bounds = new google.maps.LatLngBounds ();
    $(xml).find("trkpt").each(function() {
      var lat = $(this).attr("lat");
      var lon = $(this).attr("lon");
      var p = new google.maps.LatLng(lat, lon);
      points.push(p);
      bounds.extend(p);
    });

    var poly = new google.maps.Polyline({
      // use your own style here
      path: points,
      strokeColor: "#FF00AA",
      strokeOpacity: .7,
      strokeWeight: 4
    });

    poly.setMap(map);

    // fit bounds to track
    map.fitBounds(bounds);
   }
   });

但是,我一直无法用该代码绘制我的任何Google文件。出现一个灰色块而不是地图,或者如果我试图同时绘制其他层,其他层将是可见的,但gpx层不会。我想这与相同的起源策略有关,因为我所指向的URL是Google,而我的URL是Squarespace。

在这一点上,在三个不同的解决方案上达到了一个死胡同,经过了许多小时的搜索和尝试,我再也看不见了。我非常感谢在这个问题上提供任何帮助。从明年9月开始,我的行程安排得很紧。9.同样,任何暗示、建议或评论都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2014-08-22 17:53:50

我找到了解决办法。

我已经依赖了几个消息来源,并以某种方式碰到了嵌套KMZ文件

这给了我一个线索。我尝试使用不同的文件和选项,但结果如下:

  1. 我使用这个剧本自动上传.kmz文件从MotionX到一个文件夹在谷歌驱动器。
  2. 我在同一个文件夹中有一个file.kml文件,它的嵌套结构指向带有NetworkLink的.kmz文件。
  3. 我有一个Chrome应用程序,它在云中运行一个脚本来同步Dropbox和Google。由于某些原因,驱动器中的file.kml的permalink没有工作,但是Dropbox的公用文件夹中的permalink却很好。中的kmlLayer链接到dropbox中的file.kml。
  4. 最后,我每小时运行一个独立的Google,它将file.kml的内容替换为一个kml结构,该结构基于我的驱动器文件夹中的任何.kmz。我可以删除、添加或修改名称,但是,只要kmz文件在我的跟踪文件夹中,它们就会嵌套在file.kml中。

就是这样。这是我的脚本代码。用您的数据替换上箱。也许有一种更简单或更聪明的方法来做这件事,但这就是完成的工作。

代码语言:javascript
复制
//This function reads kmz files inside an specific folder in Google Drive and fills "file.kml" with a list of Networklinks for those files. The links refer to a mirror in a synced dropbox public folder
function kmlFileSetContent(){
    var contentHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><kml xmlns=\"http://www.opengis.net/kml/2.2\"><Document>"
    var contentFooter ="</Document></kml>";
    var fileHeader = "<NetworkLink> <Link><href>YOUR_DROPBOX_PERMALINK_FOR_PUBLIC_FOLDER";
    var fileFooter = "</href></Link></NetworkLink>"
    var kmzFolder = DriveApp.getFolderById("YOUR_FOLDER_ID");
    var kmzFiles = kmzFolder.getFilesByType('application/vnd.google-earth.kmz');
    while(kmzFiles.hasNext()){
        var kmzFile = kmzFiles.next();
        var fileName = kmzFile.getName();
        var networkLink = fileHeader+fileName+fileFooter;
        var networkLinkAll = networkLinkAll+ networkLink;
    }
    var newContent = contentHeader+networkLinkAll+contentFooter;
    Logger.log(newContent);
    var kmlFile = DriveApp.getFileById("YOUR_FILEKML_ID");
    kmlFile.setContent(newContent);

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25438355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档