2011-02-12 42 views
3

我正在項目中人們上傳GPX,我試圖將GPX文件轉換爲KML文件,因此他們可以選擇以這兩種格式下載。GPX到PHP中的KML

我發現了一個XSLT文件,它可能會將GPX轉換爲KML,但是當我嘗試在使用XSLTProcessor的PHP中進行轉換時,它給了我一些錯誤,指出找不到某些函數。我檢查了XSLT文件,那些功能在那裏。我對XSLT不是很熟悉,所以如果任何人都可以給我一些好的方向。

XSLT文件所在的位置:http://members.home.nl/cybarber/geomatters/FlitspaalGPX2KML.xslt

在GPX文件位於:http://geobetty.com/maps/download/8/archuletas-acres.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 :功能distCosineLaw未找到 未註冊的功能 xmlXPathCompiledEval:3個對象離開堆

除其他

+0

好問題,+1。請參閱我的答案以獲得解釋和三種可能的解決方案 – 2011-02-12 15:42:16

回答

2

XSLT轉換被寫入特別由MSXML運行,並使用由所述MSXML XSLT處理器只執行所述延伸元件<msxsl:script>上。

:或者:

  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 – 2011-02-12 16:30:29

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{ 

     } 
    }