ArcGIS2Mbtiles


ArcGIS ServerのesriMapCacheStorageModeExplodedのキャッシュ (非コンパクト)をMBTileへ変換する

作成は下記記事を参照のこと(設定ファイルをExploded)

ArcGISでタイルを作成する方法

ついでにPNG最適化をしたければnQuantを使えばよいかも。
http://nquant.codeplex.com/

Nuget

Install-Package nQuant

あるいはPngCs
https://code.google.com/p/pngcs/

Tilesテーブルのみ
インデックス付与とか使用時考えると色々付加コードはあるが、とりあえずシンプルな状態
https://github.com/mapbox/mbtiles-spec/blob/master/1.1/spec.md

using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;

public class MBtileUtil
{
  private string m_DirPath = null;
  public MBtileUtil(string dirPath)
  {
    this.m_DirPath = dirPath;
  }//end method

  public void CreateInsert()
  {
    string path = Path.GetDirectoryName(this.m_DirPath);
    path = Path.Combine(path, "test.db");

    var con = new SQLiteConnection("Data Source=" + path + ";Version=3;");
    con.Open();
    string createTabSQL = "CREATE TABLE tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob);";
    string insertQuery = "INSERT INTO tiles (zoom_level,tile_column,tile_row,tile_data) VALUES (@1,@2,@3,@4);";

    using (con)
    using (var tran = con.BeginTransaction())
    using (var cmd = con.CreateCommand())
    {
      cmd.Transaction = tran;

      cmd.CommandType = System.Data.CommandType.Text;
      //テーブル作成
      cmd.CommandText = createTabSQL;
      cmd.ExecuteNonQuery();

      //挿入に変更
      cmd.CommandText = insertQuery;

      var paramL = cmd.CreateParameter();
      var paramR = cmd.CreateParameter();
      var paramC = cmd.CreateParameter();
      var paramImg = cmd.CreateParameter();
      paramL.ParameterName = "@1";
      paramR.ParameterName = "@2";
      paramC.ParameterName = "@3";
      paramImg.ParameterName = "@4";

      cmd.Parameters.AddRange(new SQLiteParameter[] { paramL, paramR, paramC, paramImg });

      IEnumerable<Match> test = this.getRegexFile();
      foreach (var item in test)
      {
        string filePath = item.Value;

        var sl = item.Groups["level"].Value;
        var sr = item.Groups["row"].Value;
        var sc = item.Groups["col"].Value;

        int level = Convert.ToInt32(sl);
        int row = Convert.ToInt32(sr, 16);
        int col = Convert.ToInt32(sc, 16);
        int gRow = (int)((Math.Pow(2, level) - 1) - row);

        byte[] data = File.ReadAllBytes(filePath);

        cmd.Parameters["@1"].Value = level;
        cmd.Parameters["@2"].Value = col;
        cmd.Parameters["@3"].Value = gRow;
        cmd.Parameters["@4"].Value = data;

        cmd.ExecuteNonQuery();

      }//end loop

      tran.Commit();
    }//end sqlite
  }//end method

  private IEnumerable<Match> getRegexFile()
  {
    string dirPath = this.m_DirPath;

    string[] files = Directory.GetFiles(dirPath, "*", SearchOption.AllDirectories);

    var reg = new Regex(@".*\\L(?<level>\d{2})\\R(?<row>[a-fA-F0-9]{8})\\C(?<col>[a-fA-F0-9]{8})\.(jpg|png)", RegexOptions.IgnoreCase | RegexOptions.Singleline);

    foreach (var file in files)
    {
      if (!reg.IsMatch(file))
      {
        Debug.Print("NOT MATCH:" + file);
        continue;
      }
      yield return reg.Match(file);
    }//end file loop
    files = null;

    yield break;
  }

}//end class
カテゴリー: 開発 タグ: , パーマリンク