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

screen

OpenLayers를 여행하는 개발자를 위한 안내서 - 9. 데이터 필터링하기

projects

GIS

시리즈 톺아보기

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

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

OGC Filter 🔗

WFS나 WMS를 호출할 때, 좀 더 다채로운 필터링이 필요한 경우가 존재할 수 있다. 특정 영역 밖의 객체를 호출한다거나, 특정 영역에 걸치는 데이터만 호출하는 것, 혹은 다양한 조건을 조합하여 데이터를 조회해야 할 수도 있다.

이 때 요긴하게 사용할 수 있는 것이 OGC Filter다. OGC Filter는 XML의 형태를 가지며, 요청에 포함되어 좀 더 다양한 공간정보 데이터의 필터링을 가능케 한다.

OGC Filter의 요청 URL에 filter 파라미터로 값을 지정하여 사용할 수 있다. 또한 Transaction 명령에서도 사용할 수 있다.



이항 비교 연산자 🔗

이항 비교 연산자는 아래와 같다.

  • PropertyIsEqualTo: 일치하는 데이터
  • PropertyIsNotEqualTo: 불일치하는 데이터
  • PropertyIsLessThan: 미만인 데이터
  • PropertyIsLessThanOrEqualTo: 이하인 데이터
  • PropertyIsGreaterThan: 초과인 데이터
  • PropertyIsGreaterThanOrEqualTo: 이상인 데이터
Name Required value
PropertyName Y 컬럼명
Literal Y

XML

0<!-- CITY 컬럼이 서울인 데이터만을 필터링 -->
1<PropertyIsEqualTo>
2 <PropertyName>CITY</PropertyName>
3 <Literal>서울</Literal>
4</PropertyIsEqualTo>
5
6<!-- AREA 컬럼이 350 이하인 데이터만을 필터링 -->
7<PropertyIsLessThanOrEqualTo>
8 <PropertyName>AREA</PropertyName>
9 <Literal>350</Literal>
10</PropertyIsLessThanOrEqualTo>


값 비교 연산자 🔗

값 비교 연산자는 아래와 같다.

  • PropertyIsLike: 값을 포함하는 데이터
  • PropertyIsNull: 값이 NULL인 데이터
  • PropertyIsBetween: 값이 지정값 사이인 데이터

연산자별로 양식이 조금씩 다르다.

  • PropertyIsLike
Name Required value
PropertyName Y 컬럼명
Literal Y

PropertyName 태그에서 아래의 3가지 속성을 사용할 수 있다.

  • wildCard: 와일드카드
  • singleChar: 문자열 하나
  • escapeChar: 개행문자

위 속성에 문자열을 할당하면, 해당 문자열은 위와 동일한 의미를 가지게 된다.

속성은 여러개를 동시에 사용할 수도 있다.

XML

0<!-- CITY 컬럼이 서울이란 단어를 포함한 데이터만을 필터링 -->
1<PropertyIsLike>
2 <PropertyName>CITY</PropertyName>
3 <Literal>서울</Literal>
4</PropertyIsLike>
5
6<!-- CITY 컬럼이 서울로 시작하는 3글자 단어를 포함한 데이터만을 필터링 -->
7<PropertyIsLike>
8 <PropertyName>CITY</PropertyName>
9 <Literal singleChar="_">서울_</Literal>
10</PropertyIsLike>
11
12<!-- CITY 컬럼이 서로 시작해서 울로 끝나는 단어를 포함한 데이터만을 필터링 -->
13<PropertyIsLike>
14 <PropertyName>CITY</PropertyName>
15 <Literal wildCard="%">서%울</Literal>
16</PropertyIsLike>
17
18<!-- CITY 컬럼이 서울로 시작하는 3글자 단어가 개행된 데이터만을 필터링 -->
19<PropertyIsLike>
20 <PropertyName>CITY</PropertyName>
21 <Literal singleChar="_" escapeChar="-">서울_-</Literal>
22</PropertyIsLike>

  • PropertyIsNull
