QGISでPandasとGeoPandasを使えるようにする

#はじめに
Pandas(GeoPandas)は便利ですね。
しかしQGISのPythonコンソールからは使えないので使えるようにします。
~~本当はGeoPandasを入れようとしたのですが、ちょっと解決困難な問題が発生したのでまずはPandasで我慢する。~~

参考にしたサイトはこちら（というか殆どそのまま）
https://umar-yusuf.blogspot.com/2018/12/install-third-party-python-modules-in.html

#モジュールの追加
##環境確認
今回はWindows7にQGIS3.4の環境で行ってます。
まずは動作環境を確認します。

QGISを立ち上げて、Pythonコンソールを開きましょう。

そしたら以下のコマンドを投げてPandasを読み込めるかどうか試します。

```
>>> import pandas
Traceback (most recent call last):
  File "C:\PROGRA~1\QGIS3~1.4\apps\Python37\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "C:/PROGRA~1/QGIS3~1.4/apps/qgis-ltr/./python\qgis\utils.py", line 672, in _import
    mod = _builtin_import(name, globals, locals, fromlist, level)
ModuleNotFoundError: No module named 'pandas'
```

はい、モジュールがないよってエラーがでましたね。
出なかったら既に使えるようになっていますので以下の手順は不要です。

次にPythonコンソールが使用しているPythonのバージョンを確認します。
以下のようなコマンドを流してください。

```
>>> import sys
>>> sys.version
'3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)]'
```

Pythonの3.7.0が使われていることが判りました。

では次にスタートメニューからQGISのフォルダ内にある`OSGeo4W Shell`を管理者として実行します。
Windows10の場合はコンテキストメニューの[その他]-「ファイルの場所を開く」してからファイルを選んで管理者として実行ですね。
管理者で実行しないとこの後のインストールでパーミッションが無いって怒られますので注意。

![Shell起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240181/3b77943d-fbb3-adbd-19ec-4aa484371771.png)

OSGeo4W Shellが開いたら`python -V`を投げましょう

```
C:\Windows\System32>python -V
Python 2.7.14
```

こちらのPythonは2.7.14が参照されていますね。

##pipのインストール
モジュールの追加にはpipをつかいます。
先ほど開いたOSGeo4W Shellを使ってpipをインストールしましょう。
インストールコマンドは`python -m ensurepip --default-pip`です。

```
C:\Windows\System32>python -m ensurepip --default-pip
Collecting setuptools
Requirement already satisfied: pip in c:\progra~1\qgis3~1.4\apps\python27\lib\site-packages
Installing collected packages: setuptools
Successfully installed setuptools-28.8.0
```
問題なく入りました。
（私の環境にはpipは入ってたようですね）
最新版でないと怒られることがありますのでアップデートも流しておきます。

```
C:\Windows\System32>python -m pip install --upgrade pip setuptools
Collecting pip
  Downloading https://files.pythonhosted.org/packages/5c/e0/be401c003291b56efc55aeba6a80ab790d3d4cece2778288d65323009420/pip-19.1.1-py2.py3-none-any.whl (1.4MB)
    100% |################################| 1.4MB 1.6MB/s
Collecting setuptools
  Downloading https://files.pythonhosted.org/packages/ec/51/f45cea425fd5cb0b0380f5b0f048ebc1da5b417e48d304838c02d6288a1e/setuptools-41.0.1-py2.py3-none-any.whl (575kB)
    100% |################################| 583kB 2.1MB/s
Installing collected packages: pip, setuptools
  Found existing installation: pip 19.0.3
    Uninstalling pip-19.0.3:
      Successfully uninstalled pip-19.0.3
  Found existing installation: setuptools 28.8.0
    Uninstalling setuptools-28.8.0:
      Successfully uninstalled setuptools-28.8.0
Successfully installed pip-19.1.1 setuptools-41.0.1
```

##Pythonバージョンの切り替え
OSGeo4W ShellのPythonバージョンが2系でしたので3系に切り替えます。
3系だったら不要だと思います。
OSGeo4W Shellで`py3_env`を投げます。
自動的にいくつかSETコマンドが流れます。

```
C:\Windows\System32>py3_env

C:\Windows\System32>SET PYTHONPATH=

C:\Windows\System32>SET PYTHONHOME=C:\PROGRA~1\QGIS3~1.4\apps\Python37

C:\Windows\System32>PATH C:\PROGRA~1\QGIS3~1.4\apps\Python37;C:\PROGRA~1\QGIS3~1.4\apps\Python37\Scripts;C:\PROGRA~1\QGIS3~1.4\apps\Python27\Scripts;C:\PROGRA~1\QGIS3~1.4\bin;C:\windows\system32;C:\windows;C:\windows\system32\WBem
```

変わったことを確認しましょう。

```
C:\Windows\System32>python -V
Python 3.7.0
```

Pythonコンソールと同じバージョンに変わりました。

