ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CentOS 에서 MapServer 설치 및 테스트
    GIS 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



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

    댓글

Designed by Tistory.