GeoNode への データ登録とデータアクセスを確認する

# 1. はじめに
国連オープンGISイニシアチブではオープンソースソフトと商用ソフトをうまく利用してハイブリッドなGISシステムを構築し、地理空間情報を効果的・効率的に活用しようと考えています。

https://twitter.com/UNopenGIS/status/1317506454551732225

この中で、ウェブベースのプラットフォームで地理空間データのコンテンツ管理システムである GeoNode がハイブリッドGISの構成要素になっています。

今回、**GeoNodeでどんなことができるのか、特にデータの登録とアクセスを観察して少しメモしてみました**。私自身はこれまでにGeoNodeを構築・利用したことがなく、ほぼ初心者といってもいいと思いますが、初心者目線での発見をメモ・共有したいと思います。（ダッシュボードやストーリーマップの機能はまだ触れません）

# 2. 環境
* GeoNode version 4

# 3. GeoNode について
まず、 https://geonode.org/ のページから、概要を調べてみました。

＜GeoNode のポイント（と私が思うもの）＞
* オープンソースの地理空間情報コンテンツ管理システム
* ウェブベースのアプリケーション
* GISの開発やSDIの実装のためのツール
* 最新の安定バージョンは4.0.2（2022年12月21日現在）
* ドキュメンテーションはこちら：　https://docs.geonode.org/en/master/
* ユーザーインターフェースには**OpenLayers**を使っていて、アプリケーションサービスの中では**GeoServer**とGeoWebCacheを使っている。SQL/JDBCでPostGIS/PostSQL, Oracle Spatial, ArcGIS Server/ArcSDE, Microsoft SQL serverなどにアクセスしている。
* PythonのWebフレームワークであるDjangoをベースにしている。


# 4. 観察結果
## 4-1. Data (Datasets と Documents) の登録
Dataとして、データセットと文書の2種類に分かれていました。ログインしないとコンテンツの追加ができないが、ログインするとコンテンツが追加できるようになります。（GeoNodeの設定にもよるのかもしれません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/5f4923c4-33fa-f091-d294-13de9ded3124.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/71bee417-3211-f929-9c60-4322be53224f.png)

**発見したこと：**
* リソースの追加メニューにはいろいろあって素晴らしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/886ab40f-2dcd-27e5-043e-79f860235d5b.png)

* datasetとしてアップロードできるのは、シェープファイル、GeoTiff、CSV、ZIPファイル、XMLメタデータファイル、SLD（Styled Kayer Descriptor）だけ。
* documentとしては、かなりたくさんの種類のファイルがアップロードできる：txt, .log, .doc, .docx, .ods, .odt, .sld, .qml, .xls, .xlsx, .xml, .bm, .bmp, .dwg, .dxf, .fif, .gif, .jpg, .jpe, .jpeg, .png, .tif, .tiff, .pbm, .odp, .ppt, .pptx, .pdf, .tar, .tgz, .rar, .gz, .7z, .zip, .aif, .aifc, .aiff, .au, .mp3, .mpga, .wav, .afl, .avi, .avs, .fli, .mp2, .mp4, .mpg, .ogg, .webm, .3gp, .flv, .vdo, .glb, .pcd, .gltf
* （create XX シリーズでのコンテンツ追加は省略）
* Remote servicesでは、Web Map Service, GeoNodeに加え、ArcGISの　MapServerとImageServerが追加できる。(注：wmsは追加できても、ラスタタイルサービスはコンテンツとしては追加できないようです。ArcGISの対応も、FeatureServiceとかVectorTileServiceとかは対応していなさそうです。)　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/2925f050-4502-20e6-c5e9-12ddcf6ad7ae.png)

### 実験０：テキストの追加
そんなに難しくなく追加できました。コンテンツを登録するとメタデータができてくる。登録したデータの共有範囲の設定も可能（shareから）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/2a9bb4cc-e86f-15c2-a58f-88809c046629.png)

### 実験１：Shape fileの追加
ログインして、Add resourceからデータを追加できます。NaturalEarthからダウンロードした30度のグリッドデータをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/84ecc4fe-8a7f-7b09-fde7-3be6fb066cff.png)

追加できたました。ブルーの線で見られます。せっかくなのでshare（共有）範囲の設定などもします。作っておいたグループなども追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/a75aea2c-1616-e5e9-906c-f6409dd62bc9.png)


### 実験２： ArcGISサーバーのMapService(ArcGIS REST APIに準じた Map Server)をRemote servicesとして追加してみる。
ここから、少しマニアックな方向に進みます。EsriのマップサーバーのコンテンツをGeoNodeでも消費したいので、少し試してみます。

