반응형

하기 내용은 Linux를 기준으로 설명한다. 윈도우 환경하에서도 약간의 수정으로 충분히 활용 가능하다.

1. http://www.gpsbabel.org에서 gpsbabel-1.3.3.tar.gz 를 다운로드하고 폴더에 푼다.
2. 1의 폴더에 가서 ./configure;make;make install 로 build한다.
    - 2의 과정을 거치면 기본적으로 /usr/local/bin에 해당 프로그램이 설치된다.

이 과정을 거치면 Web server에서 사용할수 있는 변환 library를 만든다.
변환 라이브러리의 요구 사항은 다음과 같다.

1. PHP에서 include해서 사용하기 편하게 만들기 위해서 GPSDataProcess라는 클래스를 만듬
2. 입력 파일로 Sony CS-1의 GPS 파일 위치를, 출력 파일로 GPX(구글맵용) 파일을 지정하고 변환 메소드 호출
3. 돌리면 X,Y그리고 각각의 시간에 대한 배열을 얻을수 있는 메소드 구현

이에 따라 다음과 같이 GPSDataProcess를 구현하였다.
사용법은 다음과 같다
<?
include "convertLib.php";
$converLib=new GPSDataProcess;
$converLib->convertNMEAtoGPX("소니파일(입력)","gpx파일이름(출력)");
$posX=$converLib->getPosX();  <----X좌표 배열값
$posY=$converLib->getPosY();  <----Y좌표 배열값
$time=$converLib->getTime();     <----시간 배열값
print "Size:".sizeof($posX);
for($index=0;$index<sizeof($posX);$index++)
{
        print "Time:".$time[$index]." X:".$posX[$index]." Y:".$posY[$index]."\n";
}
?>

GPSDataProcess의 소스는 다음과 같다
<?
// Library for converting Sony CS-1 GPS Format to Google GPX Format
// Author: Lee Wonseok
// Liscense: GPL
 
class GPSDataProcess{
        var $posAndTime=array();
        var $indexCount=0;
        var $timeData=array();
        var $positionX=array();
        var $positionY=array();
        var $time=array();
        function convertNMEAtoGPX($inFile,$outFile)
        {
                $command="/usr/local/bin/gpsbabel -i NMEA -o gpx ".$inFile." ".$outFile;
                $executeCmd=`$command`;
                $domdoc=new DOMDocument();
                $domdoc->load($outFile);
                $aData=array();
                $this->dom_to_simple_array($domdoc,$aData);
                for($index=0;$index<sizeof($this->posAndTime);){
                        $this->positionX[$indexNew]=$this->posAndTime[$index++];
                        $this->positionY[$indexNew]=$this->posAndTime[$index++];
                        $this->time[$indexNew]=$this->posAndTime[$index++];
                        $indexNew++;
                }
        }
        function getPosX()
        {
                return $this->positionX;
        }
        function getPosY()
        {
                return $this->positionY;
        }
        function getTime()
        {
                return $this->time;
        }
        function dom_to_simple_array($domnode, &$array) {
                $array_ptr = array();
                $array_save_ptr= &$array;
                $domnode = $domnode->firstChild;
                while (!is_null($domnode)) {
                        if (! (trim($domnode->nodeValue) == "") ) {
                                switch ($domnode->nodeType) {
                                        case XML_TEXT_NODE: {
                                                $array_ptr['cdata'] = $domnode->nodeValue;
                                                break;
                                        }
                                        case XML_ELEMENT_NODE: {
                                                $array_ptr = &$array[$domnode->nodeName][];
                                                if($domnode->nodeName=='time'){
                                                        $this->posAndTime[$this->indexCount++]=$domnode->nodeValue;
                                                }
                                                if ($domnode->hasAttributes() ) {
                                                        $attributesLat = $domnode->getAttribute("lat");
                                                        $this->posAndTime[$this->indexCount++]=$attributesLat;
                                                        $attributesLon = $domnode->getAttribute("lon");
                                                        $this->posAndTime[$this->indexCount++]=$attributesLon;
                                                        if (!is_array ($attributes)) {
                                                                break;
                                                        }
                                                        foreach ($attributes as $index => $domobj) {
                                                                $array_ptr[$index] = $array_ptr[$domobj->name] = $domobj->value;
                                                        }
                                                }
                                                break;
                                        }
                                }
                                if ( $domnode->hasChildNodes() ) {
                                        $this->dom_to_simple_array($domnode, $array_ptr);
                                }
                        }
                        $domnode = $domnode->nextSibling;
                }
        }
}
?>

반응형
Posted by alias
,