在 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"
(在双引号之间).
您可以 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 的正则表达式。
我在尝试使用 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"
(在双引号之间).
您可以 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 的正则表达式。