##Pandasモジュールの追加
pipを使ってPandasを追加しましょう。
OSGeo4W Shellで`python -m pip install pandas`と投げます。

```
C:\Windows\System32>python -m pip install pandas
Collecting pandas
  Downloading https://files.pythonhosted.org/packages/61/c7/f943fceb712579bc538700e2c157dc4972e16abfe29bd4969149bad98c74/pandas-0.24.2-cp37-cp37m-win_amd64.whl (9.0MB)
    100% |████████████████████████████████| 9.0MB 24kB/s
Requirement already satisfied: python-dateutil>=2.5.0 in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from pandas) (2.7.5)
Requirement already satisfied: numpy>=1.12.0 in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from pandas) (1.16.3)
Requirement already satisfied: pytz>=2011k in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from pandas) (2018.7)
Requirement already satisfied: six>=1.5 in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from python-dateutil>=2.5.0->pandas) (1.12.0)
Installing collected packages: pandas
Successfully installed pandas-0.24.2
```

成功しました。

##動作確認

では確認してみましょう。
QGISを再起動してから再度Pythonコンソールを開きます。
そしたら先ほどエラーが出た`import pandas`を実行してみます。
エラーなくインポートできましたので適当なエクセルファイルでも読み込んでみましょう。

```
>>> import pandas
>>> pandas.read_excel('c:/work/test.xlsx')
          a         b         c
0  50351610  12.25218 -10.13777
1  50351611  12.25274 -10.14224
2  50351612  12.24903 -10.14193
```
![エビデンス_Pythonコンソール](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240181/6f405184-d6ea-c4d9-acd7-51eee3c871ed.png)

読み込めました。

#GeoPandasに挑戦
OSGeo4W Shellで`python -m pip install geopandas`と投げます。

```
C:\Windows\System32>python -m pip install geopandas
Collecting geopandas
  Downloading https://files.pythonhosted.org/packages/74/42/f4b147fc7920998a42046d0c2e65e61000bc5d104f1f8aec719612cb2fc8/geopandas-0.5.0-py2.py3-none-any.whl (893kB)
    100% |████████████████████████████████| 901kB 6.5MB/s
Requirement already satisfied: pyproj in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from geopandas) (1.9.6)
Requirement already satisfied: shapely in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from geopandas) (1.6.4.post2)
Requirement already satisfied: pandas in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from geopandas) (0.24.2)
Collecting fiona (from geopandas)
  Downloading https://files.pythonhosted.org/packages/41/9d/63696e7b1de42aad294d4781199a408bec593d8fdb80a2b4a788c911a33b/Fiona-1.8.6.tar.gz (1.7MB)
    100% |████████████████████████████████| 1.7MB 3.1MB/s
    Complete output from command python setup.py egg_info:
    A GDAL API version must be specified. Provide a path to gdal-config using a GDAL_CONFIG environment variable or use a GDAL_VERSION environment variable.

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\Users\hoge\AppData\Local\Temp\pip-install-p0dr78y4\fiona\
```

おっと、エラーがでましたね。
fionaというライブラリがgdal-configへのパスが指定されていないと怒っているようです。

~~同じ問題に困っている人は見つかりますが、簡単には解決しなそうなので一旦あきらめます。~~

こちらを参考にやってみたら成功しました。
https://gis.stackexchange.com/questions/82200/how-to-install-fiona-to-read-shapefile-attributes-with-osgeo4w/82206

まずはPythonコンソールからGDALのバージョンを調べます。

```
>>> import osgeo
>>> osgeo.gdal.VersionInfo("RELEASE_NAME")
'2.3.2'
```

環境変数に変数`GDAL_VERSION`で値`2.3.2`を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240181/a227c852-b3ea-0eb8-fddc-954e3412bdcc.png)
設定ができたら念のため再起動しておきましょう。

以下のURLからFiona‑1.8.6‑cp37‑cp37m‑win_amd64.whlをダウンロードする。
（バージョンはさておきcp37‑cp37m‑winだとインストールできた。ここはよくわからん。）
https://www.lfd.uci.edu/~gohlke/pythonlibs/#fiona

ダウンロードファイルを適当な場所に移動したら
OSGeo4W Shellでインストールを実行