Remote services に Esri Map Serviceを追加してみます。**今回の実験では内部のArcGIS Onlineポータルサイトにあるデータのうち、 Access Tokenでコンテンツが保護されていないデータで実験しました。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/604b7fe1-a089-7ccc-291f-ef1d6dab6524.png)
とサービスのURLを指定すると、GeoNodeがEsriサーバーにアクセスしてレイヤを調べるようで、そのあとに追加レイヤ選択の画面に行きます。Esri Map Serverを指定しても、データの登録は実質的にレイヤごとにGeoNodeに追加するということになるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/a7f31117-4c6e-5a46-3854-0ca89930a5fc.png)

試しにいくつか追加してみました。レイヤごとに登録されているほか、ArcGIS REST MapServerとしても登録されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/b34730da-fe07-3f37-ad4c-1785c02164f1.png)

レイヤとしても読み込めています。（背景図は小縮尺しかないのですが、飛行場マークが登録したレイヤです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/54e5a8f4-a6e5-77d3-2242-b0530f5344b3.png)

### （参考）ArcGIS REST API の Map Serviceについて
ここで、少し復習ですが、ArcGIS REST APIについては、以下のページを確認しておきましょう。

https://developers.arcgis.com/rest/services-reference/enterprise/map-service.htm

各コンテンツへは以下のような感じでアクセスできるはずです。
- **Map service over view:** （サーバーの場所）/arcgis/rest/services/（マップサービス名）/MapServer?f=pjson
- **All layers and tables:** （サーバーの場所）/arcgis/rest/services/（マップサービス名）/MapServer/layers?f=pjson
- **Layer overview (e.g. layer 6):** （サーバーの場所）/arcgis/rest/services/（マップサービス名）/MapServer/6?f=pjson
- **Raster tile:** （サーバーの場所）/arcgis/rest/services/（マップサービス名）/MapServer/tile/{z}/{y}/{x}

## 4-2. GeoNodeにおけるタイルの利用について
GeoNode の ユーザーインターフェースはOpenLayersだと書いてありましたが、Datasetとしてラスタタイルやベクトルタイルを登録できませんでした。
ただし、ラスタタイルについては、どこかで調整すればベースマップの一つとして利用できるようです（私の同僚が作業をしていました）。以下はArcRESTのMap Serviceのタイルではないですが、zxyラスタタイルを背景図にした例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/b4bd7264-56e5-01fd-2526-8f06b15fbee4.png)
ベクトルタイルはまだベースマップとしても使えないという話でしたが、OpenLayersがインターフェースならベクトルタイルも使える可能性はあるかもしれませんね。ただし、MapLibre GL JSやMapbox GL JSなどのスタイル表現は、OpenLayersではそのまま使えないので、まずはOpenLayersでのベクトルタイルの表示（MapLibre/Mapbox用スタイルの利用）について検討を進める必要がありそうです。

## 4-3. GeoNodeにあるデータを使う
今度はGeoNodeに登録されたデータを使うケースについて見てきます。

### テスト１： GeoNodeに登録したシェープファイル
レイヤを開くとデータを見られます。WMSリクエストでデータを読み込んでいることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/178798b1-e551-c02e-5bdc-4b73bb06725b.png)


GeoNodeに登録したシェープファイルのデータダウンロードのURLは以下の通りでした。登録したシェープファイルのダウンロードはうまくいきます。
https://(サーバー名)/datasets/geonode:ne_50m_graticules_30/dataset_download

しかし、GeoNodeに登録したシェープファイルからのGeoJSON出力は失敗しました。何かどこか設定がおかしいのかもしれません。今後、要チェックです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/3092b1fe-914c-e83e-9842-c842cb801c6b.png)

###  テスト２： GeoServerに登録されているデータを使う
過去に同僚がデータベースからGeoServerに入れて、そのあとGeoNodeからアクセスしているというデータベースがあるので、これについて見てみます。

レイヤとしてGeoNode上で閲覧することができます。こちらもWMSのリクエストを通してレイヤにアクセスしていることがわかります。プロトコルはhttp1.1ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/b4df26f3-76bb-5edc-4ece-8b5df79a3669.png)

データアクセスの詳細を見てみます。サインインすると消えてしまうときがあるのですが、データをみるとViewというタブがでています。ここからView Metadataを選んで、Referenceあたりを観察します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/6057e9be-388c-ebba-d82e-e543ed06a6dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/97e3bfac-224a-3d52-aa8a-574d745236d4.png)

