𝝅번째 알파카의 개발 낙서장

screen

OpenLayers를 여행하는 개발자를 위한 안내서 - 8. 공간정보 데이터를 주문하는 법. OGC

projects

GIS

시리즈 톺아보기

OpenLayers를 여행하는 개발자를 위한 안내서

OpenLayers를 여행하는 개발자를 위한 안내서
count

OGC 표준 🔗

이전 장에서 GeoServer를 통해 공간정보 데이터 관리 시스템을 구축했다. 이제 이 데이터를 적절히 호출만 하면 될텐데, 이를 어떻게 해야할까?

만약 소프트웨어나 서비스 제공 기관별로 호출방법을 제각각으로 둘 경우 많은 혼란이 야기될 것이다. 어떤 서비스에선 이런 기능이 제공되는데, 어떤 서비스에선 이 기능이 전무한 상황이 빈번할 것이다. 즉, 서비스의 일관성을 해치게 된다. 공간정보라는 복잡한 데이터의 특성 상 일관성의 훼손이 주는 의미는 더욱 크다.

이를 해결하기 위해 적절한 표준을 제정한 것이 OGC 표준이다. OGC(Open Geospatial Consortium)는 공간정보 관련 기술의 개방형 표준화를 개발하고 구현하는 국제 표준화 기구다.

OGC에서 공간정보 질의 표준을 정의한 것이 OGC 표준이다. 공간정보와 관련된 소프트웨어, 웹, 앱 등이 OGC 표준을 준수한다면, 어떤 형태든 동일한 요청 방식으로 데이터를 제공받을 수 있다. 즉, OGC 표준을 준수하는 시스템을 활용한다면, 서비스의 일관성을 지킬 수 있다. 한 번 잘 알아두면 OGC 표준을 준수하는 모든 서비스에서 동일하게 활용이 가능하다. 이러한 편의성으로 인해 정상적인 GIS 솔루션이라면 OGC 표준을 반드시 준수한다.

당연히 OGC 표준 준수는 그냥 막 가져다 붙일 수 있는 건 전혀 아니고, 심사를 통해 OGC 표준을 정상적으로 구현했는지 검증하는 과정을 거쳐야 비로소 OGC 표준을 준수한다고 할 수 있다.


아래는 웹 환경에서의 OGC 표준 주요 항목이다.

  • WFS (Web Feature Service): 벡터 데이터의 속성 및 공간 정보
  • WMS (Web Map Service): 배경지도 및 시각화
  • WCS (Web Coverage Service): 래스터 데이터 추출
  • WPS (Web Processing Service): 공간분석 처리

가장 사용 빈도가 높은 건 WFS, WMS다. 서비스의 대부분은 단순 공간정보를 질의하거나 배경지도를 호출하는 수준에 그치기 때문.

이 두 스펙 정도만 알아놔도 OpenLayers로 지도를 표현하는 데 아무런 문제가 없다.



WFS 🔗

WFS의 주요 명령어를 기술한다.

  • GetFeature
  • Transaction

기본 URL은 https://example.com/geoserver/wfs와 같다.


1. GetFeature 🔗

레이어의 속성정보를 호출한다. DB로 따지자면 테이블의 데이터를 호출하는 것과 동일하다.

지도의 속성 정보가 필요할 때 사용한다.

GeoServer의 GetFeature에 필요한 파라미터는 아래와 같다.

TXT

0GET https://example.com/geoserver/wfs?service=WFS&version=2.0.0&request=GetFeature&typename=test:building&srsName=EPSG:3857&outputFormat=application/json&bbox=14168809.936013725,4366042.924151548,14170735.193663657,4367768.7289308,EPSG:3857
Parameter Example Require Description
service WFS (고정) Y 서비스명
version 2.0.0 (기본), 1.1.0, 1.0.0 Y 버전
request GetFeature (고정) Y 요청명
typename repo_name:layer_name Y 레이어명 (다수는 쉼표로 구분)
srsName EPSG:4326 기준 좌표계 (비울 경우 레이어의 기본 좌표계로 표시)
outputFormat application/vnd.ogc.se_xml (기본) 응답 형식
exceptions application/vnd.ogc.se_xml (기본) 예외 응답 형식
propertyName 전체 컬럼 응답에 포함할 컬럼명 (다수의 경우 쉼표로 구분)
bbox ,EPSG:0000 제한할 범위
featureID {id} Feature ID