```
C:\Windows\System32>python -m pip install c:/work/Fiona-1.8.6-cp37-cp37m-win_amd64.whl
Processing c:/work/fiona-1.8.6-cp37-cp37m-win_amd64.whl
Collecting click>=4.0 (from Fiona==1.8.6)
  Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
     |████████████████████████████████| 81kB 2.6MB/s
Collecting munch (from Fiona==1.8.6)
  Downloading https://files.pythonhosted.org/packages/68/f4/260ec98ea840757a0da09e0ed8135333d59b8dfebe9752a365b04857660a/munch-2.3.2.tar.gz
Collecting click-plugins>=1.0 (from Fiona==1.8.6)
  Downloading https://files.pythonhosted.org/packages/e9/da/824b92d9942f4e472702488857914bdd50f73021efea15b4cad9aca8ecef/click_plugins-1.1.1-py2.py3-none-any.wh
l
Collecting cligj>=0.5 (from Fiona==1.8.6)
  Downloading https://files.pythonhosted.org/packages/e4/be/30a58b4b0733850280d01f8bd132591b4668ed5c7046761098d665ac2174/cligj-0.5.0-py3-none-any.whl
Collecting attrs>=17 (from Fiona==1.8.6)
  Downloading https://files.pythonhosted.org/packages/23/96/d828354fa2dbdf216eaa7b7de0db692f12c234f7ef888cc14980ef40d1d2/attrs-19.1.0-py2.py3-none-any.whl
Requirement already satisfied: six>=1.7 in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from Fiona==1.8.6) (1.12.0)
Installing collected packages: click, munch, click-plugins, cligj, attrs, Fiona
  Running setup.py install for munch ... done
Successfully installed Fiona-1.8.6 attrs-19.1.0 click-7.0 click-plugins-1.1.1 cligj-0.5.0 munch-2.3.2
```

先ほど失敗したfionaがインストールできましたのでもう一度GeoPandasを追加してみましょう。

```
C:\Windows\System32>python -m pip install geopandas
Collecting geopandas
  Using cached https://files.pythonhosted.org/packages/74/42/f4b147fc7920998a42046d0c2e65e61000bc5d104f1f8aec719612cb2fc8/geopandas-0.5.0-py2.py3-none-any.whl
Collecting pyproj (from geopandas)
  Using cached https://files.pythonhosted.org/packages/ce/36/2d8f1fe6bf32eebc0e880d9f27b394b97dd5119303986de691d7e91e1a51/pyproj-2.2.1-cp37-cp37m-win_amd64.whl
Requirement already satisfied: fiona in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from geopandas) (1.8.6)
Collecting shapely (from geopandas)
  Using cached https://files.pythonhosted.org/packages/a2/fb/7a7af9ef7a35d16fa23b127abee272cfc483ca89029b73e92e93cdf36e6b/Shapely-1.6.4.post2.tar.gz
Requirement already satisfied: pandas in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from geopandas) (0.24.2)
Requirement already satisfied: click>=4.0 in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from fiona->geopandas) (7.0)
Requirement already satisfied: attrs>=17 in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from fiona->geopandas) (19.1.0)
Requirement already satisfied: cligj>=0.5 in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from fiona->geopandas) (0.5.0)
Requirement already satisfied: six>=1.7 in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from fiona->geopandas) (1.12.0)
Requirement already satisfied: munch in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from fiona->geopandas) (2.3.2)
Requirement already satisfied: click-plugins>=1.0 in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from fiona->geopandas) (1.1.1)
Requirement already satisfied: numpy>=1.12.0 in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from pandas->geopandas) (1.15.4)
Requirement already satisfied: pytz>=2011k in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from pandas->geopandas) (2018.7)
Requirement already satisfied: python-dateutil>=2.5.0 in c:\progra~1\qgis3~1.4\apps\python37\lib\site-packages (from pandas->geopandas) (2.7.5)
Installing collected packages: pyproj, shapely, geopandas
  Running setup.py install for shapely ... done
Successfully installed geopandas-0.5.0 pyproj-2.2.1 shapely-1.6.4.post2
```

今度は成功したようです。

##動作確認
QGISを再起動してからPythonコンソールを開きます。
`import geopandas`を実行してみます。
エラーなくインポートできましたので適当なシェープファイルでも読み込んでみましょう。

```
>>> import geopandas
>>> geopandas.read_file('c:/work/test_pl.shp')
           gid                                            geometry
0      1845193   LINESTRING (-34287.477 -89755.997, -34283.604 ...
1      1847175   LINESTRING (-30711.356 -90881.484, -30712.981 ...
2      1847176   LINESTRING (-33770.897 -91487.429, -33769.417 ...
3      1847177   LINESTRING (-34019.315 -87829.27899999999, -34...
・
・省略
・
13548  1661930   LINESTRING (-32960.024 -87385.46400000001, -32...
13549  1661931   LINESTRING (-36652.435 -88311.53999999999, -36...
13550  1661932   LINESTRING (-33645.849 -89185.613, -33619.816 ...

[13551 rows x 5 columns]
```

成功ですね。

#さいごに
今回はPandasを対象としましたが、もちろん他のモジュール追加も可能です。
~~（GeoPandasは失敗しましたけど）~~

そして、これでプラグインからもPandasが使えるようになります。
個人的にはQGISプラグインなどで演算パフォーマンスが必要な場合に馬鹿にならない効果があるんじゃないかと思います。

ただし、使えるようにするには上記のような手順が必要になってしまうので、公開プラグインには向かないですね。
何かいい方法があれば教えてもらえたら嬉しいです。


# 本記事のライセンス
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/">![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by/4.0/88x31.png)</a>
この記事は <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">クリエイティブ・コモンズ 表示 4.0 国際 ライセンス</a>の下に提供されています。