2013-11-10 165 views
2

我正在使用KML文件来提取坐标并将它们插入到多维数组中。起初,我想只输出页面上的坐标 - 它似乎并不奏效PHP从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> 

回答

2

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

  • 你不关闭<description>标签正确
  • 的打开标签和关闭标签固定的错误后不匹配

,你的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> 

来到你的代码,你有FO llowing:

$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!

UPDATE

您发布的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); 
+0

谢谢你这么多的重播! ,但即使在“为每个”它只能给我一个协调...在我的XML我有很多动作......为什么是这样的?(我的意思是我有很多“地标”) – user2828251

+0

我找到了一个解决方案,导致我到以下问题:http://stackoverflow.com/questions/19889686/php-with-xml-extract-2-nodes-to-one -array – user2828251

+0

@ user2828251没有XPath为你工作?这正是你想要的。 –

1
$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

+0

如果有多个坐标,则失败。我假设OP正在尝试循环遍历坐标,然后获取它们中的每一个,并将它推入一个数组中。 –

+0

一个点上永远不会有多个坐标,AFAIK ... OP使用的字符串转换导致它是一个XML节点。如果OP声明他可以拥有多个坐标,那么我使用DOM + XPath,无论如何... :) –

+0

Amal ment,我有很多节点,我需要文件中的所有坐标以便稍后用于标记地图 – user2828251