필수 파라미터만 입력하면 해당 레이어의 모든 데이터에 대한 속성정보를 불러온다.


srsName에 원하는 EPSG 코드를 입력하면, 그에 맞게 좌표변환을 수행하여 결과를 출력해준다. 클라이언트나 서버에서의 좌표변환을 전혀 신경쓰지 않아도 된다.

JSON 방식을 원할 경우, application/jsonoutputFormat에 지정하면 된다.


propertyName에 컬럼명을 입력하면, 해당 데이터만을 불러온다. 이를 적절히 활용해 필요한 데이터만을 호출하여 응답 속도 및 크기를 최적화할 수 있다.


bboxfeatureID는 둘 중 하나만 사용 가능하다. 별다른 제한 없이 WFS를 그냥 호출해버리면 레이어의 모든 데이터를 연산하여 응답해주기 때문에 시간은 물론, 서버에 부하도 많이 간다. 때문에 대부분 현재 영역에 해당하는 데이터만을 반환하도록 제한한다. 이 때 사용하는 영역 제한값이 bbox.

bbox의 마지막 EPSG 코드는 생략할 수 있으며, 생략할 경우 레이어의 기본 EPSG 좌표계로 인식하고 계산한다.


featureID는 특정 아이디를 가진 데이터 하나만을 타깃하여 반환해준다. 기본적으로 모든 데이터에는 ID가 붙는데, {layer}.{number}와 같은 식이다. 예를 들어, 레이어 이름이 test_layer라면, test_layer.354와 같은 식.

featureID=354을 포함하여 요청하면 해당 데이터 하나만을 반환한다.

TXT

0/geoserver/wfs?service=WFS&version=2.0.0&request=GetFeature&typename=TEST:buld_sejong&srsName=EPSG:3857&outputFormat=application/json&exceptions=application/json&featureID=11645

JSON

0{
1 "type": "FeatureCollection",
2 "features": [
3 {
4 "type": "Feature",
5 "id": "buld_sejong.11645",
6 "geometry": {
7 "type": "Polygon",
8 "coordinates": [
9 [
10 [
11 1.418136757571567E7,
12 4370012.19281353
13 ],
14 [
15 1.418136633370244E7,
16 4370021.40639941
17 ],
18 [
19 1.418138830051506E7,
20 4370022.60152291
21 ],
22 [
23 1.418138868963238E7,
24 4370013.39142052
25 ],
26 [
27 1.418136757571567E7,
28 4370012.19281353
29 ]
30 ]
31 ]
32 },
33 "geometry_name": "SHAPE",
34 "properties": {
35 "bdtyp_cd": "17005",
36 "bd_mgt_sn": "3611033027102590003000005",
37 "bsi_int_sn": 67897,
38 "bsi_zon_no": "30078",
39 "buld_mnnm": 35,
40 "buld_nm": null,
41 "buld_nm_dc": "4동",
42 "buld_se_cd": "0",
43 "buld_slno": 35,
44 "bul_dpn_se": "M",
45 "bul_eng_nm": null,
46 "bul_man_no": 55809,
47 "emd_cd": "330",
48 "eqb_man_sn": 0,
49 "gro_flo_co": 1,
50 "li_cd": "27",
51 "lnbr_mnnm": 259,
52 "lnbr_slno": 6,
53 "mntn_yn": "0",
54 "mvmn_de": "20210308",
55 "mvmn_resn": "건물번호 변경신청(노호리 259-6)에 따른 건물군 분리",
56 "mvm_res_cd": "35",
57 "ntfc_de": "20210308",
58 "opert_de": "20210308130538",
59 "pos_bul_nm": null,
60 "rds_man_no": 3020,
61 "rds_sig_cd": "36110",
62 "rn_cd": "3258065",
63 "sig_cd": "36110",
64 "und_flo_co": 0
65 }
66 }
67 ],
68 "totalFeatures": 1,
69 "numberMatched": 1,
70 "numberReturned": 1,
71 "timeStamp": "2022-03-10T16:05:54.511Z",
72 "crs": {
73 "type": "name",
74 "properties": {
75 "name": "urn:ogc:def:crs:EPSG::3857"
76 }
77 }
78}

