2025/04/11 17:44 Maps with Django⁽³⁾: GeoDjango, Pillow and GPS

やっほー、ロボ子!今日はDjangoとGeoDjangoでWebマップを作る話のじゃ。

博士、こんにちは。Djangoで地図ですか、面白そうですね!どのような内容なのでしょう?

ふむ、PythonのDjango WebフレームワークとGeoDjangoモジュールを使って、Pillowで画像からGPS情報を抽出して、画像付きWebマップを作るみたいじゃぞ。

なるほど、画像から位置情報を取得して、それを地図に表示するんですね。具体的にはどんな手順になるんですか?

まず、Djangoで地図を作るには、Python 3、仮想環境、Django、GDAL、SpatiaLiteが必要みたいじゃな。バージョンは3.13以上が良いみたいじゃぞ。

結構いろいろ必要なんですね。GDALとSpatiaLiteは初めて聞きました。

GDALは地理空間データ抽象化ライブラリで、SpatiaLiteはSQLiteの空間拡張じゃ。これらを使って、地図データを扱えるようにするのじゃ。

なるほど、それで、プロジェクトの作成手順はどんな感じですか?

`python -m django startproject mymap`で`mymap`プロジェクトを作って、`python -m django startapp markers`で`markers`アプリを作るんじゃ。その後、`settings.py`でGeoDjangoと`markers`をアクティブにするみたいじゃな。

`settings.py`の設定が重要そうですね。SpatiaLiteエンジンもアクティブにする必要があるんですね。

そうじゃ!そして、`Marker`モデルを定義するんじゃ。`name`、`location`、`image`フィールドを作るぞ。`location`は`PointField`で位置情報を格納、`image`は`ImageField`で画像ファイルを格納するんじゃ。

`PointField`ですか。GeoDjangoならではのフィールドですね。Django adminインターフェースで簡単にマーカーを追加できるのも便利そうです。

Webマップの追加は、`templates/`に`map.html`を作って、LeafletのJavaScriptとCSSをリンクさせるんじゃ。`static/`に`map.js`を作って、OpenStreetMapレイヤーを初期化して地図にフックさせるぞ。

Leafletを使うんですね。`MapView`クラスで`markers`をGeoJSONとしてコンテキストに追加して、URLを設定すれば、Webブラウザで地図が表示される、と。

その通り!そして、Pillowライブラリを使って、画像からGPS情報を抽出するんじゃ。画像のEXIFデータからGPS情報を取得して、DMS形式からDD形式に変換するぞ。

DMS形式からDD形式への変換は、ちょっと面倒そうですが、正確な位置情報を得るためには重要ですね。

アップロードされた画像から位置情報を抽出して、`Marker`モデルに保存するんじゃ。`validate_gpsinfo`バリデーターを追加して、画像にGPS情報が含まれているかを確認するぞ。

バリデーターでGPS情報があるか確認するのは良いですね。`Marker`モデルの保存メソッドをカスタマイズして、画像から抽出したポイントを位置フィールドに保存するんですね。

最後に、マーカー管理画面を編集して、位置フィールドを読み取り専用にするんじゃ。これで、画像から自動で位置情報が設定されるようになるぞ。

なるほど、画像アップロードだけで地図にマーカーが表示されるWebマップが作れるんですね。DjangoとGeoDjango、Pillowの組み合わせ、勉強になります!

そうじゃろ!ところでロボ子、地図記号の「お寺」と「病院」って、どう違うか知ってるか?

えっと…、お寺は精神的な癒やしを、病院は肉体的な癒やしを提供する場所、でしょうか…?

ブー!正解は、お寺は屋根がギザギザ、病院は屋根が十字じゃ!

…博士、それ、地図記号の形の違いですよね…。(苦笑)
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
