在 PHP 中将 KML 转换为数组

Converting KML to Array in PHP

我在尝试使用 PHP 语言将 *.kml 文件转换为数组时卡住了。

kml 文件 >> path.kml

代码

    $dom = new \DOMDocument();
    $dom->loadXml($file);
    $xpath = new \DOMXPath($dom);
    $xpath->registerNamespace('kml', 'http://www.opengis.net/kml/2.2');

    $result = array();
    $places = $xpath->evaluate('//kml:Placemark', NULL, FALSE);
    foreach ($places as $place) {
        $coord = $xpath->evaluate('string(kml:LineString/kml:coordinates)',$place, FALSE);
        $i = explode("\n", $coord);
        $result = array(
            'name' => $xpath->evaluate('string(kml:name)', $place, FALSE),
            'coords' => explode("\n", $coord, count($i)
            )
        );
    }

    var_dump($result);

问题是当我尝试使用 newLine 分隔符分解字符串时,结果总是这样

而我想要这样的结果
谁能帮我解决我的问题?谢谢!

有不同的换行符,不仅仅是 \r\n - 尝试使用类似 preg_split ('/\R/', $string); 的东西来捕获所有换行符。

有关 \R 功能的更详细说明,请查看 this SO 答案。

'\r\n' (在单引号之间) 是:- 文字反斜杠、字母 r、文字反斜杠和字母 n。它不是回车符 return 和换行符。在单引号之间,不解释转义序列。

其他:您确定换行序列是 CRLF 吗?也可以只有 LF(很少只有 CR)。

无论如何,尝试使用 "\r\n" 如果它不适用于 "\n" (在双引号之间).

About PHP strings.

您可以 trim 坐标数组:

<?php

function itemTrim(&$item) {
    $item = trim($item);
}

$r = "
     115.09031667,-8.81930500,64.500
     115.09031500,-8.81925667,64.400
     115.09033000,-8.81920167,64.300
     115.09038167,-8.81911333,64.100
     115.09042333,-8.81904000,64.000
     115.09048000,-8.81896833,63.900
     115.09053333,-8.81889167,63.800
     115.09056167,-8.81882333,63.800
     115.09059500,-8.81876667,63.800
     115.09063500,-8.81872500,63.900
     115.09067333,-8.81870167,63.800
    ";

$a = preg_split("/\r\n|\n|\r/", $r);
$b = array_walk($a, "itemTrim");

var_dump($a);

但是关于行终止符的其他答案的考虑是正确的,我使用了来自 other SO question 的正则表达式。