2013-11-10 7 views
2

KML 파일을 사용하여 좌표를 추출하고 다차원 배열에 삽입하고 있습니다. Heres는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 배열에 모든 좌표를 얻을 것이다.

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

Demo!

UPDATE :

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

이 다음과 같은 배열을 생성합니다 : 당신은 하나의 좌표를 얻고 싶은 경우에, 당신은 문자열로 캐스팅 할 수 있습니다 다음, 다음을 수행

게시 한 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은 내가 많은 노드를 가지고 있고 나중에 마커를 사용하기 위해 파일에서 모든 좌표를 필요로한다. map – user2828251

관련 문제