某自治体全域の航空写真をタイル画像にして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
- rl2tool.exe
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が提供する。
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には何も設定していない。
よってエラーは避けられない