LoginSignup
2
2

More than 3 years have passed since last update.

タイルサーバーを作りたい

Last updated at Posted at 2019-12-10

ドローンの航空写真からタイル画像を作成するサーバーを作りたい

OpenArerial Mapで十分利用可能だが、自分専用のタイルサーバが欲しくなったので、DRONEBIRD専用のタイルサーバを作ってみようと思う。
他にも、オープンデータで公開された自治体の航空写真を取り込むことによりWebでの二次利用ができればと思っています。

タイル画像とは

ズームレベルごとに地球を分割。各タイルを256x256pixcelに分割しブラウザで地図を見るときの通信量を絞る機能
詳しい内容は、説明URLを参考に 正方形タイルによる地図の表現:TrailNote

どうやって作るのか

QGISを使う場合

QGISのプラグインのQMetaTileツールを使って作成

GDALツールを使う場合

GDALのgdal2tilesを使って作成 gdal2tiles


gdal2tiles.py [-p profile] [-r resampling] [-s srs] [-z zoom]
              [-e] [-a nodata] [-v] [-q] [-h] [-k] [-n] [-u url]
              [-w webviewer] [-t title] [-c copyright]
              [--processes=NB_PROCESSES]
              [-g googlekey] [-b bingkey] input_file [output_dir]

なんちゃってOpenAerialMapを目指して

いままで作った作品

毎年2月に実際される杉戸町の防災訓練にてドローンを飛ばしてQGISでタイルを作ってからディレクトリごとSFTPにてサーバーにアップしてました。この手業にて作成したのが下記のサイトです。

 杉戸町防災訓練

どういう機能が必要なのか

h

まず作るもの

  • GeoTIFFのアップロード

    • GeoTIFFから情報を取得(測地系、投影、緯度経度情報等)
    • タイル画像にタイトルを付与
    • 切り出すタイルのズーム指定
    • タイルのライセンスを指定
  • タイルの切り出し

    • タイルの切り出しディレクトリを作成
    • タイルの切り出し処理
    • タイルのURLを作成
  • タイルのURLを表示し閲覧可能にする

    • タイル外の画像に対する処理
      • mod_rewriteによる処理
    • タイルURLを外部から使えるようにする
    • OSMでの編集リンクの作成 iDのみ
    • もとのGeoTIFFをダウンロードできるようにする
  • LeafletもしくはMapboxにてタイルのレイヤーを閲覧できるようにする

現時点で作らない機能

  • アカウント処理(一律で公開します。個別対応しません)
  • 削除機能(消したかったら僕が連絡後、直接サーバーで対処します。)

使用する言語やサーバー環境など

開発環境

  • Virtualbox(CentOS 7系)

  • インフラ側

    • apache (リバースプロキシーとして)
    • Django + Geo拡張
    • Postgresql + PostGIS (GdalはPostGISに同梱されるものを使用)
  • フロント側

    • Python 3.7
    • Leaflet
    • Javascript

など

geotiffの情報取得

gdalinfo


gdalinfo ~/openev/utm.tif
Driver: GTiff/GeoTIFF
Size is 512, 512
Coordinate System is:
PROJCS["NAD27 / UTM zone 11N",
    GEOGCS["NAD27",
        DATUM["North_American_Datum_1927",
            SPHEROID["Clarke 1866",6378206.4,294.978698213901]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",-117],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1]]
Origin = (440720.000000,3751320.000000)
Pixel Size = (60.000000,-60.000000)
Corner Coordinates:
Upper Left  (  440720.000, 3751320.000) (117d38'28.21"W, 33d54'8.47"N)
Lower Left  (  440720.000, 3720600.000) (117d38'20.79"W, 33d37'31.04"N)
Upper Right (  471440.000, 3751320.000) (117d18'32.07"W, 33d54'13.08"N)
Lower Right (  471440.000, 3720600.000) (117d18'28.50"W, 33d37'35.61"N)
Center      (  456080.000, 3735960.000) (117d28'27.39"W, 33d45'52.46"N)
Band 1 Block=512x16 Type=Byte, ColorInterp=Gray

取得して必要なのは、測地系、中心位置、地図の範囲です

iDでのリンクの作り方
http://www.openstreetmap.org/edit?editor=id#map={zoom}/{中心緯度}/{中心経度}&background=custom:https://example.com/path/to/{z}/{x}/{y}.png

のリンクを作成

作ったものをGitHubにて公開

今後やりたいこと

  • 大容量ファイルのアップロードの工夫
  • アプリのDocker版の作成
  • DB連携
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2