PHP로 지리좌표계 변환하기

발자들이 지리좌표계 내지는 지리정보를 다뤄야 할 일이 점점 많아지고 있습니다. 특히 모바일처럼 위치 정보를 손쉽게 얻을 수 있는 장비가 널리 보급이 되면서 웬만한 앱은 대부분 위치(지리좌표)를 활용하고 있는 상황입니다.

불행하게도 지리좌표는 여러 종류이고 시스템마다 서로 다른 경우가 많습니다. 이런 경우 알맞는 지리 좌표로 변환을 해줘야 하는데 지리학을 전공하지 않은 개발자로서는 쉽지 않은 일입니다. 그런 이유로 이런 일을 대신 해줄 라이브러리를 찾게 되는데, 제가 찾은 것은 PROJ.4 입니다.

PHP에서 사용 할 수 있는 유사한 proj4php도 있지만, 업데이트 속도나 신뢰성 부분에서 PROJ.4 보다 떨어지는 느낌입니다. 하지만 PROJ.4는 PHP 바인드가 없습니다. 하지만 다행히 MapServer 프로젝트에서 PROJ.4를 이용한 PHP 바인드를 제공합니다.

여기서는 MapServer를 이용해서 PROJ.4를 PHP에서 사용하는 방법을 CentOS 5를 기준으로 설명 하겠습니다. 다른 배포판이나 OS에서는 공식 사이트의 문서를 참고하여 적절히 옵션을 변경하시기 바랍니다.

우선 PROJ.4를 설치 합니다.

1
2
3
4
5
6
$ wget http://download.osgeo.org/proj/proj-4.8.0.tar.gz
$ tar -xvzf proj-4.8.0.tar.gz
$ cd proj-4.8.0
$ ./configure --prefix=/usr/local/proj-4.8.0
$ make
$ sudo make install

make 할 때 -j 옵션을 사용하니 컴파일 오류가 생겼습니다.

이제 MapServer를 설치 할 차례입니다.

1
2
3
4
5
6
7
8
$ wget http://download.osgeo.org/mapserver/mapserver-6.0.3.tar.gz
$ tar -xvzf mapserver-6.0.3.tar.gz
$ cd mapserver-6.0.3
$ ./configure --with-proj=/usr/local/proj-4.8.0 --with-php=/usr/include/php
$ make
$ cd mapscript/php
$ cp php_mapscript.so /usr/lib64/php/modules/
$ vi /etc/php.d/php_mapscript.ini
1
2
$ cat /etc/php.d/php_mapscript.ini
extension=php_mapscript.so

만약 PHP 5.2 미만을 사용하신다면 MapServer 5.6 버전을 받으시면 됩니다.

1
2
3
4
$ wget http://download.osgeo.org/mapserver/mapserver-5.6.8.tar.gz
$ tar -xvzf mapserver-5.6.8.tar.gz
$ cd mapserver-5.6.8

PHP 모듈에 MapScript가 설치된 것을 확인합니다.

1
2
$ php -m | grep MapScript
MapScript

이제 지리좌표를 변환 해 보도록 하겠습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
$projInObj = ms_newprojectionobj("proj=latlong,datum=WGS84,ellps=WGS84");
$projOutObj = ms_newprojectionobj("proj=tmerc,lat_0=38N,lon_0=127.5E,ellps=WGS84,x_0=1000000,y_0=2000000,k=0.9996");
$poPoint = ms_newpointobj();

$poPoint->setXY(127.034612, 37.509385);
$poPoint->project($projInObj, $projOutObj);

print("{$poPoint->x}, {$poPoint->y}\n");
?>
1
2
$ php projection.php 
958869.35109589, 1945669.2316348

WGS84 경위도 좌표계의 값이 UTM-K 좌표계 값으로 잘 바뀌는 것을 확인 할 수 있습니다. 각 지리좌표계별 Proj.4 인자값은 주요 좌표계 EPSG코드 및 proj4 인자 정리를 참고 하시기 바랍니다.

지리좌표계에 대해서 개발자로서 기본적인 내용을 빠르게 이해하고 싶으시다면 KTH 개발자 블로그에 올라온 LBS 개발을 위한 지도의 타원체 및 투영법 기초 가이드가 도움이 되실 겁니다.

보다 자세한 사용법은 PHP MapScript 설명서를 참고 하시면 됩니다.

updatedupdated2021-01-042021-01-04