-
CentOS 에서 MapServer 설치 및 테스트GIS 2019. 12. 17. 16:30
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%if 0%{rhel} == 7BuildRequires: mariadb-devel%elseBuildRequires: mariadb-connector-c-devel%endif파이썬 mapscript를 지원하기 위해서 spec 파일을 다음과 같이 수정한다.%global python_mapscript 1그리고, CentOS 7 의 python 의 기본 버전이 2.x 인 경우, python3 를 python2 로 변경한다.만약, CentOS 7 의 기본 파이썬 버전이 3.x 인 경우는 변경하지 않는다.PHP mapscript 를 지원하기 위해서 spec 파일을 다음과 같이 수정한다.%global php_mapscript 1$ rpmbuild -ba mapserver.spec패키지 목록들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.rpm7.4.2 최신 소스의 경우, ruby mapscript 빌드에 문제가 있다.아래와 같이 RUBY 를 막아줘서 패키지를 만든다.# 7.4.x ruby mapscript error%global ruby_mapscript 0%if 0%{ruby_mapscript}%package ruby..%endif%if 0%{ruby_mapscript}-DWITH_RUBY=TRUE \%endif%if 0%{ruby_mapscript}%files ruby%doc mapscript/ruby/README%doc mapscript/ruby/examples%{ruby_sitearchdir}/mapscript.so%endif4. MapServer 설치
$ rpm -qpl mapserver-7.2.2-3.git7fe9b2b.el7.x86_64.rpm/usr/bin/legend/usr/bin/mapserv/usr/bin/msencrypt/usr/bin/scalebar/usr/bin/shp2img/usr/bin/shptree/usr/bin/shptreetst/usr/bin/shptreevis/usr/bin/sortshp/usr/bin/tile4ms/usr/share/doc/mapserver-7.2.2/usr/share/doc/mapserver-7.2.2/README.rst/usr/share/mapserver/usr/share/mapserver/cmake/usr/share/mapserver/cmake/mapserver-config-version.cmake/usr/share/mapserver/cmake/mapserver-config.cmake/usr/share/mapserver/cmake/mapserverTargets-release.cmake/usr/share/mapserver/cmake/mapserverTargets.cmake/usr/share/mapserver/mapfile.xsd/usr/share/mapserver/mapfile.xsl$sudo yum localinstall mapserver mapserver-libs아래와 같이 실행되면 정상설치된 것이다.# mapservThis script can only be used to decode form results andshould be initiated as a CGI process via a httpd server.For other options please try using the --help switch.$ /usr/bin/mapserv -vMapServer version 7.0.5 OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS SUPPORTS=POINT_Z_M INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE5. 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 서비스 테스트
MapServer 를 빌드할 때, WMS 서빗스 서버를 지원하도록 빌드하였다.다음과 같이 WMS 기능을 요청한다.http://192.168.0.10/mapserver/cgi-bin/mapserv?map=/opt/mapserver/map/t1.map&SERVICE=WMS&REQUEST=GetCapabilities&VERSION=1.3.0<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.3.0" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/wms/1.3.0/exceptions_1_3_0.xsd"><ServiceException>msWMSGetCapabilities(): WMS server error. WMS request not enabled. Check wms/ows_enable_request settings.</ServiceException></ServiceExceptionReport>앞에서 만든 map 파일에 기본 PROJECT 과 WEB 속성을 추가한다.PROJECTION"init=epsg:4326"ENDWEBMETADATAows_title "MapServer Quickstart"ows_enable_request "*"ows_srs "EPSG:4326 EPSG:900913"ENDEND아래와 같은 기능을 할 수 있다는 결과를 반환한다.<WMS_Capabilities xmlns="http://www.opengis.net/wms" xmlns:sld="http://www.opengis.net/sld" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ms="http://mapserver.gis.umn.edu/mapserver" version="1.3.0" xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd http://mapserver.gis.umn.edu/mapserver http://192.168.0.10/mapserver/cgi-bin/mapserv?map=/opt/mapserver/map/t2.map&service=WMS&version=1.3.0&request=GetSchemaExtension"><!--MapServer version 7.0.5 OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS SUPPORTS=POINT_Z_M INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE--><Service><Name>WMS</Name><Title>MapServer Quickstart</Title><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://192.168.0.10/mapserver/cgi-bin/mapserv?map=/opt/mapserver/map/t2.map&"/><ContactInformation> </ContactInformation><MaxWidth>4096</MaxWidth><MaxHeight>4096</MaxHeight></Service><Capability><Request><GetCapabilities><Format>text/xml</Format><DCPType><HTTP><Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://192.168.0.10/mapserver/cgi-bin/mapserv?map=/opt/mapserver/map/t2.map&"/></Get><Post><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://192.168.0.10/mapserver/cgi-bin/mapserv?map=/opt/mapserver/map/t2.map&"/></Post></HTTP></DCPType></GetCapabilities><GetMap><Format>image/png</Format><Format>image/jpeg</Format><Format>image/png; mode=8bit</Format><Format>application/x-pdf</Format><Format>image/svg+xml</Format><Format>image/tiff</Format><Format>application/vnd.google-earth.kml+xml</Format><Format>application/vnd.google-earth.kmz</Format><DCPType>........BBOX 로 요청지역을 한반도로 한 후, 아래와 같이 요청한다.5) 래스터 레이어 테스트
NASA Blue Marble (또는 True Marble) 래스터 영상을 배경지도로 사용하기 위해 레이어로 추가한다.
LAYER
NAME 'marble'
STATUS ON
TYPE RASTER
DATA 'bluemarble.tif'
PROJECTION
"init=epsg:4326"
END
END
BBOX 로 요청지역을 한반도로 한 후, 아래와 같이 요청한다.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
그런데, 매뉴얼들이 모두 이렇게 후지냐....
- MapServer (https://mapserver.org/)