CentOS 에서 MapServer 설치 및 테스트
CentOS 7 에서 MapServer 설치 및 테스트
작성 일자: 2019년 11월 8일
수정 일자: 2019년 12월 11일
작성자: N3
0. 레퍼런스
- MapServer (https://mapserver.org/)
- MapServer Tutorial (https://www.mapserver.org/tutorial/)
- MapServer Test Suite (https://github.com/mapserver/mapserver/wiki/Test-Suite)
- MapServer - Nasa Blue Marble Data Server (https://gist.github.com/emxsys/f8c7a8dd5cf0060387ce50aa3f186bac)
- MapServer Quick Start (https://live.osgeo.org/en/quickstart/mapserver_quickstart.html)
- OSGeo MapServer Starting (http://2007.foss4g.org/workshops/W-09/)
- MapServer OGC Web Services Workshop (http://mapserver.github.io/ms-ogc-workshop/)
1. MapServer 개요
MapServer 는 이름에서 유추해볼 수 있듯이, 지도 즉, 공간데이터를 웹에 올려 서버로 운영할 수 있도록 하는 도구다. MapServer 는 MIT 라이센스로 배포하고 있다.
지리 데이터, HTML 페이지, 맵 파일, 웹 서버, MapServer CGI 또는 MapScript 로 MapServer 애플리케이션을 구성한다.
2. MapServer 빌드 옵션
MapServer 를 빌드하기 위해서 사용하는 CMake 에서 다음과 같은 옵션들을 처리할 수 있다.
옵션 이름 |
옵션 내용 |
기본값 |
WITH__PROJ |
재투영(reprojection) 지원 |
ON |
WITH_PROTOBUFC |
벡터 타일 생성을 위한 Google Protocol Buffer (Protobuf) 를 지원 |
OFF |
WITH_KML |
KML 지원 ( libkml2 사용) |
OFF |
WITH_WMS |
WMS 서버 지원 (WITH_PROJ=ON) |
ON |
WITH_SOS |
SOS(Sensor Web 그룹의 Sensor Observation Service) 서버 (WITH_PROJ=ON WITH_KML=ON) |
OFF |
WITH_FRIBIDI |
FriBidi glyph shape 지원 (오른쪽에서 왼쪽으로 쓰는 문자 체계) WITH_HARFBUZZ=ON |
ON |
WITH_HARFBUZZ |
Harfbuzz 복합문자 레이아웃 (아랍 및 힌두어 지원) WITH_FRIBIDI=ON |
ON |
WITH_ICONV |
Iconv 국제화 지원 |
ON |
WITH_CAIRO | cairo 렌더링 지원 (SVG 및 PDF 출력) | ON |
WITH_SVGCAIRO | SVG 심볼 지원 (cairo, libsvg, libsvg-cairo) | OFF |
WITH_RSVG | SVG 심볼 지원 (librsvg) | OFF |
WITH_MYSQL | MySQL 지원 | OFF |
WITH_FCGI | FastCGI 지원 | ON |
WITH_GEOS | Geos 지오메트리 연산 지원 | ON |
WITH_POSTGIS | Postgis 입력 지원 | ON |
WITH_GDAL | GDAL 래스터 입력 지원 | ON |
WITH_OGR | OGR/GDAL 벡터 입력 지원 | ON |
WITH_CLIENT_WMS | 클라이언트 WMS 레이어 지원 | OFF |
WITH_CLIENT_WFS | 클라이언트 WFS 레이어 지원 | OFF |
WIH_CURL | Curl HTTP 지원 ( 클라이언트 wms/wfs 및 원격 SLD) | OFF |
WITH_WFS | WFS 서버 지원 | ON |
WITH_WCS | WCS 서버 지원 | ON |
WITH_LIBXML2 | libxml2 지원 (sos, wcs, wfs 에 사용) | ON |
WITH_THREAD_SAFETY | libmapserver 의 thread-safe 버전 | OFF |
WITH_GIF | GIF 지원 | ON |
WITH_PYTHON | Python mapscript 지원 | OFF |
WITH_PHP | PHP mapscript 지원 | OFF |
WITH_PERL | Perl mapscript 지원 | OFF |
WITH_RUBY | Ruby mapscript 지원 | OFF |
WITH_JAVA | Java mapscript 지원 | OFF |
WITH_CSHARP | C# mapscript 지원 | OFF |
WITH_POINT_Z_M | Point 구조체로 Z 와 M 좌표 포함 (고급기능, 비추천) | OFF |
WITH_ORACLESPATIAL | Oracle Spatial 데이터베이스 지원 | OFF |
WITH_ORACLE_PLUGIN | Oracle Spatial 데이터베이스를 플러그인으로 지원 | OFF |
WITH_MSSQL2008 | MSSQL 2008 데이터베이스 지원 | OFF |
WITH_EXEMPI | xmp 메터데이터 출력 지원 | OFF |
WITH_XMLMAPFILE | xml mapfile 지원 (libxslt/libexslt) | OFF |
WITH_V8 | 자바스크립트 V8 지원 | OFF |
WITH_PIXMAN | 레이어 작성을 위한 pixman 지원 | OFF |
WITH_APACHE_MODULE | 아파치 모듈 지원 | OFF |
WITH_GENERIC_NINT | 범용 반올림 | OFF |
LINK_STATIC_LIBMAPSERVER | libmapserver 를 정적으로 링크 | OFF |
BUIKD_STATIC |
mapserver 를 정적 링크로 빌드 |
OFF |
MapServer 의 PHP 7 지원 여부는 아래를 참고한다.
https://github.com/mapserver/mapserver/issues/5252
Proj.4 버전이 6.0 이상인 경우, 아래 옵션을 빌드시에 반영한다.
export CFLAGS="${CFLAGS} -DACCEPT_USE_OF_DEPRECATED_PROJ_API_H=1"
RPM CMake 예
mkdir build
cd build
cmake -DINSTALL_LIB_DIR=%{_libdir} \
-DCMAKE_INSTALL_PREFIX=%{_prefix} \
-DCMAKE_SKIP_RPATH=ON \
-DCMAKE_CXX_FLAGS_RELEASE="%{optflags} -fno-strict-aliasing" \
-DCMAKE_C_FLAGS_RELEASE="%{optflags} -fno-strict-aliasing" \
-DCMAKE_VERBOSE_MAKEFILE=ON \
-DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_SKIP_INSTALL_RPATH=ON \
-DCMAKE_SKIP_RPATH=ON \
-DWITH_CAIRO=TRUE \
-DWITH_CLIENT_WFS=TRUE \
-DWITH_CLIENT_WMS=TRUE \
-DWITH_CURL=TRUE \
-DWITH_FCGI=TRUE \
-DWITH_FRIBIDI=TRUE \
-DWITH_GD=TRUE \
-DWITH_GDAL=TRUE \
-DWITH_GEOS=TRUE \
-DWITH_GIF=TRUE \
-DWITH_ICONV=TRUE \
-DWITH_JAVA=TRUE \
-DWITH_KML=TRUE \
-DWITH_LIBXML2=TRUE \
-DWITH_OGR=TRUE \
-DWITH_MYSQL=TRUE \
-DWITH_PERL=TRUE \
-DCUSTOM_PERL_SITE_ARCH_DIR="%{perl_vendorarch}" \
%if 0%{php_mapscript}
-DWITH_PHP=TRUE \
%endif # end php_mapscript
-DWITH_POSTGIS=TRUE \
-DWITH_PROJ=TRUE \
%if 0%{python_mapscript}
-DWITH_PYTHON=TRUE \
%endif # end python_mapscript
-DWITH_RUBY=TRUE \
-DWITH_V8=FALSE \
-DWITH_SOS=TRUE \
-DWITH_THREAD_SAFETY=TRUE \
-DWITH_WCS=TRUE \
-DWITH_WMS=TRUE \
-DWITH_WFS=TRUE \
-DWITH_XMLMAPFILE=TRUE \
-DWITH_POINT_Z_M=TRUE \
-DWITH_APACHE_MODULE=FALSE \
-DWITH_SVGCAIRO=FALSE \
-DWITH_CSHARP=FALSE \
-DWITH_ORACLESPATIAL=FALSE \
-DWITH_ORACLE_PLUGIN=FALSE \
-DWITH_MSSQL2008=FALSE \
-DWITH_SDE=FALSE \
-DWITH_SDE_PLUGIN=FALSE \
-DWITH_EXEMPI=FALSE \
-Wno-dev \
..
3. MapServer CentOS 패키징
아래의 Fedora 패키지를 수정해서 재빌드한다.
https://koji.fedoraproject.org/koji/buildinfo?buildID=1329370
Geos 및 Proj 버전을 고려해서 MapServer 7.0.x 버전을 빌드하는 것도 쉬운 방법이다.
https://koji.fedoraproject.org/koji/buildinfo?buildID=1129212
SPEC 파일에서 다음을 수정한다.
BuildRequires: mariadb-connector-c-devel
mapserver-7.2.2-3.git7fe9b2b.el7.x86_64.rpm
mapserver-libs-7.2.2-3.git7fe9b2b.el7.x86_64.rpm
mapserver-devel-7.2.2-3.git7fe9b2b.el7.x86_64.rpm
php-mapserver-7.2.2-3.git7fe9b2b.el7.x86_64.rpm
mapserver-perl-7.2.2-3.git7fe9b2b.el7.x86_64.rpm
python2-mapserver-7.2.2-3.git7fe9b2b.el7.x86_64.rpm
mapserver-java-7.2.2-3.git7fe9b2b.el7.x86_64.rpm
mapserver-ruby-7.2.2-3.git7fe9b2b.el7.x86_64.rpm
mapserver-debuginfo-7.2.2-3.git7fe9b2b.el7.x86_64.rpm
4. MapServer 설치
5. MapServer CGI 아파치 설정
1) 테스트 웹 폴더 만들기
# mkdir /opt/mapserver
# cd /opt/mapserver
# mkdir cgi-bin html data map tmp etc templates
# cd cgi-bin
# ln -s /usr/bin/mapserv mapserv
# chown apache:apache /opt/mapserver/tmp
테스트 데이터로 래스터 데이터를 웹에서 사용하기 위해 위와 같이 폴더를 생성하고, 아래와 같이 아파치 웹 서버 설정을 추가
2) 아파치 웹 설정 추가
# cd /etc/httpd/conf.d
# vi mapserver.conf
ScriptAlias /mapserver/cgi-bin/ "/opt/mapserver/cgi-bin/"
Alias /mapserver/ "/opt/mapserver/html/"
<Directory "/opt/mapserver/cgi-bin">
AllowOverride None
SetHandler cgi-script
Options +ExecCGI +FollowSymlinks -SymLinksIfOwnerMatch
Require all granted
</Directory>
<Directory "/opt/mapserver/html/">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order Allow,Deny
Allow from All
Require all granted
</Directory>
설정 추가 후, 아파치 웹서버를 재시작한다.
3) 접속 테스트
웹 브라우저를 통해 MapServer CGI 를 실행한다.
http://192.168.0.10/mapserver/cgi-bin/mapserv
No query information to decode. QUERY_STRING is set, but empty.
위와 같은 메시지가 보이면 정상적으로 MapServer CGI 가 실행된 것이다.
6. 설치 후 기본 테스트
1) 맵 파일 만들기
간단한 맵 파일을 작성한다.
/opt/mapserver/map/t1.map
MAP
NAME MS101_
EXTENT -180 -90 180 90 # Geographic
SIZE 800 400
IMAGECOLOR 128 128 255
END
맵 파일의 구조는 위와 같이 MAP 지시어로 시작해서 END 로 끝난다.
2) 웹에서 접근한다.
http://192.168.0.10/mapserver/cgi-bin/mapserv?map=/opt/mapserver/map/t1.map&mode=map
패러미터에 주의한다.
결과는 다음과 같다.
3) 폴리곤 레이어 테스트
Natural Earth 의 Shape 데이터를 레이어로 추가한다.
데이터는 편의상 world.shp 파일로 한다.
파일들을 /opt/mapserver/data 에 둔다.
/opt/mapserver/map/layers/world.lay 파일을 다음과 같이 생성한다.
LAYER
NAME world
GROUP world
DATA 'world.shp'
STATUS ON
TYPE POLYGON
CLASS
NAME 'The World'
STYLE
COLOR 220 220 220
END
END
END
그리고, 먼저 만든 맵 파일에 다음과 같이 추가한다.
MAP
NAME MS101_
EXTENT -180 -90 180 90 # Geographic
SIZE 800 400
IMAGECOLOR 128 128 255
SHAPEPATH "/opt/mapserver/data/"
INCLUDE 'layers/world.lay'
END
데이터파일의 경로를 지시하는 패러미터와 서브파일을 포함하는 명령어가 추가되었다.
웹에서 다음과 같이 접근한다.
http://192.168.0.10/mapserver/cgi-bin/mapserv?map=/opt/mapserver/map/t1.map&mode=map&layer=world
4) WMS 서비스 테스트
5) 래스터 레이어 테스트
NASA Blue Marble (또는 True Marble) 래스터 영상을 배경지도로 사용하기 위해 레이어로 추가한다.
LAYER
NAME 'marble'
STATUS ON
TYPE RASTER
DATA 'bluemarble.tif'
PROJECTION
"init=epsg:4326"
END
END
msWMSDispatch(): WMS server error. WMS request not enabled. Check wms/ows_enable_request settings.
아래와 같이 wms 패러미터를 추가해본다.
MAP
IMAGETYPE png
SIZE 1500 900
UNITS DD
EXTENT -180 -90 180 90
SHAPEPATH "/opt/mapserver/data"
WEB
IMAGEPATH "/tmp/"
METADATA
"wms_title" "Map with A Single Layer"
"wms_onlineresource" "http://192.168.0.10/mapserver/cgi-bin/mapserv?"
"wms_srs" "EPSG:4326"
"ows_enable_request" "*"
END
END
PROJECTION
"init=epsg:4326"
END
LAYER
NAME 'land'
TYPE POLYGON
PROJECTION
'init=epsg:4326'
END
DATA 'ne_110m_admin_0_countries.shp'
CLASS
STYLE
OUTLINECOLOR 255 255 0
WIDTH 1.5
END
END
END
# START RASTER LAYER
LAYER
NAME "raster"
TYPE RASTER
STATUS ON
PROJECTION
'init=epsg:4326'
END
DATA 'bluemarble.tif'
END
# END RASTER LAYER
END
그런데, 매뉴얼들이 모두 이렇게 후지냐....