위 응답은 세종시 건물 중 아이디가 11645인 데이터를 GetFeature로 호출한 결과이다. outputFormatapplication/json으로 지정하여 GeoJSON이 응답된다. 만약 응답 형식을 따로 지정하지 않는다면 XML 형태로 응답한다.

만약 propertyName=bdtyp_cd,bd_mgt_sn 파라미터를 추가했다면, properties에서 bdtyp_cd, bd_mgt_sn만 포함될 것이다.

공간정보를 가진 XML. GML
공간정보를 가진 JSON을 GeoJSON이라고 부르듯이, XML 또한 GML이라는 별도의 명칭으로 부르기도 한다.
GeoServer는 별도의 응답 형식을 지정하지 않으면, 대부분의 응답을 GML이나 XML로 처리하니, API 통신에서의 원활한 사용을 위해 가급적 JSON으로 지정해주자.


2. Transaction 🔗

레이어의 데이터에 대한 삽입, 갱신, 삭제 기능을 제공한다.

요청의 메소드는 POST로 공통이다. 삽입, 갱신, 삭제 모두 POST를 사용한다.

body에 동작을 XML로 구성하여 요청한다. OGC 표준이 워낙 옛날부터 제정되다보니, 대부분의 요청은 XML을 기본으로 한다.


공간정보의 좌표값은 정해진 XML 양식을 통해 죄표값을 기술하여 정의할 수 있다. 각 데이터 형식에 해당하는 XML은 아래와 같다.

해당 XML은 Transaction Insert, Update에 사용된다.

  • Polygon

XML

0<gml:Polygon srsName="EPSG:0000">
1 <gml:outerBoundaryIs>
2 <gml:LinearRing>
3 <gml:coordinates>x1,y1 x2,y2 x3,y3 x4,y4 x1,y1</gml:coordinates>
4 </gml:LinearRing>
5 </gml:outerBoundaryIs>
6</gml:Polygon>

gml:Polygon의 속성 srsName에 좌표계를 기술한다. 생략할 경우, 대상 레이어의 기본 좌표계로 인식한다.

gml:coordinates의 내부에 좌표를 기술한다. 하나의 좌표 는 쉼표로 구분하고, 각 좌표끼리는 공백으로 구분한다.

Polygon은 반드시 첫 좌표와 마지막 좌표가 동일해야한다는 점을 잊지 말자.

  • Line

XML

0<gml:LineString srsName="EPSG:0000">
1 <gml:coordinates>x1,y1 x2,y2 x3,y3 x4,y4</gml:coordinates>
2</gml:LineString>

gml:LineString의 속성 srsName에 좌표계를 기술한다. 생략할 경우, 대상 레이어의 기본 좌표계로 인식한다.

gml:coordinates의 내부에 좌표를 기술한다. 하나의 좌표 는 쉼표로 구분하고, 각 좌표끼리는 공백으로 구분한다.

Line은 반드시 첫 좌표와 마지막 좌표가 다르다는 점을 잊지 말자.

  • Point

XML

0<gml:Point srsName="EPSG:0000">
1 <gml:coordinates>x,y</gml:coordinates>
2</gml:Point>

gml:Point의 속성 srsName에 좌표계를 기술한다. 생략할 경우, 대상 레이어의 기본 좌표계로 인식한다.

gml:coordinates의 내부에 좌표를 기술한다. 점이므로 만 존재하며 이 둘은 쉼표로 구분한다.


