【问题标题】:PHP get coordinates from KML filePHP从KML文件中获取坐标
【发布时间】:2013-11-22 02:58:17
【问题描述】:

我正在使用 KML 文件来提取坐标并将它们插入到多维数组中。起初我试图只输出页面上的坐标 - 它似乎没有工作

这是我目前尝试过的代码:

<?php
$url = "myKML.kml";
$contents = file_get_contents($url);
$xml      = new SimpleXMLElement($contents);

$value    = (string)$xml->Document->Placemark->Point->coordinates;
$coords   = array();
foreach($value as $coord) {    
$args     = explode(",", $value);
$coords[] = array($args[0], $args[1], $args[2]);
}

print_r($coord);
?>

KML 结构如下:

<Document>
<name>...</name>
<open>1</open>
<Snippet maxLines='0'></Snippet>
<description>.../description>
<Style >
<BalloonStyle>
<text>
...
</text>
</BalloonStyle>
</Style>
<Placemark >
<name>...</name>
<styleUrl>...</styleUrl>
<Snippet maxLines='0'></Snippet>
<ExtendedData>
<Data name='__title'>
<value>...</value>
</Data>
<Data name='__imgUrl'>
<value>...</value>
</Data>
<Data name='__data'>
<value>...</value>
</Data>
</ExtendedData>
 <Point>
 <coordinates>14.8184806108,56.8630456924,196.0000000000</coordinates>
 </Point>
 </Placemark>

【问题讨论】:

    标签: php xml arrays coordinates kml


    【解决方案1】:

    您尝试解析的 XML 无效,您需要先修复它,然后才能解析它。这些是我看到的问题:

    • 您没有正确关闭 &lt;description&gt; 标记
    • 开始标签和结束标签不匹配

    修正错误后,您的 XML 结构应如下所示:

    <Document>
    <name>...</name>
    <open>1</open>
    <Snippet maxLines='0'></Snippet>
    <description>...</description>
    <Style >
        <BalloonStyle>
            <text>
                ...
            </text>
        </BalloonStyle>
    </Style>
    <Placemark >
        <name>...</name>
        <styleUrl>...</styleUrl>
        <Snippet maxLines='0'></Snippet>
        <ExtendedData>
            <Data name='__title'>
                <value>...</value>
            </Data>
            <Data name='__imgUrl'>
                <value>...</value>
            </Data>
            <Data name='__data'>
                <value>...</value>
            </Data>
        </ExtendedData>
        <Point>
            <coordinates>14.8184806108,56.8630456924,196.0000000000</coordinates>
        </Point>
    </Placemark>
    </Document>
    

    来到您的代码,您有以下内容:

    $value    = (string)$xml->Document->Placemark->Point->coordinates;
    

    您将$value 转换为字符串,因此foreach 循环不起作用。 foreach 需要一个数组作为它的参数,但您将传递一个字符串。

    更正后的代码应如下所示:

    $value = (array) $xml->Placemark->Point->coordinates;
    
    $coords   = array();
    foreach($value as $coord) {    
        $args     = explode(",", $coord);
        $coords[] = array($args[0], $args[1], $args[2]);
    }
    

    输出:

    Array
    (
        [0] => Array
            (
                [0] => 14.8184806108
                [1] => 56.8630456924
                [2] => 196.0000000000
            )
    
    )
    

    Demo!

    上面的代码将尝试将所有坐标放入$coords 数组中。如果只想获取一个坐标,可以将其转换为字符串,然后执行以下操作:

    $value = (string) $xml->Placemark->Point->coordinates;
    list($coord1, $coord2, $coord3) = explode(',', $value);
    $coords = array($coord1, $coord2, $coord3);
    print_r($coords);
    

    这将生成以下数组:

    Array
    (
        [0] => 14.8184806108
        [1] => 56.8630456924
        [2] => 196.0000000000
    )
    

    Demo!

    更新

    您发布的 KML 文件的结构有些不同。下面的代码应该可以工作:

    foreach ($xml->Document->Placemark as $coord) {
        $coord = (string) $coord->Point->coordinates."<br/>";
        $args     = explode(",", $coord);
        $coords[] = array($args[0], $args[1], $args[2]);
    }
    print_r($coords);
    

    【讨论】:

    • 非常感谢您的重播! ,但即使在“每个”上,它也只给我一个坐标……在我的 XML 中,我有很多动作……为什么会这样? (我的意思是我有很多“地标”)
    • 我找到了一个解决方案,导致我提出以下问题:stackoverflow.com/questions/19889686/…
    • @user2828251 XPath 不适合您吗?这正是您正在寻找的。​​span>
    【解决方案2】:
    $kml = new SimpleXMLElement(file_get_contents('myKML.kml'));
    
    foreach ($kml->xpath('//Placemark/Point/coordinates') as $kml_coordinates) {
        // for legibility...
        sscanf((string) $kml_coordinates, '%f,%f,%f', $latitude, $longitude, $altitude);
        $coords[] = array($latitude, $longitude, $altitude);
        // for simplicity...
        $coords[] = explode(',', (string) $kml_coordinates);
    }
    

    演示:https://eval.in/65272

    【讨论】:

    • 如果有多个坐标,此操作将失败。我假设 OP 试图遍历坐标,然后获取每个坐标并将其推入数组中。
    • 一个点上永远不会有多个坐标,AFAIK... OP 使用字符串转换,因为它是一个 XML 节点。如果 OP 声明他可以有多个坐标,我会使用 DOM+XPath,无论如何... :)
    • 我有很多节点,我需要文件中的所有坐标以供以后用于地图上的标记
    • 嗯,但您访问节点不正确。 -&gt;Document 会抛出警告说Trying to get property of non-object
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多