- OpenLayers를 여행하는 개발자를 위한 안내서 - 25. WebGL로 초대용량 데이터 표시하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 24. Heat Map 표현하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 23. Cluster Map 표현하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 22. WFS Transaction으로 데이터 삭제하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 21. WFS Transaction으로 데이터 수정하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 20. WFS Transaction으로 데이터 추가하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 19. WMS에 팝업 붙이기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 18. WFS에 팝업 붙이기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 17. WFS 객체에 상호작용 추가하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 16. WMS GetImage를 사용하여 지도에 이미지 표시하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 15. WFS GetFeature를 사용하여 지도에 객체 표시하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 14. 지도에 사용자의 위치 표시하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 13. 브라우저에서 사용자 위치정보 수집하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 12. 맵의 유용한 정보 표시하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 11. VWorld 맵 만들기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 10. Open Street Map(OSM) 맵 만들기
👀 OpenLayers를 여행하는 개발자를 위한 안내서 - 9. 데이터 필터링하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 8. 공간정보 데이터를 주문하는 법. OGC
- OpenLayers를 여행하는 개발자를 위한 안내서 - 7. 공간정보 데이터를 관리하는 법. GeoServer
- OpenLayers를 여행하는 개발자를 위한 안내서 - 6. 공간정보의 DB화
- OpenLayers를 여행하는 개발자를 위한 안내서 - 5. OpenLayers
- OpenLayers를 여행하는 개발자를 위한 안내서 - 4. QGIS 체험하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 3. 좌표계
- OpenLayers를 여행하는 개발자를 위한 안내서 - 2. GIS랑 인사하기
- OpenLayers를 여행하는 개발자를 위한 안내서 - 1. 머릿말
Table of Contents
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
: 해당 공간과 동일한 데이터
글로 보면 좀 모호할 수 있는데, 이해를 돕기 위해 아래 그림을 보자.
이와 같은 차이가 존재한다.
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
TXT
0 | CITY LIKE '%서울%' |
이를 OGC로 표현하면 아래와 같다.
XML
0 | <!-- CITY 컬럼이 서울이란 단어를 포함한 데이터만을 필터링 --> |
1 | <PropertyIsLike> |
2 | <PropertyName>CITY</PropertyName> |
3 | <Literal>서울</Literal> |
4 | </PropertyIsLike> |
Intersects
TXT
0 | INTERSECTS(GEOM, POLYGON((x1 y1, x2 y2, x3 y3, x4 y4, x1 y1))) |
이를 OGC로 표현하면 아래와 같다.
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> |
이 처럼 필터가 단순해지기 때문에, URL 필터링 시 활용하기 훨씬 용이하다.
마치며 🔗
OGC Filter와 CQL Filter에 대해서 알아봤다.
데이터의 필터링을 구체적으로 수행할 경우, 요긴하게 사용할 것이다.
- OGC: XML 형태의 필터. WFS Transaction 등, XML 기반 데이터의 필터링에 용이하다.
- CQL: 텍스트 형태의 필터. WFS, WMS API와 같이 URL에 적용하기 편하다.
OGC, CQL Filter에 더 많은 정보가 필요하다면 각각 아래의 사이트를 확인하자.
📆 작성일
2022-03-14 Mon 16:11:19
📚 카테고리
🏷️ 태그