2-1. Transaction Insert 🔗

레이어 데이터에 대한 삽입 기능이다.

TXT

0POST https://example.com/geoserver/wfs

XML

0<wfs:Transaction
1 xmlns:wfs="http://www.opengis.net/wfs"
2 xmlns:gml="http://www.opengis.net/gml"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 service="WFS"
5 version="1.0.0"
6 xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd">
7 <wfs:Insert>
8 <layer_name>
9 <column1>value1</column1>
10 <column2>value2</column2>
11 <column3>value3</column3>
12 <geo_column>
13 <gml:Polygon srsName="EPSG:4326">
14 <gml:outerBoundaryIs>
15 <gml:LinearRing>
16 <gml:coordinates>x1,y1 x2,y2 x3,y3 x4,y4 x1,y1</gml:coordinates>
17 </gml:LinearRing>
18 </gml:outerBoundaryIs>
19 </gml:Polygon>
20 </geo_column>
21 </layer_name>
22 </wfs:Insert>
23</wfs:Transaction>

위 XML은 Polygon을 추가하는 XML이다. 이 XML을 해석하면 아래와 같다.

  • 대상 테이블은 layer_name이다.
  • 컬럼 column1, column2, column3에 각각 value1, value2, value3을 삽입한다.
    • Schema엔 있으나, 삽입 시 컬럼을 명시하지 않았을 경우, 해당 컬럼은 null로 삽입된다.
  • 공간정보 컬럼명은 geo_column이다.
  • 좌표 x1,y1 x2,y2 x3,y3 x4,y4 x1,y1의 폴리곤이다.
    • 좌표계는 EPSG:4326이다.

용도에 맞게 테이블명, 컬럼 등을 변경하면 된다.

XML

0<?xml version="1.0" encoding="UTF-8"?>
1<wfs:WFS_TransactionResponse
2 xmlns:wfs="http://www.opengis.net/wfs"
3 xmlns:ogc="http://www.opengis.net/ogc"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 version="1.0.0"
6 xsi:schemaLocation="http://www.opengis.net/wfs https://api.itcode.dev/geoserver/schemas/wfs/1.0.0/WFS-transaction.xsd">
7 <wfs:InsertResult>
8 <ogc:FeatureId fid="buld_test.71"/>
9 </wfs:InsertResult>
10 <wfs:TransactionResult>
11 <wfs:Status>
12 <wfs:SUCCESS/>
13 </wfs:Status>
14 </wfs:TransactionResult>
15</wfs:WFS_TransactionResponse>

정상응답은 위와 같다. Transaction의 응답은 아쉽게도 XML만 지원한다.

위 응답에서 얻을 수 있는 정보는 아래와 같다.

  • 데이터를 삽입함
  • 응답 결과가 SUCCESS로 정상
  • 생성된 객체의 아이디는 buld_test.71

2-2. Transaction Update 🔗

레이어 데이터에 대한 수정 기능이다.

TXT

0POST https://example.com/geoserver/wfs

XML

0<wfs:Transaction
1 xmlns:wfs="http://www.opengis.net/wfs"
2 xmlns:gml="http://www.opengis.net/gml"
3 xmlns:ogc="http://www.opengis.net/ogc"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 service="WFS"
6 version="1.0.0"
7 xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd">
8 <wfs:Update typeName="layer_name">
9 <wfs:Property>
10 <wfs:Name>column1</wfs:Name>
11 <wfs:Value>value1</wfs:Value>
12 </wfs:Property>
13
14 <wfs:Property>
15 <wfs:Name>column2</wfs:Name>
16 <wfs:Value>value2</wfs:Value>
17 </wfs:Property>
18
19 <wfs:Property>
20 <wfs:Name>geo_column</wfs:Name>
21 <wfs:Value>
22 <gml:Polygon srsName="EPSG:0000">
23 <gml:outerBoundaryIs>
24 <gml:LinearRing>
25 <gml:coordinates>x1,y1 x2,y2 x3,y3 x4,y4 x1,y1</gml:coordinates>
26 </gml:LinearRing>
27 </gml:outerBoundaryIs>
28 </gml:Polygon>
29 </wfs:Value>
30 </wfs:Property>
31
32 <ogc:Filter>
33 <ogc:FeatureId fid="layer_name.32" />
34 </ogc:Filter>
35 </wfs:Update>
36</wfs:Transaction>

