Automating GIS Processes 2024 写経　Exercise 2 (Problem 1)

https://github.com/Automating-GIS-processes-II-2024/exercise-2/blob/main/Exercise-2-problem-1.ipynb

まずはお約束として、`geopandas`をインストールします。

```
! pip install geopandas
```

# Problem 1: Create a polygon from a list of coordinates (5 points)

> In the first problem, the aim is to create a polygon based on the provided coordinates, and to plot the polygon in a map.

> Two lists, longitudes and latitudes, contain the input coordinates for the polygon. You need to ‘assemble’ the coordinates to individual tuples of one longitude and one latitude coordinate each (The first coordinate pair looks like this: (29.99671173095703, 63.748023986816406)).

提供された座標群からポリゴンを作り、プロットします。
座標群は、`longitudes`・`latitudes`と別のリストに入ってますので、個々の緯度経度の`tuple`に「組み立て」ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/9bc58ed7-415d-4100-9abf-5187f280fd50.png)

## a) Create a shapely.geometry.Polygon geometry polygon based on the coordinates

> - Create a list of coordinate pairs based on the provided longitudes and latitudes and store the list in a variable coordinate_pairs. A coordinate pair can be either a tuple or a list.
> - Create a shapely.geometry.Polygon using the coordinate_pairs. Store the polygon in a variable polygon.

座標（緯度経度）のペアのリストを作り、そこからポリゴンを作り、変数`polygon`に格納します。

```
coordinate_pairs = [lon_lat for lon_lat in zip(longitudes,latitudes)]

print(type(coordinate_pairs[0]))
print(coordinate_pairs[0])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/ba871ae5-c018-4c96-a285-218dcfe1da6c.png)

今回は、`tuple`のリストを作るため、zipとリスト内包表記を組み合わせることで１行のコードとなります。

[zip](https://docs.python.org/ja/3.13/library/functions.html#zip)
> 複数のイテラブルを並行に反復処理し、各イテラブルの要素からなるタプルを生成します。


変数`coordinate_pairs`からポリゴンを作成し、その型を確認します。
```
from  shapely.geometry import Polygon
polygon = Polygon(coordinate_pairs)

print(polygon.geom_type)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/98b30266-e6d3-4732-9b05-3747b39307b2.png)


## b) Insert the polygon into a newly created geopandas.GeoDataFrame called geo

> (see the hints for this exercise for more different approaches to complete this task)

> Be sure to define a coordinate reference system for the data (the coordinates are in WGS84 format)

ポリゴンを`GeoDataFrame`に追加します。変数名は`geo`とします。
`GeoDataFrame`のCRSとしてWGS84を設定します。

ヒントは[こちら](https://qiita.com/t_t_japan/items/c55c30931bc884265da5#creating-a-new-geopandasgeodataframe-alternative-1)。

```
import geopandas as gpd

tmp_dict = {'geometry': [polygon]}
geo = gpd.GeoDataFrame(tmp_dict)
geo.crs = "EPSG:4326" # WGS84
geo.crs
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/d4310641-4a2e-48ad-bb16-c8cda99c81a0.png)

`geo`の中身と行数を見てみましょう。
```
# Check the content of the GeoDataFrame:
print(geo.head())

# Check the number of rows:
print(len(geo))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/018fbdcc-1078-4a6e-b897-8b81611d2167.png)

## c) Plot the data set

> Which shape do you see? Add a comment to the pull request to answer!

プロットします。いかがでしょうか。土地勘がないと妥当かどうかわかりませんね。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/d7d950f3-493a-452c-bc86-fda9c270b326.png)



d) Save the GeoDataFrame to a file

> Save the file in GeoPackage format, save it inside the data directory, and name it mysterious-polygon.gpkg.

GeoPackageとして保存します。ファイル名は、 mysterious-polygon.gpkgとします。

```
import pathlib
DATA_DIRECTORY = pathlib.Path().resolve() / "data"

geo.to_file(DATA_DIRECTORY / "mysterious-polygon.gpkg")
```

保存されているか`assert`で確認しましょう。
何も出力されない→mysterious-polygon.gpkgファイルが期待するフォルダに存在している、です。

```
# Check if output file exists
import pathlib
DATA_DIRECTORY = pathlib.Path().resolve() / "data"
assert (DATA_DIRECTORY / "mysterious-polygon.gpkg").exists()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/86cce67a-4803-4774-9373-c5ca1d1e1b4e.png)

念のため、シェルコマンドで確認もしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/ac565d5a-1acd-43de-bc1f-c78d560bec74.png)

さらに念のため、帆損したファイルを読み込んでプロットしてみましょう。
```
gpd.read_file(DATA_DIRECTORY / "mysterious-polygon.gpkg").plot()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/27b3823c-01bb-46ea-892f-2f459a6f57cc.png)

うん、同じプロットですね。


Problem 2へ続きます。