我正在一个人们上传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个对象
其中
答案 0 :(得分:2)
XSLT转换特别编写为由MSXML运行,并使用仅由MSXML XSLT处理器实现的扩展元素<msxsl:script>
。
解决方案:或者:
使用MSXML (第3版,第4版或第6版)运行转换。
实施扩展功能,以便与XSLT处理器一起使用(如果可能)。
查找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{
}
}