GIS奮闘記

元GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

geopyを使ってジオコーディングをしてみよう

さて、本日はgeopyを使ってジオコーディングをしてみようと思います。

f:id:sanvarie:20181019110343p:plain

geopyとは

ジオコーディング用のPythonライブラリですね。GIS系のPythonライブラリではかなりメジャーです。ジオコーディングとは?という方は以下のエントリーをご参照ください。
www.gis-py.com

インストール

pip install geopy でOKです。

サンプルコード

東京都庁をジオコーディングしてみようと思います。

# -*- coding: utf-8 -*-
from geopy.geocoders import Nominatim

geolocator = Nominatim(user_agent="test")
location = geolocator.geocode(u"東京都庁")

print(location.address)       #住所
print(location.latitude)      #緯度
print(location.longitude)     #経度
print(location.raw)           #ジオコーディングした結果の全ての情報

簡単ですね。最後のlocation.rawはジオコーディングした結果の全ての情報が格納されています。非常に便利です。

f:id:sanvarie:20181019104542p:plain

pandasとの連携

pandasのデータフレームにデータを格納することもできます。pandasについては以下エントリーで紹介しています。興味のある方はぜひ読んでみてください。

www.gis-py.com

www.gis-py.com

サンプルコード

東京、大阪、福岡のジオコーディング結果をpandasのデータフレームに格納するサンプルです。

# -*- coding: utf-8 -*-
import pandas as pd
df = pd.DataFrame({'name': [u'東京', u'大阪', u'福岡']})

from geopy.geocoders import Nominatim
geolocator = Nominatim()

from geopy.extra.rate_limiter import RateLimiter
geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)
df['location'] = df['name'].apply(geocode)

df['point'] = df['location'].apply(lambda loc: tuple(loc.point) if loc else None)

print df['location']
print ""
print df['point']

これも簡単にできました。

f:id:sanvarie:20181019105307p:plain

ジオコーディングするなら鉄板のライブラリですので、興味のある方はぜひ使ってみてください。

GISデータを無料でダウンロードできる便利サイトのまとめ

さて、本日はGISデータを無料でダウンロードできる便利サイトのまとめを書いてみたいと思います。自分はよく仕事でこういったサイトを利用するのですが、みなさんはどうでしょうか?非常に便利なデータが無料でダウンロードできますので、これからGISに取り組んでいこうという方はぜひ利用してみてください。

各々の目的によって使用されるデータは異なるかと思いますが、以下のサイトを利用すれば、大抵のことはできるかと思います。

1.国土地理院 基盤地図情報

行政区画の境界線、道路縁、建物の外周線、数値標高モデル(DEM)のデータなどをダウンロードできます。基盤地図情報ダウンロードサービス

数値標高モデル(DEM)に関して興味のある方は以下のエントリーを読んでみてください。
www.gis-py.com

2.国土地理院 地理空間情報ライブラリー

「地理院地図」として国土地理院が提供する地図をKML形式でダウンロードできます。http://geolib.gsi.go.jp/node/2537

3.国土政策局 位置参照情報

日本全国の大字町丁目または街区単位の座標をCSV形式でダウンロードできます。
位置参照情報ダウンロードサービス

4.国土数値情報

全国の河川、避難施設、鳥獣保護区、鉄道 など様々なデータをShape形式などでダウンロードできます。
http://nlftp.mlit.go.jp/ksj/index.html

5.J-SHIS 地震ハザードステーション

全国の地盤データなどをShape形式などでダウンロードできます。私は兄が家を購入する際、実際にこちらのデータを使用して地盤の強度を調べました。
J-SHIS 地震ハザードステーション

地盤データに興味がある方は以下エントリーを読んでみてください。
www.gis-py.com

6.ESRI

日本地図のデータをShape形式でダウンロードできます。私は日本地図を使う際は必ずこのデータを使用します。
全国市区町村界データ | ESRIジャパン

