spatialiteにイメージをimport(rasterlite2 その1 失敗編)

某自治体全域の航空写真をタイル画像にしてGIS上で使用する為にspatialiteにインポートの記録(失敗談)。

当初はブログ「waigani’s diary」を参考にrasterliteを使用する予定だったが、windows版のバイナリがなくなっていたために断念。
※「waigani’s diary」は合同会社MIERUNEの方が書かれているとのことなので朝日さんでしょうか

rasterliteの後継「rasterlite2」を使用。

今回インポート対象の画像はGIOTIFFをJPEGに変換したファイル。(もちろんワールドファイルもあり)
JPEGもGEOTIFFを同様にgdalinfo.exeでファイルの詳細情報を確認できる。

gdalinfo 2135.jpg

Driver: JPEG/JPEG JFIF
Files: 2135.jpg
       2135.jgw
Size is 5000, 3750
Coordinate System is `'
Origin = (-42400.000000000000000,-48000.000000000000000)
Pixel Size = (0.160000000000000,-0.160000000000000)
Metadata:
  EXIF_BitsPerSample=8 8 8
  EXIF_ColorSpace=65535
  EXIF_Compression=1
  EXIF_DateTime=2016:02:26 13:56:17
  EXIF_Orientation=1
  EXIF_PhotometricInterpretation=2
  EXIF_PixelXDimension=5000
  EXIF_PixelYDimension=3750
  EXIF_PlanarConfiguration=1
  EXIF_ResolutionUnit=2
  EXIF_SamplesPerPixel=3
  EXIF_Software=Adobe Photoshop CS5.1 Windows
  EXIF_XResolution=(72)
  EXIF_YResolution=(72)
Image Structure Metadata:
  COMPRESSION=JPEG
  INTERLEAVE=PIXEL
  SOURCE_COLOR_SPACE=YCbCr
Corner Coordinates:
Upper Left  (  -42400.000,  -48000.000)
Lower Left  (  -42400.000,  -48600.000)
Upper Right (  -41600.000,  -48000.000)
Lower Right (  -41600.000,  -48600.000)
Center      (  -42000.000,  -48300.000)
Band 1 Block=5000x1 Type=Byte, ColorInterp=Red
  Overviews: 2500x1875, 1250x938, 625x469
  Image Structure Metadata:
    COMPRESSION=JPEG
Band 2 Block=5000x1 Type=Byte, ColorInterp=Green
  Overviews: 2500x1875, 1250x938, 625x469
  Image Structure Metadata:
    COMPRESSION=JPEG
Band 3 Block=5000x1 Type=Byte, ColorInterp=Blue
  Overviews: 2500x1875, 1250x938, 625x469
  Image Structure Metadata:
    COMPRESSION=JPEG

rasterlite2のサイトhttps://www.gaia-gis.it/fossil/librasterlite2から以下をダウンロード。

  • mod_rasterlite2.dll
  • http://www.gaia-gis.it/gaia-sins/rasterlite2-win-x86/mod_rasterlite2-1.0.0-rc0-win-x86.7z
    mod_rasterlite2.dllはsqliteにラスタ機能を追加する拡張モジュール。
    ※SQLITEは関数:sqlite3_create_functionを利用してSQLから呼べる関数を登録できる。
    例)SQLITE内にCoverageを作成する「SELECT RL2_CreateCoverage(): 」の「RL2_CreateCoverage」はmod_rasterlite2.dllが提供する。

  • rl2tool.exe
  • http://www.gaia-gis.it/gaia-sins/rasterlite2-win-x86/rl2tool-1.0.0-rc0-win-x86.7z
    rl2tool.exeはラスタファイルをDBに追加するためのツール。
    ※rl2tool.exeはmod_rasterlite2.dllが提供する関数をコールするためのラッパー。

作業用のディレクトリにmod_rasterlite2.dllとその関連dll、rl2tool.exe、sqlite3.exe、mod_spatialite.dllを配置。
環境変数に「SPATIALITE_SECURITY=relaxed」を設定

以降はRasterlite2のドキュメント「Tutorial: building and testing the Planet Earth sample」を参考に作業

インポート対象のDB「test.sqlite」を作成してsqliteを起動

sqlite3 work.sqlite

拡張DLLを呼び出し

sqlite> select load_extension('mod_rasterlite2');
sqlite> select load_extension('mod_spatialite');

空間データを使うために必要なテーブルを作成

sqlite> select initSpatialMetadata(1);
1
sqlite> select CreaterasterCoveragesTable();
1
sqlite> select CreateStylingTables();

Coverage作成

C:\work\pasco>rl2tool CREATE -db work.sqlite -src 2135.jpg -ext .jpg -cov test -srid 2451 -smp UINT8 -pxl RGB -cpr JPEG -res 0.0138888889

rl2_tool: request is CREATE
===========================================================
              DB path: raster.sqlite
             Coverage: test
          Sample Type: UINT8
           Pixel Type: RGB
      Number of Bands: 3
          Compression: JPEG (lossy)
  Compression Quality: 80
   Tile size (pixels): 512 x 512
                 Srid: 2451
Pixel base resolution: X=0.0138888889 Y=0.0138888889
===========================================================

     SQLite version: 3.8.5
 SpatiaLite version: 4.2.0
RasterLite2 version: 1.0.0-rc0

sqlite3_step() error: INSERT INTO raster_coverages "NOT NULL constraint failed: raster_coverages.strict_resolution"
restoring the DB to its previous state (ROLLBACK)

※上記で指定した解像度は間違っている

raster_coveragesテーブルの項目「strict_resolution」にはnullは設定できないとエラーが発生。

raster_coveragesの定義を確認すると、確かにstrict_resolutionはNOT NULLになっている。

※raster_coveragesテーブルは先ほど実行したCreaterasterCoveragesTableで作成しており、mod_spatialite.dllが提供する関数
※「rl2tool CREATE」は内部では mod_rasterlite2.dllのRL2_CreateCoverageを呼んでいる。
関数RL2_CreateCoverageの実装を確認すると確かにstrict_resolutionには何も設定していない。

よってエラーは避けられない