Name Required value
PropertyName Y 컬럼명

컬럼값이 NULL인지만 비교하므로, Literal은 필요 없는 게 특징이다.

XML

0<!-- CITY 컬럼이 NULL인 데이터만을 필터링 -->
1<PropertyIsNull>
2 <PropertyName>CITY</PropertyName>
3</PropertyIsNull>

  • PropertyIsBetween
Name Required value
PropertyName Y 컬럼명
UpperBoundary Y 최대
LowerBoundary Y 최소
Literal Y 값 (Boundary 하위)

XML

0<!-- COUNT 컬럼이 500 ~ 1000인 데이터만을 필터링 -->
1<PropertyIsBetween>
2 <PropertyName>COUNT</PropertyName>
3 <UpperBoundary>
4 <Literal>1000</Literal>
5 </UpperBoundary>
6 <LowerBoundary>
7 <Literal>500</Literal>
8 </LowerBoundary>
9</PropertyIsBetween>

Boundary 태그 안에 Literal 태그가 들어감을 주의하자.



공간 연산자 🔗

좌표, 영역 등의 공간을 기반으로 필터를 구성할 수 있다.

  • Intersects: 해당 공간에 포함되거나 걸치는 데이터
  • Disjoint: 해당 공간에 포함되지 않는 데이터
  • Contains: 해당 공간에 포함되는 데이터
  • Within: 해당 공간 내부의 데이터
  • Touches: 해당 공간에 닿는 데이터
  • Crosses: 해당 공간을 교차하는 데이터
  • Overlaps: 해당 공간에 겹쳐지는 데이터
  • Equlas: 해당 공간과 동일한 데이터

글로 보면 좀 모호할 수 있는데, 이해를 돕기 위해 아래 그림을 보자.

image

이와 같은 차이가 존재한다.

Name Required value
PropertyName Y 공간정보 컬럼명
gml Y 공간정보 XML

공간정보 XML은 이전 장에서 확인할 수 있다.

XML

0<!-- 해당 영역에 포함되거나 걸치는 데이터만을 필터링 -->
1<Intersects>
2 <PropertyName>GEOM</PropertyName>
3 <gml:Polygon srsName="EPSG:0000">
4 <gml:outerBoundaryIs>
5 <gml:LinearRing>
6 <gml:coordinates>x1,y1 x2,y2 x3,y3 x4,y4 x1,y1</gml:coordinates>
7 </gml:LinearRing>
8 </gml:outerBoundaryIs>
9 </gml:Polygon>
10</Intersects>
11
12<!-- 해당 라인을 교차하는 데이터만을 필터링 -->
13<Crosses>
14 <PropertyName>GEOM</PropertyName>
15 <gml:LineString srsName="EPSG:0000">
16 <gml:coordinates>x1,y1 x2,y2 x3,y3 x4,y4</gml:coordinates>
17 </gml:LineString>
18</Crosses>

공간 연산의 특성 상, 점 데이터는 활용 가능성이 낮다.



거리 연산자 🔗

데이터의 거리를 기반으로 필터를 구성한다.

  • DWithin: 해당 거리 이내의 데이터
  • Beyond: 해당 거리 너머의 데이터
Name Required value
PropertyName Y 공간정보 컬럼명
gml Y 공간정보 XML
Distance Y 거리

Distance의 속성으로 units를 사용할 수 있으며, 거리의 단위를 표기한다.

XML

0<!-- 해당 점과 100m 이내의 데이터만을 필터링 -->
1<DWithin>
2 <PropertyName>GEOM</PropertyName>
3 <gml:Point srsName="EPSG:0000">
4 <gml:coordinates>x,y</gml:coordinates>
5 </gml:Point>
6 <Distance units="m">100</Distance>
7</DWithin>


영역 연산자 🔗

