【问题标题】:Parse KML file with PHP使用 PHP 解析 KML 文件
【发布时间】:2012-01-10 15:45:27
【问题描述】:

有没有办法用 simple_xml_load_file("*.kml") 解析谷歌地图 *.kml 文件?

我需要保存在我的 KML 文件中注册的每个多边形的数据库名称和坐标。 在我的 PHP 脚本中,simple_xml_load_file("*.kml") 返回 false,所以我无法阅读。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
    <Document>
        <Schema>
        ...
        </Schema>
        <Style id="FEATURES">
        ...
        </Style>
        <Folder>
            <Placemark>
                <name>
                    name
                </name>
                <Polygon>
                    <LinearRing>
                        <coordinates>
                            coordinates
                        </coordinates>
                    </LinearRing>
                </Polygon>
            </Placemark>
            <Placemark>
                ...
            </Placemark>
        </Folder>
    </Document>
</kml>

我需要每个“地标”的“名称”和“坐标”值。

【问题讨论】:

  • 你好新手,你应该从你的 .kml 中包含一些示例节点。预期结果..等等等等

标签: php parsing google-maps simplexml kml


【解决方案1】:

如果 XML 结构与您发布的一样,您可以尝试:-

$xml = simplexml_load_file(...);
$childs = $xml->Document->Folder->children();
foreach ($childs as $child)
{
    // child object is same as -> Placemark

}

示例:-

SimpleXMLElement 对象 ( [名称] => 姓名 [多边形] => SimpleXMLElement 对象 ( [LinearRing] => SimpleXMLElement 对象 ( [坐标] => 坐标 ) ) )

【讨论】:

  • 我尝试这样做,但 $xml = simplexml_load_file(...); 返回 false。所以,我无法得到 $xml->***。
  • 你遇到了什么错误?并且*.xml 是无效语法(您必须专门加载一个 XML 和一次)
  • "*.kml" 仅用于在此处不指定我的文件名。 simple_xml_load_file(my_file) 返回一个错误的布尔值,错误为“输入不是正确的 UTF-8,表示编码!字节:0xE8 0x72 0x65 0x73”
  • 我的 KML 文件中有 。也许是这个?
  • 不太可能,您是否安装了 tidy 模块?如果是这样,请看这里:- php.net/manual/en/book.tidy.php
【解决方案2】:

第一行:

<?xml version="1.0" encoding="UTF-8"?>

告诉 PHP 这是一个以 UTF-8 编码的文档,但您的错误是它没有被编码为 UTF-8。这是您使用文本编辑器创建的文档吗?如果是这样,您通常可以使用编辑器将其保存为 UTF-8。或者您可以使用 PHP 来检测编码并更改第一行。

【讨论】:

  • 好的,谢谢。我尝试上传的文件未以 UTF-8 格式保存。我刚刚将它重新保存在文本编辑器中,它工作正常!有没有办法强制对文件上传进行 UTF-8 编码?
  • 取决于您的文本编辑器,我会在设置中查找。或者,您可以编写一个脚本来读取输入文件并生成 UTF-8 编码的输出文件。 PHP 具有以下功能:php.net/manual/en/function.utf8-encode.php 或者您找出编码是什么并在 XML 标头中使用它而不是 UTF-8
  • 这就是我所做的。首先,我使用 $str = file_gets_content($file) 将文件转换为字符串,然后使用 simplexml_laod_string(utf8_encode($str)); 加载它。 ..它的作品:)!
【解决方案3】:
The xml structure is exactly that xml you sent:

For example:

<Document>
<Placemark>
      <name>356HH</name>
      <description>
</description>
      <Polygon><outerBoundaryIs><LinearRing><coordinates>some cordinates here</coordinates></LinearRing></innerBoundaryIs></Polygon>
  <Style><LineStyle><color>ff0000ff</color></LineStyle>  <PolyStyle><fill>0</fill></PolyStyle></Style>
  </Placemark>
  <Placemark>
</document>

这是我的 php 代码:

<?php

$completeurl = "2.xml";
$xml = simplexml_load_file($completeurl);

$placemarks = $xml->Document->Placemark;
$con=mysqli_connect("localhost","root","","j3");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

 $query = '';
 $run='';
for ($i = 0; $i < sizeof($placemarks); $i++) {
    $coordinates = $placemarks[$i]->name;
     $cor_d  =  explode(' ', $placemarks[$i]->Polygon->outerBoundaryIs->LinearRing->coordinates);
     $qtmp=array();
     foreach($cor_d as $value){
          $tmp = explode(',',$value);
          $ttmp=$tmp[1];
          $tmp[1]=$tmp[0];
          $tmp[0]=$ttmp; 
          $qtmp[]= '(' . $tmp[0] . ',' .$tmp[1].')';
     }

    $cor_d = json_encode($qtmp);
    $query .='\''.$coordinates.'\', \''.$cor_d.'\'';
    $run .="INSERT INTO jos_rpl_addon_zipinfo (name, boundary) VALUES (".$query." );";

    //echo $run;
    //break;
}
mysqli_query($con,$run);
//echo $run;

mysqli_close($con);
?>

【讨论】:

  • 非常感谢。它不完全相同,但它是否相似。你为我节省了很多时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2013-08-30
  • 1970-01-01
相关资源
最近更新 更多