【脱GIS】（Pythonとかで）地理空間情報、位置情報を扱うための情報まとめ【随時更新】

__注__

継続的にいいねもらっているのですが、知識が浅い頃に書いたので、不正確なところがあります。今度直します。

---

__私のGIS、重すぎ__

GIS使っていますか？
GISで利用するデータが多くなればなるほど、やりたい処理が増えれば増えるほどこう思うはずです。

地理情報くらいコードで扱わせろやとおもうあなたのためにあるいは地理空間情報入門者のためにまとめてみました。

## そもそも地理空間情報、位置情報とは

地理空間に紐付いた情報。ある点や線、面、空間が地球上のどこに位置するかを表す情報を含む情報です。地球は歪な楕円であるためさまざまな手法があります。測量は真面目にやるとすごく複雑になるので軽く触れるだけですが（私も理解しきれていないし）

* 経度、緯度、高度（省略されることも）を持つもの
* 地球上の限られた範囲を無理やり直行座標とみなし、その平面内の位置を表したもの

などのパターンがあります。どの方法で座標を表しているか、という情報も一緒に持ちます。

位置情報は（そもそも地理空間情報と同列に扱うものではありませんが）、地理空間情報の一種で、端末が存在している点を表す情報です。

## 主なデータ形式

地理情報で扱う主なファイル形式をおさらいしておきましょう。

### .shp（シェープファイル）とその仲間たち

GIS間共通のファイル形式です。基本的には地理情報を持った点とその接続である線分、線分によって閉じられた多角形で構成されます。各点、線分、多角形に地理情報以外の情報を付与できます。Esri製。

ちなみに、複数の拡張子のファイルを同一ディレクトリにまとめて置かないと機能しません。それぞれのファイルが別の情報を持っています。

### .gml

Geography Markup Language.  地理情報に対応したxml。ISO規格。XMLとしても扱えます。日本の主要な地理データは概ねshpかgmlで提供されています。

### .geojson(.json)

最近出てきた規格で、簡単に言えば地理情報を含むJsonです。地理空間情報専用に決められた鍵を持ったJsonなので、Jsonとしてもよむことができるっぽいです。

GitHubがgeojsonに対応していると聞いてまじかよと思ってgeojsonファイルを開いたら、

