GIS × Python Tutorial 1.0 ~ 座標データの中身 ~
はじめに
GIS関連の業務を行う際に、どの様にデータを扱っていますか?
ローカル環境でGISに関する計算などを行う場合は、"QGIS" や "ArcGIS Pro" などのデスクトップアプリが有名で、私自身も "ArcGIS Pro" を使用しています。
GISエンジニアであればともかく、そうでない方はGISを補助的に利用するだけでガッツリ使うという方も少ないかもしれません。もちろんそれでも問題はないのですが、どの様なデータになっているのかを理解していると、活用の幅も広がるかもしれません。
このTutorialはPythonでGISデータを扱う事に焦点を当てて進めていきます。Part1の今回はVectorデータに関して解説していきます。
Point
Pointは現実世界に存在する地物の座標情報を(x, y, [z])で保存しているVectorDataです。GoogleMapのピンなどがPointのデータですね。
Pointには主に
- 2次元のPoint
- 3次元のPoint
- 2次元のMultiPoint
- 3次元のMultiPoint
があります。2次元か3次元かはz軸(高さ)が入力されているかいないかなので、纏めて考えてしまっても構いません。
保存されているデータのイメージ
保存されているデータをイメージする場合は、Excelの様なテーブルでイメージするとわかりやすいかもしれません。ここで "テーブル" と聞くと以下の様にイメージするかもしれませんが
name | x | y |
---|---|---|
Point 1 | 140.69 | 41.25 |
Point 2 | 140.79 | 41.75 |
Point n | --- | --- |
実際のデータイメージは、下の様に1つのセルの中に座標値が詰め込まれている様な感じです。
name | geometry |
---|---|
Point 1 | POINT (140.69, 41.25) |
Point 2 | POINT (140.79, 41.75) |
Point n | --- |
しかし、実際にはこの様なExcel、CSV的なデータで扱う事はありません。データの種類に関してはPart2以降に紹介する予定でしたが、ここでは簡単に "GeoJSON" と呼ばれるフォーマットのデータを見てみましょう。
JSONを見慣れていない方が見れば「勘弁してくれ」と思うかもしれませんが、読み方は非常に簡単です。
JSONは、JavaScript Object Notationの略で、名前と値のペアをカンマで区切ったものを波括弧で囲んで表現します。
下にトグルで隠している "行ごとに色を付ける" を開いてみて下さい。緑色のエリアがテーブルでの1行目にあたり、赤色のエリアが2行目にあたります。
{
'type': 'FeatureCollection',
'features': [
{
'type': 'Feature',
'properties': {
'name': 'Point 1'
},
'geometry': {
'type': 'Point',
'coordinates': [140.6932733, 41.2529246]
}
},
{
'type': 'Feature',
'properties': {
'name': 'Point 2'
},
'geometry': {
'type': 'Point',
'coordinates': [140.7932733, 41.7529246]
}
}
]
}|
行ごとに色を付ける
{
'type': 'FeatureCollection',
'features': [
+ {
+ 'type': 'Feature',
+ 'properties': {
+ 'name': 'Point 1'
+ },
+ 'geometry': {
+ 'type': 'Point',
+ 'coordinates': [140.6932733, 41.2529246]
+ }
+ },
- {
- 'type': 'Feature',
- 'properties': {
- 'name': 'Point 2'
- },
- 'geometry': {
- 'type': 'Point',
- 'coordinates': [140.7932733, 41.7529246]
- }
- }
]
}
2次元のPointイメージ
最もよく見るのがこの2次元のPointデータです。
図の様に"Point 1"と" Point 2"は別な行のデータとして扱われます。
3次元のPointイメージ
2次元のPointにz軸(高さ)の値が入力されただけです。
2次元のMultiPointイメージ
MultiPointはより特殊で、1つのセルに複数のPointデータが保存されているデータです。
name | geometry |
---|---|
Point 1 | MULTIPOINT [(140.69, 41.25), (140.85, 41.06)] |
Point 2 | MULTIPOINT [(140.79 41.75), [140.24, 41.04)] |
Point n | --- |
{
'type': 'FeatureCollection',
'features': [
+ {
+ 'type': 'Feature',
+ 'properties': {'name': 'Point 1'},
+ 'geometry': {
+ 'type': 'MultiPoint',
+ 'coordinates': [
+ [140.6932733, 41.2529246],
+ [140.8525532, 41.0668196]
+ ]
+ }
+ },
- {
- 'type': 'Feature',
- 'properties': {'name': 'Point 2'},
- 'geometry': {
- 'type': 'MultiPoint',
- 'coordinates': [
- [140.7932733, 41.7529246],
- [140.2425532, 41.0468196]
- ]
- }
- }
]
}
下の図の様に同じ行のPointデータは、同一のデータとして纏めて扱われます。
3次元のMultiPointイメージ
Line
LineString
LineStringは先に見たMultiPointと同じく1つのセルの中に複数のPointデータが保存されている様なデータです。道路や河川などを表現する場合はこのオブジェクトを使用します。
MultiLineString
MultiLineStringはLineStringが1つのセルに複数のLineStringが保存されている様なデータです。こちらはJSONで見て見ましょう。
下に示したJSONの中にはLineStringとMultiLineStringの2つが保存されています。MultiLineStringでは緑色で色付けした行のラインも、赤色で色付けした行のラインも同一の行に保存されています。
{
'type': 'FeatureCollection',
'features': [
{
'type': 'Feature',
'properties': {'index': 0, 'name': 'Point 2'},
'geometry': {
'type': 'LineString',
'coordinates': [[140.7932733, 41.7529246], [140.2425532, 41.0468196]]
}
},
{
'type': 'Feature',
'properties': {'index': 0, 'name': 'Point 1'},
'geometry': {
'type': 'MultiLineString',
'coordinates': [
+ [
+ [140.4932733, 41.5529246],
+ [140.4932733, 41.4468196],
+ [140.6425532, 41.4468196],
+ [140.6425532, 41.7768196]
+ ],
- [[140.5532733, 41.1529246], [140.8525532, 41.0668196]]
]
}
}
]
}
Polygon
Polygon & MultiPolygon
LineStringと違い、最初の座標と最後の座標が一致している必要があります。
Polygonは1つの多角形ですが、MultiPolygonは複数の多角形の集まりです。ドーナツの様に穴の開いたPolygonを描く事も出来ますし、離島の様に離れた場所にPolygonを描く事もでき、全てを合わせた面積を計算する事も出来ます。
おわりに
以上がGISで使用するVectorデータのイメージです。
今回はPythonを使用しませんでしたが、次回のSessionではGISでよく使用されるライブラリを紹介する予定です。
Discussion