0.

ModelBuilder를 통한 공간조인 및 속성조인의 활용에 대해 다룬다.

공간정보를 다루다보면 여러가지 형태의 조인을 자주 활용하게된다. ArcGIS를 사용한다면 조인 자체는 간단하게 수행할 수 있지만, 작업한 여러 형태의 데이터를 추출하고 정리하는 것은 귀찮은 작업이다. 이때 ModelBuilder를 활용하는 방법이다. 본인은 국공유지 중 무단으로 점거된 필지를 추출하는 작업을 수행해봤고, 이때 활용한 ModelBuilder를 통해, 공간조인 및 속성조인을 다뤄보려고 한다.



1. 시나리오

주어진 데이터는 다음과 같다. 

Parcel : 연속지적도를 기반으로 생성된, 필지 단위의 데이터.

Object : 건물, 컨테이너박스 등의 시설물객체. 


목표는 위치정보만을 활용할 수 있는 레이어들이 주어졌을 때, 공간조인을 통해 관계를 추출하는 것이다. 즉, 각각 parcel 위에 존재하는 object에 대한 레이어, object가 올라가있는 parcel의 레이어를 추출하는 것을 최종목표로 한다.

ArcGIS는 공간조인을 위해 Spatial Join, Select by location 등(실질적으로 같은 작업의 다른 이름이다)의 기능을 제공한다. 공간조인을 통해 중첩되는 object과 parcel에 대한 정보를 추출하고, 추출한 정보와 기존의 각 object, parcel 레이어들을에 대해 속성정보 기반의 테이블 조인을 수행해 필요한 레이어를 생성한다. 실질적인 작업은 다음과 같은 순서로 이루어질 것이다.

  1.  공간조인 기능을 활용해 parcel 위에 존재하는 object들을 추출한다.
  2.  추출한 I를 기반으로, object가 존재하는 parcel을 추출한다.


2. ModelBuilder

전체 과정을 모델빌더로 작성하면 다음과 같다. 특히, 1번을 통해 I을 수행하고, 2번을 통해 II를 수행한다.

2.1 Spatial Join

"Spatial Join"이라는 공간조인 툴을 활용해 object와 parcel의 위치관계 정보를 추출했다. 

"Spatial Join"를 사용하기 위해서 다양한 입력변수 및 option을 입력해야된다. ArcGIS 기본적으로 입력해야되는 각 항목들에 대해 친절하게 설명을 해주기에 그때그때 읽어보면서 사용하면되고, 어떤 상황에서 필요한 툴이 무엇인지 아는 것이 중요하다. 고로 이러한 문제가 해결하기 위해 "Spatial Join"을 활용한다는 것만 확실히 기억하도록하면 된다. 여기서는 필수적인 항목인 Target Features, Join Features, Matching option에 대해서만 간략하게 언급하고 넘어가겠다.

Match option은 공간조인을 하는 방법을 선택하는 옵션으로 경우 굉장히 다양하다. "intersect", "closest", "HAVE_THEIR_CENTER_IN", "within", contains" .... 등. 여기서 설명하기에는 너무 방대하고, ArcGIS는 간단한 설명을 함께 제공해주니 이를 읽어보고 목적에 부합하는 것을 사용하는 것이 가장 좋다. 본 작업에서는 데이터의 특성(간략하게, parcel의 형태가 장방형인 것들이 다수 존재하고, object 데이터가 불완전했기 때문에 엄밀한 기준의 매칭을 할 필요가 있었다)으로 인해 object의 중심점이 parcel 내부에 위치하는 경우에 대해서 공간조인을 수행하는 "HAVE_THEIR_CENTER_IN"를 선택했다. 

Target Features와 Join Features는 각각 공간조인을 수행할 때 결과로 추출되는 레이어, 기준이 되는 레이어를 뜻한다. 공간조인의 목적과 Match option에 따라 올바른 선택을 해야한다. Target과 Join이 바뀔 경우 같은 공간조인에 대해 주체가 object냐 혹은 parcel이냐에 대한 문제가 아닌 상이한 결과가 추출된다. 거꾸로 한 경우, 중심점이 object 내에 존재하는 parcel이 추출될 것이다! 얼마나 다른 결과일지 상상해보라.

* 참고로 "Select by location" 이라는 툴도 비슷한 역할을 수행한다. 툴을 열어보면 입력 항목 및 옵션 등이 "Spatial Join"과 완전히 동일한 것을 알 수 있다. 차이점은 "Spatial Join"은 공간조인 후, 새로운 레이어로 결과를 추출해 주는 반면에, "Select by location"은 물론 동일한 결과에 대해, 각 항목들을 select만 한 채로 작업을 마무리 한다. 본 모델에서는 'parcel 위에 존재하는 object에 대한 레이어'를 한번에 추출하기위해 "Spatial Join"을 사용했다.

