如何使用PHP / JavaScript解析/处理我的服务器上的KMZ文件?

时间:2014-01-07 12:43:11

标签: javascript php kml kmz

我一直在寻找,我能找到的所有答案都与使用谷歌地图有关。我想要做的是获取存储在里面的信息,将其“导入”我的数据库。

据我所知,KMZ文件是KML的zip文件(如xml)。

我想要处理的KMZ看起来像这样(在本地解压缩时):

包含以下信息的KML文件(doc.kml):

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
  <Document>
    <name>KmlFile</name>
    <Placemark>
      <description>
        <![CDATA[<div style='border: 1px solid #aaa; font-size: 20px;'><span style='padding: 1em; display: inline-block;'><img src='files/tags_1470231.jpg' /></span></div>
<div style='background-color: #aaa; color: white; text-align: right; padding: 0.5em 0.5em 0 0;'>Posted: 2013/12/26</div>]]>
        <![CDATA[<div style='border: 1px solid #aaa; font-size: 20px;'><span style='padding: 1em; display: inline-block;'>test
</span></div>
<div style='background-color: #aaa; color: white; text-align: right; padding: 0.5em 0.5em 0 0;'>Posted: 2013/12/26</div>]]>
        <![CDATA[<div style='border: 1px solid #aaa; font-size: 20px;'><span style='padding: 1em; display: inline-block;'>cool pic</span></div>
<div style='background-color: #aaa; color: white; text-align: right; padding: 0.5em 0.5em 0 0;'>Posted: 2013/12/26</div>]]>
      </description>
      <visibility>0</visibility>
      <Point>
        <coordinates>135.753498,35.024914,0</coordinates>
      </Point>
    </Placemark>
    <Placemark>
      <description>
        <![CDATA[<div style='border: 1px solid #aaa; font-size: 20px;'><span style='padding: 1em; display: inline-block;'><img src='files/tags_1470232.jpg' /></span></div>
<div style='background-color: #aaa; color: white; text-align: right; padding: 0.5em 0.5em 0 0;'>Posted: 2013/12/26</div>]]>
        <![CDATA[<div style='border: 1px solid #aaa; font-size: 20px;'><span style='padding: 1em; display: inline-block;'>panda
</span></div>
<div style='background-color: #aaa; color: white; text-align: right; padding: 0.5em 0.5em 0 0;'>Posted: 2013/12/26</div>]]>
      </description>
      <visibility>0</visibility>
      <Point>
        <coordinates>135.753482,35.024868,0</coordinates>
      </Point>
    </Placemark>
  </Document>
</kml>

一个名为“files”的文件夹,里面有图片。

理论上我想我必须在我的服务器中解压缩这个文件,阅读doc.kml文件,解析它以获取每个元素的坐标和图片名称,然后处理这些信息。

我遇到的问题是我不知道如何解压缩此文件并在我的服务器中为每个使用该网站的用户处理它。

我应该在服务器中使用临时位置吗?如果几个用户同时进行,文件是否会被覆盖?一旦它被解压缩,我如何参考每个图像?

我正在使用PHP网站,我计划显示每个图像的预览以及上传的KMZ文件的坐标。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

使用PHP解压缩zip文件:Unzip a file with php

至于确保用户不会相互上传,请考虑使用时间戳,使用tempnam()功能(http://us1.php.net/tempnam),为每个用户设置单独的文件夹,或使用一个自动增加的数据库列,用于跟踪上载。任何方法都可以正常工作,为每个上传提供一个唯一的文件名,以便它们不会重复。

希望这会指出你正确的方向。

答案 1 :(得分:1)

以下是将KMZ解压缩到KML的代码示例。 这在php中很容易完成。这是两个php示例:

<?php
$data = file_get_contents("http://example.com/some_file.kmz"); // url of the KMZ file
file_put_contents("/tmp/kmz_temp",$data);
ob_start();
passthru('unzip -p /tmp/kmz_temp');
$xml_data = ob_get_clean();
header("Content-type: text/xml");
echo $xml_data;
?> 

来自:http://dtbaker.net/web-development/how-to-convert-kmz-to-kml/ 这在PHP 5.5.9上运行良好,但我在PHP 5.4.35上发现了这个问题。 我用以下代码解决了这个问题:

<?php
$zip = new ZipArchive;
$res = $zip->open('some_file.kmz');
if ($res === TRUE) {
  $zip->extractTo('/DestinationFolder/');
  $zip->close();
  echo 'Success!';
} else {
  echo 'errors';
}
?>

我从这篇文章得到了这个:Unzip a file with php 从那里你可以完全像任何其他XML一样处理KML。

希望有所帮助!