ESRI日本地図データに興味がある方は以下エントリーを読んでみてください。
www.gis-py.com

7.総務省統計局 e-Stat

各府省が公表する統計データがまとめられており、国勢調査、経済センサス、農林業センサス等の統計データをShape形式などでダウンロードできます。
地図で見る統計(統計GIS) | 政府統計の総合窓口


ざっとこんなところでしょうか。ちなみに私が一番よく利用するサイトは「基盤地図情報」ですね。こんな便利なデータを無償で提供していただけるとは本当にありがたいです。

mxdperfstatを使ってみよう

ArcGISを使っていて、速度が気になることはありませんか?もしかしたらお使いのGISデータの速度改善ができるかもしれません。

ArcGISをお使いの方であればMXDはご存知かと思います。ただ、MXDの速度を計測したことはありますでしょうか?

そんな時はmxdperfstatを使えば大丈夫です。

ESRI公式のツールではなく、サポートはされていないのですが、無償で使用することができます。たしか、ESRI内の有志が集まって作ったとかだと思いました(ESRIの方に聞いたのですが、詳細は忘れてしまいました)。

以下のサイトからダウンロードできます。
https://www.arcgis.com/home/item.html?id=a269d03aa1c840638680e2902dadecac

こんな感じですね。
f:id:sanvarie:20181016160308p:plain

データ

神奈川県のポリゴンと適当な施設のポイントをmxdにしてみました。これを使用します。
f:id:sanvarie:20181017102527p:plain

使い方

以下のようにコマンドを入力してください(使用するexeのバージョンはお使いのArcGISに合わせてください)。スケールはオプションで付けることができます。ですので、各スケールによるパフォーマンスも測ることがことができます。

mxdperfstat10.4.exe -mxd C:\mxdperfstat\kanagawa.mxd -scale 2000


f:id:sanvarie:20181017103352p:plain

こんな感じでXMLが出力されます。これをEXCELなどで見ることができます。
f:id:sanvarie:20181017103501p:plain

EXCELで開くとこんな感じですね。「Refresh Time (sec)」列を見ると各レイヤの読み込み時間が表示されます。サンプルデータはデータ数が少ないのであまり差は出ていませんが、ここの値が大きければパフォーマンスに改善の余地があることがわかります。
f:id:sanvarie:20181017104040p:plain

GISのパフォーマンスの数値化というのはなかなか困難な作業かと思います(遅いとか早いとかは主観によるものですので)。もしそういったことにお悩みであればmxdperfstatを使ってみてはいかがでしょうか。

GISエンジンおよびサービスのまとめ

今日は私が日常的に使用しているGISエンジンおよびサービスについてまとめてみようと思います。エンジンという言葉は普段あまり耳にすることは無いと思いますが、ソフトウェアと考えて問題ないと思います。GISデータを扱うためのソフトウェアですね。

GISって何?という方は以下のエントリーを読んでみてください。
www.gis-py.com


GISの導入を考えており、どのエンジンにするか選定中という方は当エントリーを参考にしていただけると幸いです。GISエンジンは使用しないけど、世の中にいったいどういったGISエンジンやサービスがあるのか興味があるという方もぜひ参考にしていただければと思います。

1.ArcGIS

言わずと知れたGIS界の巨人ESRIが展開するGISエンジンです。様々な製品を展開しており、正直、私もすべてを把握できてはいません。

ArcGIS製品で私がよく使用するものは以下です。
①ArcGIS Desktop
GISデータを参照、編集することができるソフトです。ArcGIS Desktop | ESRIジャパン

f:id:sanvarie:20181016102438p:plain

おそらくこれがあれば、ほとんどのGIS関連の業務は事足りるのではないでしょうか。分析や色分け機能などがとても充実しており、綺麗な地図を作成することができます。


