이제 파이썬 콘솔에서 실행했던 Moran’s I Statistic 코드를 플러그인에 합쳐보자.
통합작업을 편리하게 하기 위해 qgis의 plugin 폴더를 PyCharm에 불러오는 것이 좋다.
PyCharm의 File - Open Directory 메뉴를 선택하자.
QGIS 플러그인의 메인 폴더인 C:\Users\<사용자>\.qgis2\python\plugins 폴더를 선택하고 [OK]를 누르자.
프로젝트를 여는 방법에서 Open in current window 옵션을 선택하고, Add to currently opened projects 옵션을 꼭 선택 후 [OK]를 누르자.
그러면 QGIS의 플러그인들을 PyCharm에서 수정할 수 있게 된다.
이제 우리가 만들고 있는 MoranTest 플러그인의 메인 코드를 담고 있는 MoranTest/morantest.py Project 트리에서 찾아 파일을 더블클릭하여 편집기에서 열어주자.
morantest.py 파일의 제일 하단에 보면 run(self) 함수가 있는데 이 함수가 주 실행 대상이다.
이 함수의 가장 마지막에 있는 pass 부분을 실행할 코드로 대체해 주면 되는 것이다.
이전에 코딩해 두었던 global_morans_i.py 파일에서 import 하는 부분 이후의 코드들을 복사해 와서 pass 라는 코드가 있던 부분에 붙여 넣는다. 이 때 파이썬의 언어적 특성상 반드시 들여쓰기가 pass 가 있던 코드와 일치해야 한다.
들여쓰기를 하고 싶은 부분을 선택하고 [Tab]키를 누르면 한 단계 들여쓰기를 할 수 있다. 반대로 [Shift-Tab]을 누르면 한 단계 내어쓰기를 할 수 있다.
다음 단계로 넘어가기 전에 설명을 쉼게 따라하기 위해 한 가지 설정을 변경하자.
소스의 줄번호가 보일 수 있도록 설정을 변경하기 위해 File - Settingds 메뉴를 선택하자.
Settings 창의 검색 부분에 line number라는 검색어를 넣으면 이와 관련된 항목을 찾을 수 있는데, 이 중 Editor 아래의 Apprearance 부분을 선택하고 우측에서 Show Line numbers를 체크하자. 이제 모든 소스코드에서 줄번호를 볼 수 있다.
이제 소스를 통합하는 작업을 해야 하는데 소스 편집기 부분에 보면, 스크롤바에 붉은 색으로 표시된 부분들이 보인다. 이 부분들을 없에면 되는 것이다.
먼저 93행의 오류를 잡아보자. iface 부분에 오류가 있고 iface라는 기호를 해석할 수 없다는 경고가 있다. 이전에 설명한데로 iface 라는 객체는 QGIS 파이썬 콘솔에서만 사용할 수 있는 기호이므로 플러그인에서는 플러그인 실행시 객체 생성자의 인자로 받아 저장해둔 self.iface를 대신 사용하면 된다.
아래 그림과 같이 iface 앞에 self. 을 추가해 주면 붉은색 오류 마크가 사라진다.
나머지 iface가 있는 부분도 동일하게 오류를 극복할 수 있다.
다음 오류를 살펴보니 128행에 np라는 객체를 인식하지 못하는 문제가 있다. 이 것은 NumPy 라이브러리인데 import 부분이 빠져서 인식을 못하는 것이다.
수정을 위해 31행으로 가서 import numpy as np 라는 코드를 추가하면 해결된다.
다음은 164행에서 W라는 객체를 인식하지 못하는 문제가 있다.
다음 그림과 같이 pysal에서 W와 Moran 클래스를 가져와 해결하자.
다음은 188행에 plt 객체를 인식하지 못하는 문제가 있다.
matplotlib에서 pyplot 클래스를 plt 라는 이름으로 가져오자.
이제 붉은 색은 없어졌다. 실행해 보자.
아래 그림처럼 Moran’s I Statistic 플러그인을 껏다 켜서 다시 로드해 주자.
그리고 실행하면 이전에 만든 대화상자가 나오는데 그냥 [확인] 누르자.
예상과는 달리 오류가 나온다. 이 오류는 필자도 짐작하지 못한 오류인데 Moran 라이브러리에서 통계량 산출 중 이웃 관계가 없는(island) 지역이 있다는 경고를 print 하는 중 파일에 대한 정의가 잘못되었다는 것인데, PySAL의 오류인 듯 하다.
조금 당황스럽기는 하지만 극복해 보자.
149행의 Weight를 계산하는 루프 앞에 y 값을 기억할 수 있는 변수를 만드는 코드를 삽입하고 for 문의 인자에 i 라는 변수를 추가하고 이 변수가 몇 번째 자료임을 나타낼 수 있게 range(len(dataList)) 코드를 다음 그림을 참조해 추가하자.
그리고 116행에 yList 어레이에 거리 내에 들어오는 데이터를 추가하는 코드를 넣자.
172 행에서 yList를 np.array로 변환해 y 변수에 넣는 코드를 추가하자.
이제 플러그인을 다시 로드 후 실행하면 드디어 아래 그림처럼 플러그인 메뉴를 통해 Moran’s I Statistic을 수행할 수 있다. 이 단계에서도 혹시 오류가 발행한다면, QGIS에 ‘인구분포’ 벡터 레이어가 불러와져 있고 현재 레이어로 선택되어 있는 상태인지 확인해 주길 부탁드린다.