![Screenshot from 2017-10-26 00-28-14.png](https://qiita-image-store.s3.amazonaws.com/0/140543/72f896fd-98fe-39d4-1f84-17d717547d3e.png)

本当に対応していました。（ただし量が多すぎすべては表示できていません）

#### geodatabase format

[ArcGISと各種sql database間でデータ共有を行うフォーマット](http://desktop.arcgis.com/ja/arcmap/10.3/manage-data/geodatabases/what-is-a-geodatabase.htm)です。詳細はリンクを。

### その他のデータ形式

#### sql

大量のデータを管理しようと思うとやはりsqlはよくある手段です。経度とか緯度とか必要な情報を持てば良いのでやはり扱いやすいです。

余談ですが、地理情報を主に扱うデータベースはいくつかあるようですが、あんまりメジャーなものはありません。今のご時世だとJsonを保存できる系のデータベースなら何でも行けるかも。

#### csv

当然csvでも管理可能です。shellとの相性が良いので取り回しがよいです。

#### その他一般的なデータ形式

地理情報との連携さえとれればよいため、大概のデータ形式は利用できます。

shellで扱えるととてもうれしいです。

### 地理情報を扱うと出くわす嫌な規格たち

#### .xls,.xlsx

言わずもがな、エクセルです。こいつらが嫌われるのはエクセルという形式のせいだけではありません。こいつらは、画面上に表示するのが前提のため、

* 不要な空行
* 違うデータが一枚のシートにまとまっている。
* カラム名が複数行に渡る

などなど、機械で読めないようなさまざまな工夫がなされているのです。しかも整形の方針が資料によって異なるため、手を加えることが必須。こんなものを提供している日本ってどうなの？

しかしこれもまだかわいい方。日本が提供している統計情報にはさらに悪い形式があります。

#### .pdf

何を言っているかわからねぇと思うが俺も何を言っているかわからねぇ。統計をpdf化して出してくるのはやめてくださいお願いします。

#### 紙

データ形式ですらないけどpdfと並んで面倒なのがこれ。古いものは仕方ないけど新しい物を紙のみってのはちょっとどうかと……

## 地理情報を扱うソフトウェア（GIS紹介）

Pythonライブラリのみ後述

### ESRI ArcGIS

地理情報を扱うソフトウェアの本家本元。最近は３D表示に対応しました。値段が高い。とても高い。年10万円を超えてきます。地理情報系の大学学科だと大学が契約していることも多いけれど、大学生にあの高機能は使いこなせないので多分無駄金。様々なエクステンションがあり、非常に多機能。

レイヤー表示をコンピュータ上で実現したことで一躍有名になりました。ArcGIS以前は、トレス紙（裏が透ける薄い紙）を重ねて表現していたので、すごい進歩です。

LinuxどころかMacOSに対応していません。

### QGISとかGRASSとかさまざまなGIS Clone

ArcGISを真似て、あるいは別の事情から作られたソフトウェアたち。QGISやGRASSGISはオープンソースで開発が進められています。

### Google Map, Google Earth

地理情報解析というほどではないけれど一応言及します。

各種情報をあのレベルで誰にでも簡単に扱えるようにするのはすごいことです。

## WEBサービス

最近流行のwebサービスたちです。高価です。

### Carto

使っているのを見ただけなのですが、データを可視化できるサービスです。綺麗でした。

個人レベルでは、分析に使うほどではなさそうなのが残念。企業レベルになるとサーバー上でデータ分析できるみたいです。

### Open Street Map

ソフトウェアってか地図ですがこの項で紹介しておきます。

誰でも使えるフリーの地図を作るプロジェクトです。（気づいていない人もいるけれど）Google Mapを始め地図は一般に利用に制限がかかることが多く、気軽に利用できません。機密情報にもなりうるし。作るのお金かかるし。

それをフリーでやっちまおうぜ、というのがOSMプロジェクトです。CC-BY-SA 3.0らしい。後述のPythonライブラリOSMnxを始め様々な場面で利用されます。（先ほどのGithubの写真のベースマップもよく見るとOSM。

## Pythonのライブラリ軍団

やっと本題に入ります。長かった。今年（2017）のPycon JPの発表で、geopandas, osmnx, foliumの３つだけは必ず覚えて帰ってくださいと言われたのでまずはこの３つを紹介します。さっくりと触りだけなので詳しくはドキュメントを読んでください。

### geopandas

pandasの拡張みたいなライブラリです。pandas DataFrame, Seriesに地理情報を付加した、geopandas GeoDataFrame, GeoSeriesという型を使うのが主な機能です。使い方も割とpandasと一緒で簡単）

```py3
import geopandas as gpd
import matplotlib.pyplot as plt
%matplotlib inline

gdf = gpd.read_file('./geo_tags.geojson') # これで読み込み
gdf.plot() # matplotlibでplot
# 使用したデータの都合でplot画像は省略
```

（めっちゃ重い。issueがcythonだらけ。……まだまだ発展途上みたいです）

### osmnx

先述のOpen Street MapからShapeファイルをはじめとした地理空間データを作成するためのライブラリ。

簡単な使い方は以下。

```py3
import osmnx as ox
import matplotlib.pyplot as plt
%matplotlib inline

shinjuku = ox.gdf_from_place('Shinjuku')
shinjuku.plot()
```

![Screenshot from 2017-10-26 02-28-54.png](https://qiita-image-store.s3.amazonaws.com/0/140543/1b56455a-ca40-247e-0f5b-133c89eb341a.png)


この三行だけで簡単に新宿区のshpファイルが作成可能。素敵！

### folium

ブラウザ上で動かせる地図を作成するライブラリ。正確に言うとLeafletというJavascriptのライブラリをPythonから使うためのライブラリ。簡単にインタラクティブな地図を作成できます。先ほどのGitHubの地図もLeafletを利用しているらしいです。

```py3
import folium

m = folium.Map(
    location=[34.7,135.2],
    tiles='OpenStreetMap',
    zoom_start=4
)
```

![Screenshot from 2017-10-26 02-25-37.png](https://qiita-image-store.s3.amazonaws.com/0/140543/069e6dc2-1eaa-30e2-5d2d-9edb7c178451.png)


使用例。

### geopy

geocodingライブラリです。使ったことがないので割愛。一応githubの地理情報系pythonライブラリでは一番スター数が多いみたいです。（geoで検索しただけなので、もしかしたら検索ワードが間違いかも）

### shapely

地理情報オブジェクトを図形的にいろいろ扱うライブラリです。まだちゃんと使えてないので追記します。

### 地理情報に限らないけど重要なライブラリ

### jupyter

言わずもがな。データ解析ではだいたい出てくる。実は40言語以上カーネルがあるらしいです。

### networkx

有向グラフを扱うのライブラリ。shpファイルの入出力にも対応しています。

## 一般的なDataBaseやDatastore(2019/04/24追記）

継続的に見ていただいている記事なのでDataBaseの対応状況を追記しないのはまずいだろうということで、追記します。

### MongoDB

[geospatial query](https://docs.mongodb.com/manual/reference/operator/query-geospatial/)に対応しています。

### Elasticsearch

[Geo queries](https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html)。（Elasticsearch君も対応していたのか）。多機能ではありませんが、Elasticsearchで使えるのは嬉しいです（試してませんが）。

### Redis

Redisも多くのGeo系関数を持っているようです。

```
site:https://redis.io geo
```

あたりをqueryにしてGoogle検索にかけると色々ヒットします。

### tile38

Vimconfでvimのプラグイン探してたら見つけました。

* Redis RESP互換
* cli
* いろいろ計算可能

な感じのGoで書かれたDBです。

すごそうなので使ってみます。

## まとめ

pythonで地理情報解析しましょう。

まだ、理解度不足で至らない部分があるので、使ったものを追記していきます！

追記:一つ注釈を忘れていました。GISでもPythonは使用可能です。ただ、時間のかかる処理をGIS上でやりたいか、という話です。~~脱GISとか書いておいてあれですが、可視化はGISでやるのが楽かもしれません~~