②ArcGIS Engine
ArcGIS Desktopで大抵のことはできてしまうのですが、例えば、特定の業務を行う際、ArcGIS Desktopだと少し物足りない、もしくは、作業手順が煩雑になるという場合、必要なGISアプリを開発することもあるかと思います。その際に使用するのがArcGIS Engineです。ざっくりいうとライブラリですね。これを使用すれば痒い所に手が届くアプリを開発することができます。
ArcGIS Engine | ESRIジャパン


③ArcPy
製品というわけではないと思うのですが、ArcGISをインストールすると一緒にインストールされるのがこのArcPyです。作業の自動化はしたいが、ArcGIS Engineを使うほどではないという場合に非常におすすめです。名前から推測できるかと思いますが、Pythonを使ってArcGISデータを扱うことができます。ArcGIS Desktop上で使用することができるので、とても便利です。

f:id:sanvarie:20181016103731p:plain

ArcPyについては色々なエントリーを書いていますので、ぜひ読んでみてください。
www.gis-py.com


※使ってみたいサービス
④ArcGIS Online
近年、ESRIが力を入れているクラウド GISです。ユーザーがいつでもどこでも手軽に利用できるというメリットがあります。ただ、使用料が従量課金制というのがいまいちかなと個人的には思っています(ただし、参照のみの場合は無償)。
ArcGIS Online | ESRIジャパン

2.SIS

ArcGISほどメジャーなGISエンジンではありませんが、こちらも私はよく使用します。Cadcorpという会社が販売しているGISエンジンです。https://www.cadcorp.com/

こちらの会社もESRIほどではないですが、色々な製品を展開しています。

SIS製品で私がよく使用するものは以下です。
①SIS Map Modeller
GISデータを参照、編集することができるソフトです。
f:id:sanvarie:20181016104339p:plain

この製品の特長としては色々なファイルを開くことができるということでしょうか。この点に関してはArcGIS Desktopに勝っているのではないかと思います。

あと、ArcGIS Desktopは大容量のShapeファイルを開こうとしたりすると、頻繁に落ちたりするのですが、SIS Map Modellerではまずそういったことはありません。また、ArcGISのデータ形式であるFGDBはよく壊れたりするのですが、SISのデータ形式であるbdsは壊れることはあまりありません。こういったところは本当にSISは非常によくできており、もう少しメジャーになってもいいのではないかと思うエンジンですね。

②SIS SDK
ArcGIS Engineと同じように、SISをベースとしたアプリケーションを開発する際に使用します。

3.QGIS

ArcGISやSISと異なり、こちらは無償のGISエンジンです。無償といってもその機能はとても充実しています。参照、編集に関しては有償のエンジンとの差はほとんどないかもしれません。ただ、細かい分析などをしたい場合はArcGISに軍配が上がるかと思います。個人でGISエンジンを利用する場合はQGISを選ぶ方が大多数ではないでしょうか。

①QGIS Desktop
GISデータを参照、編集することができるソフトです。ArcGIS DesktopやSIS Map Modellerと同じですね。

f:id:sanvarie:20181016110753p:plain

4.Google Map

こちらは言うまでもないでしょうか。世界ナンバーワンのGISサービスですね。
Google マップ

f:id:sanvarie:20181016113000p:plain


Google Maps APIを使用すればGoogle Mapを使用してGISアプリを作ることができます。Google Maps APIに興味がある方は以下を読んでみてください。

www.gis-py.com

5.Google Earth

Google Mapほどではないにしろ、こちらも人気のGISサービスですね。Google Earth

f:id:sanvarie:20181016115313p:plain

うーん、かっこいい。

6.地理院地図

国土地理院が展開するGISサービスですね。少しマニアックになってしまいますが、GIS関係の仕事をしている方はよく使われるのではないでしょうか。
地理院地図

Google Mapとは違った見た目ですが、渋くて自分は大好きですね。
f:id:sanvarie:20181016115609p:plain

7.OpenStreetMap