위 XML은 Polygon을 수정하는 XML이다. 이 XML을 해석하면 아래와 같다.

  • 대상 테이블은 layer_name이다.
  • 컬럼 column1, column2에 각각 value1, value2으로 변경한다.
    • 각 컬럼은 wfs:Property로 묶인다.
    • 명시된 컬럼만 변경한다.
  • 공간정보 컬럼명은 geo_column이다.
  • 좌표 x1,y1 x2,y2 x3,y3 x4,y4 x1,y1의 폴리곤으로 변경한다.
    • 좌표계는 EPSG:4326이다.
  • 변경 대상 객체는 아이디가 layer_name.32인 객체다.

용도에 맞게 테이블명, 컬럼 등을 변경하면 된다.

ogc:Filter는 OGC Filter의 양식을 따른다.

위 XML은 아이디가 layer_name.32인 데이터 하나만을 대상으로 변경했지만, 필터의 구성에 따라 다수의 데이터를 전부 변경할 수도 있다.

이와 관련된 OGC 필터는 후술.

XML

0<?xml version="1.0" encoding="UTF-8"?>
1<wfs:WFS_TransactionResponse
2 xmlns:wfs="http://www.opengis.net/wfs"
3 xmlns:ogc="http://www.opengis.net/ogc"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 version="1.0.0"
6 xsi:schemaLocation="http://www.opengis.net/wfs https://api.itcode.dev/geoserver/schemas/wfs/1.0.0/WFS-transaction.xsd">
7 <wfs:InsertResult>
8 <ogc:FeatureId fid="none"/>
9 </wfs:InsertResult>
10 <wfs:TransactionResult>
11 <wfs:Status>
12 <wfs:SUCCESS/>
13 </wfs:Status>
14 </wfs:TransactionResult>
15</wfs:WFS_TransactionResponse>

정상응답은 위와 같다. 위 응답에서 얻을 수 있는 정보는 아래와 같다.

  • 데이터를 갱신함
    • InsertResult로 삽입과 형태가 동일하지만, 새로 생성된게 없으므로 아이디가 none이다.
  • 응답 결과가 SUCCESS로 정상

2-3. Transaction Delete 🔗

레이어 데이터에 대한 삭제 기능이다.

단순 삭제만 수행하면 되므로, XML이 훨씬 간단하다.

TXT

0POST https://example.com/geoserver/wfs

XML

0<wfs:Transaction
1 xmlns:wfs="http://www.opengis.net/wfs"
2 xmlns:ogc="http://www.opengis.net/ogc"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 service="WFS"
5 version="1.0.0"
6 xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd">
7 <wfs:Delete typeName="layer_name">
8 <ogc:Filter>
9 <ogc:FeatureId fid="layer_name.66" />
10 </ogc:Filter>
11 </wfs:Delete>
12</wfs:Transaction>

위 XML은 Polygon을 삭제하는 XML이다. 이 XML을 해석하면 아래와 같다.

  • 대상 테이블은 layer_name이다.
  • 삭제 대상 객체는 아이디가 layer_name.66인 객체다.

데이터를 삭제하기만 하면 되므로, XML이 다른 API보다 훨씬 간단하다. 삭제할 객체가 어떤 객체인지 타깃만 하면 되기 때문.+

마찬가지로, 필터의 구성에 따라 다수의 데이터를 전부 삭제할 수도 있다.

이와 관련된 OGC 필터는 후술.

XML

