GIS

CentOS 에서 MapServer 설치 및 테스트

respiro 2019. 12. 17. 16:30

CentOS 7 에서 MapServer 설치 및 테스트

작성 일자:  2019년 11월  8일

수정 일자: 2019년 12월 11일

작성자: N3



0. 레퍼런스

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} == 7
BuildRequires:  mariadb-devel
%else
BuildRequires:  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.rpm


7.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
%endif

4. 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


아래와 같이 실행되면 정상설치된 것이다.
# mapserv
This script can only be used to decode form results and
should be initiated as a CGI process via a httpd server.
For other options please try using the --help switch.

$ /usr/bin/mapserv -v
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

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 서비스 테스트

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"
  END

  WEB
    METADATA
      ows_title "MapServer Quickstart"
      ows_enable_request "*"
      ows_srs "EPSG:4326 EPSG:900913"
    END
  END

아래와 같은 기능을 할 수 있다는 결과를 반환한다.

<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



그런데, 매뉴얼들이 모두 이렇게 후지냐....