OpenStreetMap(OSM)は、道路地図などの地理情報データを誰でも利用できるよう、 フリーの地理情報データを作成することを目的としたプロジェクトです。地図版のWikipediaといったところでしょうか。

OpenStreetMap

f:id:sanvarie:20181016122753p:plain

OpenStreetMapに興味がある方はぜひこちらを読んでみてください。
www.gis-py.com


個人的な評価はざっとこんな感じでしょうか。やはり機能面は有償のGISエンジンが優れていると思いますが、価格や手軽さを考慮すると無償のGISの存在というのはとても大きいと思います。ただ、どのエンジンやサービスを使うべきというのは無くて、各々の目的に適したものを使用されるのがいいかと思います。

GIS 無償 機能 手軽さ
ArcGIS × ×
SIS × ×
QGIS ×
Google Map
Google Earth
地理院地図
OSM

geopandasを使ってShapeファイルを作成しよう! ~Airbnbのデータを可視化してみよう~

さて、今回はgeopandas第二弾です。前回はgeopandasの簡単な使い方を紹介しましたが、今回はもう少し掘り下げてShapeファイルの作成をしてみようと思います。

geopandas第一弾に関しては以下をご参照ください。
www.gis-py.com

本エントリーの後に第三弾も書きました。より詳しくgeopandasについて説明したエントリーです。ぜひ読んでみてください。
www.gis-py.com

Airbnbとは?

Airbnb(エアビーアンドビー)は、宿泊施設・民宿を貸し出す人向けのウェブサイトである。世界192カ国の33,000の都市で80万以上の宿を提供している。そうです。私は興味はあるのですが、一度も利用したことがありません・・・いつか使ってみたいですね!
Airbnb - Wikipedia

データ

以下のサイトからAirbnbのオープンデータをダウンロードすることができます。しかし、日本のデータがない!日本ではあまり人気がないからでしょうか?
Get the Data - Inside Airbnb. Adding data to the debate.

なので、今回はブログ主に馴染み深い西オーストラリアのデータを使用したいと思います。

赤枠が今回使用したデータです。上の赤枠が宿泊施設データを格納したCSV、下の赤枠が地形データを格納したgeojsonですね。
f:id:sanvarie:20181012105442p:plain

実行環境

Windows7 64bit
ArcGIS Desktop10.4.1
Python2.7.3

サンプルコード

ダウンロードしたCSVとgeojsonからShapeファイルを作成するサンプルです。

# -*- coding: utf-8 -*-
import pandas as pd
import geopandas
from shapely.geometry import Point

#csvの読み込み
df = pd.read_csv(r"D:\gis-py\geopandas\airbnb\listings.csv")

#ポイント作成
geometry = [Point(xy) for xy in zip(df.longitude, df.latitude)]
geo_df = geopandas.GeoDataFrame(df, geometry=geometry)

#Shape出力
geo_df.to_file(driver='ESRI Shapefile', filename=r"D:\gis-py\geopandas\airbnb\accommodation.shp")

#geojsonの読み込み
df2 = geopandas.read_file(r"D:\gis-py\geopandas\airbnb\neighbourhoods.geojson")

#Shape出力
df2.to_file(driver='ESRI Shapefile', filename=r"D:\gis-py\geopandas\airbnb\western_Australia.shp")

ものすごいあっさり作れてしまいました。本当に便利なライブラリですね。ArcMapを使用して作成したShapeを確認してみます。

f:id:sanvarie:20181012110339p:plain

おぉーまさしく西オーストラリアですね!そして、宿泊施設は都市部に集中していることがわかりますね。たしかオーストラリアの真ん中らへんは砂漠地帯だったと思うので、宿泊施設がほとんどないことも納得がいきます。

属性はこんな感じです。各宿泊施設のWEBサイトに載っているような情報(値段とか場所とか)が入っているみたいですね。

f:id:sanvarie:20181012111238p:plain