데이터의 영역을 기반으로 필터를 구성한다.

  • BBOX: 해당 공간에 포함되거나 걸치는 데이터 (Intersects와 동일)
Name Required value
PropertyName Y 공간정보 컬럼명
Literal Y
gml Y 공간정보 XML

XML

0<!-- 해당 영역에 포함되거나 걸치는 데이터만을 필터링 -->
1<BBOX>
2 <PropertyName>GEOM</PropertyName>
3 <Literal>
4 <gml:Polygon srsName="EPSG:0000">
5 <gml:outerBoundaryIs>
6 <gml:LinearRing>
7 <gml:coordinates>x1,y1 x2,y2 x3,y3 x4,y4 x1,y1</gml:coordinates>
8 </gml:LinearRing>
9 </gml:outerBoundaryIs>
10 </gml:Polygon>
11 </Literal>
12</BBOX>

사실상 공간 연산자의 Intersects와 동일한 결과.



논리 연산자 🔗

여러 조건을 결합하여 필터를 구성한다.

  • And: 조건을 모두 충족하는 데이터
  • Or: 조건을 하나 이상 충족하는 데이터
  • Not: 조건을 충족하지 않는 데이터

XML

0<!-- 해당 영역에 포함되거나 걸치면서, AREA가 350 이하인 데이터 -->
1<And>
2 <BBOX>
3 <PropertyName>GEOM</PropertyName>
4 <Literal>
5 <gml:Polygon srsName="EPSG:0000">
6 <gml:outerBoundaryIs>
7 <gml:LinearRing>
8 <gml:coordinates>x1,y1 x2,y2 x3,y3 x4,y4 x1,y1</gml:coordinates>
9 </gml:LinearRing>
10 </gml:outerBoundaryIs>
11 </gml:Polygon>
12 </Literal>
13 </BBOX>
14
15 <PropertyIsLessThanOrEqualTo>
16 <PropertyName>AREA</PropertyName>
17 <Literal>350</Literal>
18 </PropertyIsLessThanOrEqualTo>
19</And>

논리 연산자를 적절히 중첩하여 복잡한 필터를 구성할 수 있다.




CQL Filter 🔗

OGC Filter 이외에도 CQL Filter라는 것 또한 존재한다. 잠깐 짚고 넘어가보자.

CQL Filter는 사용자에 따라 OGC Filter 보다 더 쉬울 수 있다. SQL의 형태와 매우 유사하기 때문.

CQL Filter는 요청 URL에 cql_filter 파라미터로 값을 지정하여 사용할 수 있다.


예를 들어, 아래와 같이 사용할 수 있다.

  • PropertyIsLike

XML

0<!-- CITY 컬럼이 서울이란 단어를 포함한 데이터만을 필터링 -->
1<PropertyIsLike>
2 <PropertyName>CITY</PropertyName>
3 <Literal>서울</Literal>
4</PropertyIsLike>

TXT

0CITY LIKE '%서울%'

  • Intersects

XML

0<!-- 해당 영역에 포함되거나 걸치는 데이터만을 필터링 -->
1<Intersects>
2 <PropertyName>GEOM</PropertyName>
3 <gml:Polygon srsName="EPSG:0000">
4 <gml:outerBoundaryIs>
5 <gml:LinearRing>
6 <gml:coordinates>x1,y1 x2,y2 x3,y3 x4,y4 x1,y1</gml:coordinates>
7 </gml:LinearRing>
8 </gml:outerBoundaryIs>
9 </gml:Polygon>
10</Intersects>

TXT

0INTERSECTS(GEOM, POLYGON((x1 y1, x2 y2, x3 y3, x4 y4, x1 y1)))



마치며 🔗

OGC Filter와 CQL Filter에 대해서 알아봤다.

데이터의 필터링을 구체적으로 수행할 경우, 요긴하게 사용할 것이다.


OGC, CQL Filter에 더 많은 정보가 필요하다면 각각 아래의 사이트를 확인하자.