PHP中的GPX到KML

时间:2011-02-12 15:04:52

标签: php xml xslt kml gpx

我正在一个人们上传GPX的项目中工作,我正在尝试将GPX文件转换为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个对象

其中

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您也可以尝试使用gpsbabel(外部程序)进行转换。这样您就可以获得许多其他格式的自动支持。缺点是您需要安装一个外部程序,根据您的托管情况,可能会或可能不会。

答案 2 :(得分: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;
        } 
        ?>

答案 3 :(得分: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{

        }
    }