ちなみに西オーストラリア最大の都市であるパースの宿泊施設が何個あるか空間検索して調べてみました。

f:id:sanvarie:20181012111644p:plain

なんと710個!やはり都市部は違いますね。

今回の記事ではgeopandasを使用すれば、本当に簡単にShapeを作成することができるということがわかりました。ただ、もっと色々な機能を有しているライブラリですので、応用すればもっと色々なことができるかと思います。これを機にぜひ使ってみてはいかがでしょうか。

以上、今回は「geopandasを使ってShapeファイルを作成しよう! ~Airbnbのデータを可視化してみよう~」でした。

geopandasを使ってみよう!

さて、今回はgeopandasですね!以前から気になっていたライブラリなので、これを機に使ってみようと思います。

geopandasとは

geopandasはpandasの拡張で、地理データを含むデータをpandasのように表形式で扱うことができるpythonのライブラリです。こんな便利なものを作っていただけるとはなんともありがたい話ですね。

ちなみにこちらのエントリーでより詳しくgeopandasについて紹介していますので、興味のある方はぜひ読んでみてください。
www.gis-py.com

インストール

公式サイトによるとhttp://geopandas.org/install.html、GeoPandasをインストールする前に以下ライブラリをインストールする必要があるそうです。その後、pip install geopandas ですね!

  • numpy
  • pandas (version 0.15.2 or later)
  • shapely
  • fiona
  • six
  • pyproj
  • descartes

あとは必須ではないですが、オプションとして以下も入れておくといいと思います。

  • matplotlib
  • geopy

もしpipでエラーが出るようなことがありましたらこのサイトhttps://www.lfd.uci.edu/~gohlke/pythonlibs/からWheelをダウンロードしてインストールしてみてください。

実行環境

Windows7 64bit
ArcGIS10.4.1
Python2.7.3

データ

geopandasをインストールすると自動的にサンプルデータもついてくるみたいです。今回はそれを使用してみます。データの内容は以下です。

  1. 世界地図
  2. 世界の都市

また、今回はjupyterを使用してデータを展開してみようと思います。

■データの取得

import geopandas

world = geopandas.datasets.get_path('naturalearth_lowres')      #世界地図
cities = geopandas.datasets.get_path('naturalearth_cities')         #都市

これだけでOKです。簡単ですね。

■データの読み込み

df_world = geopandas.read_file(world)
df_cities = geopandas.read_file(cities)

こちらも簡単。取得したデータをデータフレーム化するだけですね。

片方のデータフレームの中身を確認します。

df_world.head()

f:id:sanvarie:20181009105523p:plain


ちゃんとデータが入っていることが確認できました。


■データのプロット
公式ドキュメントによるとdataflameに対して.plot()を使用することで、matplotlibが走るようです。

base = df_world.plot(color='white', edgecolor='black')
df_cities.plot(ax=base, marker='o', color='red', markersize=5);

f:id:sanvarie:20181009111006p:plain


おぉー素晴らしい。サンプルデータが描画されました。

サンプルコード

上記をまとめたものを記載します。

# -*- coding: utf-8 -*-
import geopandas

world = geopandas.datasets.get_path('naturalearth_lowres')      #世界地図
cities = geopandas.datasets.get_path('naturalearth_cities')         #都市

df_world = geopandas.read_file(world)
df_cities = geopandas.read_file(cities)

base = df_world.plot(color='white', edgecolor='black')
df_cities.plot(ax=base, marker='o', color='red', markersize=5);


このgeopandasですが、かなり面白いライブラリですね。今回は基礎的なことしか触れなかったのですが、geopandasでShapeファイルを作成するエントリーもありますので、よかったら読んでみてください。
www.gis-py.com


年々GISデータの重要性が高まる中、こういった便利なライブラリがもっと登場してくれるといいですね。

以上、「geopandasを使ってみよう!」でした。

【PythonとGIS】GDALを使ってShapeファイルを作成してみる

