GPX в KML в PHP - PullRequest
       73

GPX в KML в PHP

3 голосов
/ 12 февраля 2011

Я работаю в проекте, где люди загружают GPX, и я пытаюсь преобразовать файл GPX в файл KML, поэтому у них есть возможность загрузки в обоих форматах.

Я нашел файл XSLT, которыйпредположительно преобразует GPX в KML, но когда я пытаюсь выполнить преобразование в php с помощью XSLTProcessor, он выдает мне некоторые ошибки, говорящие о том, что некоторые функции не найдены.Я проверил файл 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 ]

2 голосов
/ 12 февраля 2011

Преобразование XSLT написано специально для запуска MSXML и использует элемент расширения <msxsl:script>, который реализован только процессором MSXML XSLT.

Решение : Либо:

  1. Запустите преобразование с помощью MSXML (версия 3, 4 или 6).

  2. Реализуйте функции расширения для использования с вашим процессором XSLT, если это возможно.

  3. Найдите раннюю реализацию XSLT 3.0 XSLT-процессора . XSLT 3.0 использует XPath 3.0 , а в XPath 3.0 основные тригонометрические и экспоненциальные функции были сделаны стандартных функций языка.

0 голосов
/ 25 мая 2015

Я написал этот код для преобразования GPX в KMl, но как установить стиль и многое другое.

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{

        }
    }
0 голосов
/ 19 января 2015
    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 голосов
/ 12 февраля 2011

Вы также можете попытаться использовать gpsbabel (внешняя программа) для преобразования. Таким образом, вы получите автоматическую поддержку для многих других форматов. Недостатком является то, что вам нужно установить внешнюю программу, которая может или не может быть в зависимости от вашего хостинга.

...