"Spatial Join"에 object를 Target Features, parcel을 Join Features로 연결한다. Match option은 "HAVE_THEIR_CENTER_IN"을 선택했다. 결과는 object_SpatialJoin.shp로 추출되고 다음과 같다. parcel 위에 존재하는 object들만 선택이 된 것을 확인할 수 있다.


2.2 Join

"Add Join" 툴을 기반으로, 생성한 object_SpatialJoin 레이어와 속성정보를 통한 조인을 활용하여 object가 위에 존재하는 parcel을 추출한다. 

object_SpatialJoin에는 연관된 object와 parcel의 필드가 모두 존재하기 때문에 이를 활용해 parcel과 테이블 조인을 수행했다. 필드 기반의 Join을 위해서는 각각 특징이 있는 여러 Tool이 존재하지만 본 작업에서는 "Add Join"을 활용했다. "Add Join"은 ArcGIS를 활용할 때 가장 기본적으로 사용하는 Join 툴이다. 레이어나 테이블에 마우스 우클릭을 통해 Join/Relate를 선택해 수행하는 방법이 "Add Join"에 대응된다. 입력 및 동작이 이와 같기 때문에 따로 설명은 하지 않겠다

*혹은 "Join Field"라는 툴을 사용할 수도 있다. 차이점을 살펴보면, "Add Join"의 경우 테이블을 조인한 상태로 작업을 끝내지만, "Join Field"의 경우 조인 후, 입력 테이블 혹은 레이어에 테이블조인한 레이어나 테이블의 필드를 복사해서 가져온 뒤, join을 제거하는 것까지의 작업을 수행한다. 기존의 데이터에 특정 값을 추가하는 등의 특정 목적의 작업수행에서는 하나의 툴로 깔끔한 결과를 얻을 수 있지만, 작업속도가 상대적으로 많이 느려진다. 본 작업에서는 'object가 올라가있는 parcel의 레이어를 추출', 즉, 기존 레이어에 값을 추가하는 것이 아닌 새로운 레이어를 생성하는 것이 목적이기 때문에 "Add Join"을 활용했다.

이후의 과정은 조인한 테이블을 바탕으로 새로운 레이어를 추출하는 것에 대한 내용이다.

"Copy Feature" 툴을 통해, "Add Join"을 통해 얻은 object가 올라가있는 parcel에 대한 데이터 복사하여 새로운 레이어로써 추출했다. 이를 위해 약간 팬시한 트릭을 사용했다. "Spatial Join"과 "Add Join"의 과정에서 모두 'Keep All Target Features' 항목을 off 해 두었다. 이를 통해 "Copy Features"까지의 flow를 보면 추출되거나 조인된 항목만을 전달하고 있다. 즉, parcel(3)에는 object_SpatialJoin과 조인된 parcel들만 존재한다. 그렇기 때문에 조인된 항목을 select 후 "copy feature"를 사용할 필요 없이, 바로 결과를 추출할 수 있다.

마지막으로 "Remove Join" 툴을 이용해 레이어간의 조인을 제거했다. 큰 문제는 아니지만, "Remove Join"을 수행하지 않는다면 parcel 데이터가 object_SpatialJoin과 조인된 parcel들만 존재하는 parcel(3)의 형태로 유지되게 된다. 즉,  parcel과 parcel_CopyFeatures가 같은 형태로 출력된다. 직관적이지 않은 형태이므로, 모델빌더 내에서 처리하기 위해서 "Remove Join"을 수행해 Join을 없앰으로써 parcel 데이터를 기존의 형태와 같게 만든 후 출력하도록 한다. parcel_CopyFeatures를 'precondition'으로(모델빌더의 점선의 화살표 형태) Remove Join에 연결해주어 parcel_CopyFeatures이 추출되기전에 Join이 해제되지 않도록 한다.

1. "Add Join"의 Layer Name or Table View에 parcel data를, Join Table에 object_SpatialJoin를 입력한뒤, 조인을 위한 공통필드를 선택한다. 2. "Copy Feature"를 통해 object_SpatialJoin와 조인된 parcel 데이터(즉, 우리의 목표)를 복사하여 parcel_CopyFeatures.shp 파일로 저장한다. 3. "Remove Join"을 통해 Join을 해제한다.

결과는 위와 같다. object들이 존재하는 parcel들이 추출된 것을 확인할 수 있다.


3.

설명을 위해 중간 과정의 파일을을 모두 보여주었지만, 위와 같은 모델빌더를 실행시키면 과정이 한번에 실행되고, 'object_SpatialJoin.shp', 'parcel_CopyFeatures.shp' 두개의 파일들이 지정된 장소에 생성되어 있다.

분리되어 관리되는 지역들에 대해 반복적인 공간조인 작업을 수행해야 할 때, 공간조인하는 과정에서의 파일을 모두 저장해서 관리해야될때, 나의 작업 상황을 동료에게 공유해야 될 때 이와 같은 모델빌더를 작업해서 활용하면 편리하다. 

반응형

+ Recent posts