#### 各ファイルへのアクセス
このGeoServerに登録していたレイヤをチェックしたところ、各データへのURLは以下の通りでした。GeoServerのAPIでデータを返しているということが何となくわかります。
* **Original Dataset (zip):** https://(サーバー名)/download/80
* **JPEG:** http://(サーバー名)/geoserver/ows?service=WMS&request=GetMap&layers=krihs_ws%3Abndp&format=image%2Fjpeg&height=550&width=1209&srs=EPSG%3A4326&bbox=-181.78106689453125%2C-81.13282775878906%2C181.755615234375%2C84.1603775024414
* **PDF:** http://(サーバー名)/geoserver/ows?service=WMS&request=GetMap&layers=krihs_ws%3Abndp&format=application%2Fpdf&height=550&width=1209&srs=EPSG%3A4326&bbox=-181.78106689453125%2C-81.13282775878906%2C181.755615234375%2C84.1603775024414
* **PNG:** http://(サーバー名)/geoserver/ows?service=WMS&request=GetMap&layers=krihs_ws%3Abndp&format=image%2Fpng&height=550&width=1209&srs=EPSG%3A4326&bbox=-181.78106689453125%2C-81.13282775878906%2C181.755615234375%2C84.1603775024414
* **Zipped Shapefile:** http://(サーバー名)/geoserver/ows?service=WFS&version=1.0.0&request=GetFeature&typename=krihs_ws%3Abndp&outputFormat=SHAPE-ZIP&srs=EPSG%3A4326&format_options=charset%3AUTF-8
* **GML 2.0:** http://(サーバー名)/geoserver/ows?service=WFS&version=1.0.0&request=GetFeature&typename=krihs_ws%3Abndp&outputFormat=gml2&srs=EPSG%3A4326
* **GML 3.1.1:** http://(サーバー名)/geoserver/ows?service=WFS&version=1.0.0&request=GetFeature&typename=krihs_ws%3Abndp&outputFormat=text%2Fxml%3B+subtype%3Dgml%2F3.1.1&srs=EPSG%3A4326
* **CSV:** http://(サーバー名)/geoserver/ows?service=WFS&version=1.0.0&request=GetFeature&typename=krihs_ws%3Abndp&outputFormat=csv&srs=EPSG%3A4326
* **Excell:** http://(サーバー名)/geoserver/ows?service=WFS&version=1.0.0&request=GetFeature&typename=krihs_ws%3Abndp&outputFormat=excel&srs=EPSG%3A4326
* **GeoJSON:** http://(サーバー名)/geoserver/ows?service=WFS&version=1.0.0&request=GetFeature&typename=krihs_ws%3Abndp&outputFormat=json&srs=EPSG%3A4326&srsName=EPSG%3A4326
* **Legend:** https://(サーバー名)/geoserver/ows?service=WMS&request=GetLegendGraphic&format=image/png&WIDTH=20&HEIGHT=20&LAYER=krihs_ws:bndp&STYLE=default_point&version=1.3.0&sld_version=1.1.0&legend_options=fontAntiAliasing:true;fontSize:12;forceLabels:on
* **Thumbnail:** https://(サーバー名)/uploaded/thumbs/dataset-d1c3c168-fde2-4122-bde6-80d2494c7c69-thumb-3ecf4ef2-f9c2-4116-a546-5f19998163e4.jpg

httpプロトコルでリクエストしているところと、httpsでリクエストとするところが混在するのは不思議です。

#### 各ファイルへのアクセスとAccessTokenの関係
GeoNodeでは、レイヤを閲覧する際に、リクエストURLの中にaccess_tokenを入れてデータへのアクセスをコントロールしようとしているようです（共有設定（share）への対応のためか？？）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/c4eba089-0c70-383d-4e1b-ba9b8202a7fb.png)

しかし、この前の章で、geoserverが持っているデータへのアクセスURLを確認しました。なので、例えば、上図のURLの中からaccess_tokenの部分を消してみたのですが、それでもデータが見られました。GeoServer側でデータを登録したときには、GeoNodeのAccessTokenでのアクセスコントロールは難しいのでしょうか。ここはもう少し調べないといけない課題です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/1786ab36-3d81-f352-ae55-d5120288b759.png)



###  テスト３： Remote resourceで登録したEsriのMapService
レイヤとしては普通にみられていました。ただし、登録したEsri の Map Serviceでは、GeoJSONなどが取れないものもありそうです。（png以降のAPIリクエストがそもそもうまくいっていない様子）。こちらももう少し研究します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/48124a66-07ef-f319-4746-76b03c2bce6d.png)



# まとめ
ということで、初めてGeoNodeを見てみてみました。少し独特な切り口からデータの登録やアクセスを試してみました。

# 謝辞
GeoNodeパイロットシステムを構築してくれた同僚に感謝します。

# 参考
https://geonode.org/

https://docs.geonode.org/en/master/

https://developers.arcgis.com/rest/services-reference/enterprise/map-service.htm