皆さん、お久りぶりです。ずっとブログ更新をさぼってしまっていましたが、またちょくちょく書いていこうと思います。さて、今回はGDALですね!GDALは以下記事のように当ブログで紹介はしているのですが、今回はShapeファイルの作成にチャレンジしてみたいと思います。

www.gis-py.com

www.gis-py.com

sanvarie.hatenablog.com

sanvarie.hatenablog.com


また、今までのブログではArcPyでオープンストリートマップのデータ(.osm)をShapeに変換してみた - GIS奮闘記のようにArcpyを使用してのShapeファイルの作成方法は紹介したことがあるのですが、これだとArcGISに依存した作成方法なので、ArcGISを持っていない方でもShapeファイルの作成が手軽にできるようにGDALのようなフリーのライブラリでの作成方法を紹介します。

GDALとは

GDAL - Wikipedia
色々小難しいことが書いてありますが、要はフリーのGISライブラリです。

インストール

以下のようなサイトを参考にインストールをお願いします。
http://blog.godo-tys.jp/2013/06/19/2465/
https://github.com/domlysz/BlenderGIS/wiki/How-to-install-GDAL

実行環境

Windows7 64bit
ArcGIS10.4.1
ArcMap10.4.1
Python2.7.3

サンプルコード

ポイントShapeを作成するサンプルです。

# -*- coding: utf-8 -*-
import osgeo.ogr as ogr
import osgeo.osr as osr

# 今回作成するポイントの緯度経度
lat_lon = [[35.679933,139.714465],[35.1231433,139.2533465]]

# shapefileドライバ
driver = ogr.GetDriverByName("ESRI Shapefile")

# Shape出力先を設定
data_source = driver.CreateDataSource(ur"D:\gis-py\gdal\sample.shp")

# 投影法を設定(projectionファイルがうまく作成されないので、コメントアウト)
#srs = osr.SpatialReference()
#srs.ImportFromEPSG(4612)

# レイヤ作成
#layer = data_source.CreateLayer("sample", srs, ogr.wkbPoint) # projetionファイル作るときに使う
layer = data_source.CreateLayer("sample",  geom_type= ogr.wkbPoint)

# フィールド追加
field_name = ogr.FieldDefn("column", ogr.OFTString)
field_name.SetWidth(24)
layer.CreateField(field_name)

layer.CreateField(ogr.FieldDefn("Latitude", ogr.OFTReal))
layer.CreateField(ogr.FieldDefn("Longitude", ogr.OFTReal))

# Shape作成
for l in lat_lon:
  # フィーチャ作成
  feature = ogr.Feature(layer.GetLayerDefn())

  # 属性を設定
  feature.SetField("column", "test")
  feature.SetField("Latitude", l[0])
  feature.SetField("Longitude", l[1])

  # 作成するポイントに緯度経度をセット
  wkt = "POINT(%f %f)" %  (float(l[1]) , float(l[0]))

  # ポイント作成
  point = ogr.CreateGeometryFromWkt(wkt)
  feature.SetGeometry(point)
  layer.CreateFeature(feature)
  feature = None

data_source = None


おー、ちゃんとShapeファイルができあがっていますね!
f:id:sanvarie:20181005130142p:plain


しかし、projectionファイルがありません。ファイルの作成はできたのですが、なぜか中身が空!解決策がわからず、今回は泣く泣く作成せずに終わりました。

ArcMapでShapeを読み込んでみました。ポイントが作成されていることがわかります。
f:id:sanvarie:20181005130443p:plain


属性もしっかり入っていますね。
f:id:sanvarie:20181005130459p:plain


GDALのAPIについてはあまり日本語化されておらず、情報量もあまり多くないのですが、使いこなすことができたらとても便利なライブラリだと思います。これを機にぜひ使ってみてください!

以上、「GDALを使ってShapeファイルを作成してみる」でした!