0<?xml version="1.0" encoding="UTF-8"?>
1<wfs:WFS_TransactionResponse
2 xmlns:wfs="http://www.opengis.net/wfs"
3 xmlns:ogc="http://www.opengis.net/ogc"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 version="1.0.0"
6 xsi:schemaLocation="http://www.opengis.net/wfs https://api.itcode.dev/geoserver/schemas/wfs/1.0.0/WFS-transaction.xsd">
7 <wfs:InsertResult>
8 <ogc:FeatureId fid="none"/>
9 </wfs:InsertResult>
10 <wfs:TransactionResult>
11 <wfs:Status>
12 <wfs:SUCCESS/>
13 </wfs:Status>
14 </wfs:TransactionResult>
15</wfs:WFS_TransactionResponse>

정상응답은 위와 같다. 위 응답에서 얻을 수 있는 정보는 아래와 같다.

  • 데이터를 삭제함
    • InsertResult로 삽입과 형태가 동일하지만, 새로 삭제된게 없으므로 아이디가 none이다.
    • 갱신과 삭제는 구분하기 어렵다.
  • 응답 결과가 SUCCESS로 정상


WMS 🔗

WMS의 주요 명령어를 기술한다.

  • GetMap
  • GetFeatureInfo

기본 URL은 https://example.com/geoserver/wms와 같다.


1. GetMap 🔗

레이어의 데이터 및 선언된 스타일을 토대로 렌더링된 지도를 제공한다. 즉, JSON 같은 텍스트 기반 데이터가 아닌, PNG 같은 이미지를 제공한다.

보유한 데이터를 토대로, 자신이 직접 디자인한 지도를 제공할 수도 있다.

GeoServer의 GetMap에 필요한 파라미터는 아래와 같다.

TXT

0GET https://example.com/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&layers=buld_sejong&exceptions=application%2Fjson&WIDTH=256&HEIGHT=256&CRS=EPSG%3A3857&STYLES=&BBOX=14167144.570487704%2C4365471.559422987%2C14167756.066713985%2C4366083.055649268
Parameter Example Require Description
service WMS (고정) Y 서비스명
version 1.3.0 (고정), 1.1.1, 1.1.0, 1.0.0 Y 버전
request GetMap (고정) Y 요청명
layers repo_name:layer_name Y 레이어명 (다수는 쉼표로 구분)
styles style1 적용할 스타일명 (비울 경우 GeoServer에서 설정한 기본 스타일 적용, 다수는 쉼표로 구분)
srs(or crs) EPSG:4326 기준 좌표계 (비울 경우 레이어의 기본 좌표계로 인식)
bbox Y 이미지 영역 좌표
width 256 Y 이미지 넓이
height 256 Y 이미지 높이
format image/png Y 요청명
transparent false (기본) 배경 투명 여부
bgcolor FFFFFF (기본) RRGGBB 형태의 배경 색상
exceptions application/vnd.ogc.se_xml (기본) 예외 응답 형식
time 2022-03-14T22:30.27.520+09:00 시계열 데이터를 위한 시간 (yyyy-MM-ddThh:mm:ss.SSSZ)
sld https://example.com/sld.xml XML 파일 경로
sld_body SLD XML

WMS는 OGC 표준 명령어 중에서 특이하게 이미지를 반환하는 명령어다. format 역시 이미지 MIME 타입인 것을 확인할 수 있다. 이를 통해서 자신이 직접 디자인한 지도를 서비스할 수도 있다.

단, 레이어가 너무 많거나, SLD가 복잡해질수록 렌더링 시간이 길어질 수 있다.


srs는 기준 좌표계다. bbox의 EPSG 코드를 입력하면 되며, 비울 경우 레이어의 기본 EPSG 코드로 인식한다.

version이 1.3.0일 경우, crs로 사용한다.


WMS는 반드시 bbox를 통해 영역을 입력해야한다.


styles는 사용할 SLD의 이름이다. GeoServer에서 해당 레이어에 사용할 SLD를 지정할 수 있는데, 이 때 지정한 SLD의 이름을 입력하는 것이다.

쉼표로 구분하여 하나 이상의 SLD를 입력할 수 있으며, 비울 경우 기본으로 지정한 SLD가 자동으로 선택된다.


