2011-02-12 2 views
3

사람들이 GPX를 업로드하고 GPX 파일을 KML 파일로 변환하려고하는 프로젝트에서 작업 중이므로 두 형식으로 다운로드 할 수 있습니다.GPX to PHP

GPX를 KML로 변환하는 XSLT 파일을 찾았지만 XSLTProcessor를 사용하여 PHP에서 변환하려고하면 일부 기능을 찾을 수 없다는 오류가 발생합니다. 나는 XSLT 파일을 검사했다. 나는 XSLT에 익숙하지 않아서 누군가가 내게 커다란 방향을 줄 수 있다면.

XSLT 파일은 다음 위치에 있습니다 http://members.home.nl/cybarber/geomatters/FlitspaalGPX2KML.xslt

GPX 파일은 다음 위치에 있습니다

<?php 
$gpx = new DOMDocument(); 
$gpx->loadXML($ride); 

$xslsheet = new DOMDocument(); 
$xslsheet->load(DOCROOT . '/lib/gpx-to-kml.xslt'); 

$xsl = new XSLTProcessor(); 
$xsl->importStyleSheet($xslsheet); 

$kml = $xsl->transformToXML($gpx); ?> 

이 내 오류입니다 :

xmlXPathCompOpEval 여기

http://geobetty.com/maps/download/8/archuletas-acres.gpx 코드입니다 : 함수 distCosineLaw를 찾을 수 없음 등록되지 않은 함수 xmlXPathCompiledEval 3 개체가 다른 XSLT 변환 특히 MSXML 의해 실행되도록 기록 및 MSXML XSLT 프로세서 만 구현되는 확장 요소 <msxsl:script> 사용된다

+0

좋은 질문, +1. 설명과 세 가지 가능한 해결책에 대한 내 대답을 참조하십시오. –

답변

2

중에서 스택

왼쪽.

해결 : 어느 :

  1. 가 MSXML으로 변환을 실행 (버전 3, 4 또는 6.).

  2. XSLT 프로세서에서 사용할 수있는 확장 기능을 구현하십시오 (가능한 경우).

  3. XSLT 3.0 XSLT 프로세서의 초기 구현을 찾아보십시오. XSLT 3.0은 XPath 3.0을 사용하고 XPath 3.0에서는 주 삼각 함수 및 지수 함수가 standard functions으로되어 있습니다.

+0

PHP가 확장 함수를 처리하는 방법은 http://www.php.net/manual/en/xsltprocessor.registerphpfunctions.php를 참조하십시오. –

+0

+1 정답입니다. –

+0

전체 답변은 +1입니다. – Flack

0

gpsbabel (외부 프로그램)을 사용하여 변환을 시도 할 수도 있습니다. 이 방법을 사용하면 다른 많은 형식에 대해서도 자동으로 지원됩니다. 단점은 호스팅에 따라 가능하지 않을 수도있는 외부 프로그램을 설치해야한다는 것입니다.

0
Please use your gpx file name in program or path of gpx file  

    <?php 
     $name_file="ff72be886cde0672af512bb2c383d422.gpx"; 
     $point=explode(".",$name_file); 
     $namekml=$point[0].'.kml'; 

     $xml = simplexml_load_file($name_file);$i=0; 
     $arry=array(); 
     foreach($xml->trk->trkseg->trkpt as $trkpt) { 

     $arry[$i++]=xml2array ($trkpt, $out = array()); 

     } 

     generatekml($arry,true,$namekml); 

     function generatekml($input,$file,$filename){ 
     $output="<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
     <kml xmlns=\"http://www.opengis.net/kml/2.2\"> 
      <Document> 
     "; 
      $i=1; 
foreach($input as $key=>$point){ 

$name="point ".$i++; 
$description=$point['ele']; 
$lat=$point['@attributes']['lat']; 
$lon=$point['@attributes']['lon']; 
$coordinates=$lat .",".$lon; 

$output.="<Placemark> 
     <name>$name</name> 
     <description>$description</description> 
     <Point>   
     <coordinates>$coordinates</coordinates> 
     </Point> 
    </Placemark> 
"; 
}   

$output.="</Document> 
     </kml> 
     "; 
     if($file){ 

      header("Content-type: octet/stream"); 
      header("Content-disposition: attachment; filename=".$filename.";"); 
      // header("Content-lenght: ".filesize("files/".$file)); 
      print $output; 


     }else print $output; 
     } 




     function xml2array ($xmlObject, $out = array()) 
     { 
      foreach ((array) $xmlObject as $index => $node) 
       $out[$index] = (is_object ($node)) ? xml2array ($node) : $node; 

      return $out; 
     } 
     ?> 
0

GPX를 KMl로 변환하지만 스타일 및 더 많은 DOM을 설정하는 방법은이 코드를 작성했습니다.

function gpxtokml($path,$id){ 

    $name_file=$path; 
    $point=explode(".",$name_file); 
    $namekml=$point[0].'.kml'; 

    $xml = simplexml_load_file($name_file);$i=0; 
    $arry=array(); 
    foreach($xml->trk->trkseg->trkpt as $trkpt) { 

    //$arry[$i++]=$this->xml2array ($trkpt,$out = array()); 
     foreach ((array) $trkpt as $index => $node){ 
     //$out[$index] = (is_object ($node)); 
     if(is_object ($node)){ 
     foreach ((array) $trkpt as $index => $node) 
     $out[$index] = $node ; 
     continue; 
     }else{ 
     $out[$index] = $node ; 
     } 
     } 
     $arry[$i++]=$out; 
    } 
    //print_r($arry);exit; 
    $retrn=$this->generatekml($arry,true,$namekml,$id); 
    return $retrn; 
    } 

    function xml2array ($xmlObject, $out = array()) 
    { 
    foreach ((array) $xmlObject as $index => $node) 
    $out[$index] = (is_object ($node)) ? xml2array ($node) : $node; 

    return $out; 
    } 
    function generatekml($input,$file,$filename,$id){ 
     $output="<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
     <kml xmlns=\"http://www.opengis.net/kml/2.2\"> 
     <Document> 
     "; 
     $i=1; 
     //echo '<pre>';print_r($input);exit; 
     foreach($input as $key=>$point){ 

     $name="point ".$i++; 
     $description=''; 
     $lat=$point['@attributes']['lat']; 
     $lon=$point['@attributes']['lon']; 
     $coordinates=$lat .",".$lon; 

     $output.="<Placemark> 
     <name>$name</name> 
     <description>$description</description> 
     <Point>   
     <coordinates>$coordinates</coordinates> 
     </Point> 
     </Placemark> 
     "; 
     }   

     $output.="</Document> 
     </kml> 
     "; 
     if($file){ 

     //header("Content-type: octet/stream"); 
     //header("Content-disposition: attachment; filename=".$filename.";"); 
     // header("Content-lenght: ".filesize("files/".$file)); 
     //echo $output; 
     $fl=time().'kml.kml'; 
     $xmlfile=WWW_ROOT.'kmlfile/'.$fl; 
     //echo $this->EventDetail->id=$id; 
     //exit; 
     //$date['EventDetail']['kmlfile']=time().'kml.kml'; 
     //$this->EventDetail->save($date['EventDetail'],false); 
     $fp = fopen($xmlfile, 'w'); 
     fwrite($fp, $output); 

     fclose($fp); 
     //echo time().'kml.kml'; 
     return $fl; 
     }else{ 

     } 
    }