time은 시계열 데이터를 위한 파라미터. 시간별로 구분된 데이터가 있다면, 해당 파라미터를 통해 호출할 수 있다.


sld는 외부 SLD를 지정하기 위한 파라미터로, URL을 입력한다.

sld_body는 SLD XML을 직접 파라미터에 입력하는 것이다.

image

GetMap의 응답 예시다.


2. GetFeatureInfo 🔗

GetMap으로 출력된 지도는 모든 객체들이 이미지로 바뀌므로, 객체를 선택하거나 판별하는 것이 불가능해보인다.

하지만, GetFeatureInfo를 사용하면, 이미지를 클릭했을 때 해당 객체의 정보를 확인할 수 있다.

GeoServer의 GetFeatureInfo에 필요한 파라미터는 아래와 같다.

TXT

0GET https://example.com/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&FORMAT=image%2Fpng&TRANSPARENT=true&QUERY_LAYERS=buld_sejong&layers=buld_sejong&exceptions=application%2Fjson&INFO_FORMAT=application%2Fjson&I=221&J=178&WIDTH=256&HEIGHT=256&CRS=EPSG%3A3857&STYLES=&BBOX=14169590.555392835%2C4366694.551875548%2C14169896.303505976%2C4367000.299988689
Parameter Example Require Description
service WMS (고정) Y 서비스명
version 1.3.0 (고정), 1.1.1, 1.1.0, 1.0.0 Y 버전
request GetFeatureInfo (고정) Y 요청명
layers repo_name:layer_name Y 레이어명 (다수는 쉼표로 구분)
styles style1 적용할 스타일명 (GetFeatureInfo에선 의미 없음)
crs(or srs) EPSG:4326 기준 좌표계 (비울 경우 레이어의 기본 좌표계로 인식)
bbox Y 이미지 영역 좌표
width 256 Y 이미지 넓이
height 256 Y 이미지 높이
query_layers repo_name:layer_name Y 추가 요청 레이어명 (다수는 쉼표로 구분)
info_format application/vnd.ogc.se_xml (기본) 응답 형식
feature_count 1 (기본) 최대 객체 호출 수
x(or i) 225 Y 지도의 x 픽셀값
y(or j) 156 Y 지도의 y 픽셀값
exceptions application/vnd.ogc.se_xml (기본) 예외 응답 형식

layersquery_layers가 비슷해서 헷갈릴 수 있는데, 이는 GetMap에서의 확장을 염두에 두었기 때문이다.

GetMap의 요청에 GetFeatureInfo가 추가로 요구하는 몇몇 파라미터만 이어붙여 사용하기 위해 별도로 둔 것이다. layersquery_layers의 차이는 아래와 같다.

  • layers: GetMap시 해당 레이어가 지도에 출력됨
  • query_layers: GetMap에는 출력되지 않으나, GetFeatureInfo에선 포함되어 검색됨

지금까지 소개한 명령어들의 응답 형식이 format인데 비해, GetFeatureInfoinfo_format으로 상이한 이유 또한 여기에 있다.


GetFeatureInfo은 클릭한 위치를 계산하여 해당하는 객체의 정보를 출력하는 명령어이므로, info_format에 입력하는 값은 GetFeature와 같이 텍스트 MIME를 사용한다.


x, y는 지도 상에서 마우스가 클릭한 픽셀 값이다. 좌표가 아님에 주의하자. 좌표는 bbox에 입력한다.

version이 1.3.0일 경우, x, y가 아닌 i, j로 사용해야한다.



마치며 🔗

위에서 소개한 명령어는 OGC 표준 중 가장 빈번하게 사용하는 명령어로, 이외에도 당신에게 꼭 필요할 수도 있는 다채로운 명령어들이 존재한다.

앞으로 설명할 예제들도 그렇고, 기본적인 기능의 지도는 위 기능들만 적절히 활용해도 충분히 서비스할 수 있다.

더 많은 내용이 궁금하다면, 여기를 확인하길 바란다.