Skip to content

Instantly share code, notes, and snippets.

@ajesler
Last active June 30, 2023 22:40
Show Gist options
  • Select an option

  • Save ajesler/b920d71bf38f03625d55 to your computer and use it in GitHub Desktop.

Select an option

Save ajesler/b920d71bf38f03625d55 to your computer and use it in GitHub Desktop.

Revisions

  1. ajesler revised this gist Jul 18, 2015. 1 changed file with 46 additions and 48 deletions.
    94 changes: 46 additions & 48 deletions mbtiles.rb
    Original file line number Diff line number Diff line change
    @@ -1,68 +1,66 @@
    require 'sqlite3'

    # https://github.com/mapbox/mbtiles-spec/blob/master/1.1/spec.md
    require 'sqlite3'

    class Mbtiles
    attr_reader :tile_format, :db_file_name
    attr_reader :tile_format, :db_file_name

    def initialize(db_file_name, format=:png)
    @db_file_name = db_file_name
    load_database(db_file_name)
    def initialize(db_file_name, format=:png)
    @db_file_name = db_file_name
    load_database(db_file_name)

    @tile_format = read_tile_format
    end
    end

    def close
    @db.close
    end
    def close
    @db.close
    end

    def has_tile?(z, x, y)
    @db.get_first_value(SQL_MATCHING_TILE_COUNT, z, x, y) != 0
    end
    def has_tile?(z, x, y)
    @db.get_first_value(SQL_MATCHING_TILE_COUNT, z, x, y) != 0
    end

    def tile(z, x, y)
    def tile(z, x, y)
    @db.get_first_value(SQL_READ_TILE, z, x, y)
    end
    end

    def save(z, x, y, data)
    @db.execute(SQL_INSERT_TILE, z, x, y, data)
    end
    def save(z, x, y, data)
    @db.execute(SQL_INSERT_TILE, z, x, y, data)
    end

    def delete(z, x, y)
    @db.execute(SQL_DELETE_TILE, z, x, y)
    end
    def delete(z, x, y)
    @db.execute(SQL_DELETE_TILE, z, x, y)
    end

    def metadata
    rows = @db.execute(SQL_READ_METADATA)
    rows.each.with_object({}) { |row, hash| hash[row[0]] = row[1] }
    end
    def metadata
    rows = @db.execute(SQL_READ_METADATA)
    rows.each.with_object({}) { |row, hash| hash[row[0]] = row[1] }
    end

    private
    private

    def load_database(db_file_name)
    db_exists = File.exists?(db_file_name)
    def load_database(db_file_name)
    db_exists = File.exists?(db_file_name)
    @db = SQLite3::Database.new(db_file_name)

    if !db_exists
    @db.execute(SQL_CREATE_TILES_TABLE)
    @db.execute(SQL_CREATE_METADATA_TABLE)

    @db.execute(SQL_INSERT_METADATA, "format", format.to_s)
    end
    end

    def read_tile_format
    @db.get_first_value(SQL_READ_TILE_FORMAT)
    end

    SQL_CREATE_TILES_TABLE = "CREATE TABLE IF NOT EXISTS tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob)"
    SQL_INSERT_TILE = "INSERT INTO tiles (zoom_level, tile_column, tile_row, tile_data) VALUES(?, ?, ?, ?)"
    SQL_READ_TILE = "SELECT tile_data FROM tiles WHERE zoom_level=? and tile_column=? and tile_row=?"
    SQL_DELETE_TILE = "DELETE FROM tiles WHERE zoom_level=? and tile_column=? and tile_row=?"
    SQL_CREATE_METADATA_TABLE = "CREATE TABLE IF NOT EXISTS metadata (name text, value text)"
    SQL_INSERT_METADATA = "INSERT INTO metadata (name, value) VALUES (?, ?)"
    SQL_READ_METADATA = "SELECT name, value FROM metadata"
    SQL_READ_TILE_FORMAT = "SELECT value FROM metadata where name = 'format'"
    SQL_MATCHING_TILE_COUNT = "SELECT COUNT(*) FROM tiles WHERE zoom_level=? and tile_column=? and tile_row=?"
    @db.execute(SQL_CREATE_TILES_TABLE)
    @db.execute(SQL_CREATE_METADATA_TABLE)

    @db.execute(SQL_INSERT_METADATA, "format", format.to_s)
    end
    end

    def read_tile_format
    @db.get_first_value(SQL_READ_TILE_FORMAT)
    end

    SQL_CREATE_TILES_TABLE = "CREATE TABLE IF NOT EXISTS tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob)"
    SQL_INSERT_TILE = "INSERT INTO tiles (zoom_level, tile_column, tile_row, tile_data) VALUES(?, ?, ?, ?)"
    SQL_READ_TILE = "SELECT tile_data FROM tiles WHERE zoom_level=? and tile_column=? and tile_row=?"
    SQL_DELETE_TILE = "DELETE FROM tiles WHERE zoom_level=? and tile_column=? and tile_row=?"
    SQL_CREATE_METADATA_TABLE = "CREATE TABLE IF NOT EXISTS metadata (name text, value text)"
    SQL_INSERT_METADATA = "INSERT INTO metadata (name, value) VALUES (?, ?)"
    SQL_READ_METADATA = "SELECT name, value FROM metadata"
    SQL_READ_TILE_FORMAT = "SELECT value FROM metadata where name = 'format'"
    SQL_MATCHING_TILE_COUNT = "SELECT COUNT(*) FROM tiles WHERE zoom_level=? and tile_column=? and tile_row=?"
    end
  2. ajesler created this gist Jul 18, 2015.
    68 changes: 68 additions & 0 deletions mbtiles.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,68 @@
    require 'sqlite3'

    # https://github.com/mapbox/mbtiles-spec/blob/master/1.1/spec.md
    require 'sqlite3'

    class Mbtiles
    attr_reader :tile_format, :db_file_name

    def initialize(db_file_name, format=:png)
    @db_file_name = db_file_name
    load_database(db_file_name)

    @tile_format = read_tile_format
    end

    def close
    @db.close
    end

    def has_tile?(z, x, y)
    @db.get_first_value(SQL_MATCHING_TILE_COUNT, z, x, y) != 0
    end

    def tile(z, x, y)
    @db.get_first_value(SQL_READ_TILE, z, x, y)
    end

    def save(z, x, y, data)
    @db.execute(SQL_INSERT_TILE, z, x, y, data)
    end

    def delete(z, x, y)
    @db.execute(SQL_DELETE_TILE, z, x, y)
    end

    def metadata
    rows = @db.execute(SQL_READ_METADATA)
    rows.each.with_object({}) { |row, hash| hash[row[0]] = row[1] }
    end

    private

    def load_database(db_file_name)
    db_exists = File.exists?(db_file_name)
    @db = SQLite3::Database.new(db_file_name)

    if !db_exists
    @db.execute(SQL_CREATE_TILES_TABLE)
    @db.execute(SQL_CREATE_METADATA_TABLE)

    @db.execute(SQL_INSERT_METADATA, "format", format.to_s)
    end
    end

    def read_tile_format
    @db.get_first_value(SQL_READ_TILE_FORMAT)
    end

    SQL_CREATE_TILES_TABLE = "CREATE TABLE IF NOT EXISTS tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob)"
    SQL_INSERT_TILE = "INSERT INTO tiles (zoom_level, tile_column, tile_row, tile_data) VALUES(?, ?, ?, ?)"
    SQL_READ_TILE = "SELECT tile_data FROM tiles WHERE zoom_level=? and tile_column=? and tile_row=?"
    SQL_DELETE_TILE = "DELETE FROM tiles WHERE zoom_level=? and tile_column=? and tile_row=?"
    SQL_CREATE_METADATA_TABLE = "CREATE TABLE IF NOT EXISTS metadata (name text, value text)"
    SQL_INSERT_METADATA = "INSERT INTO metadata (name, value) VALUES (?, ?)"
    SQL_READ_METADATA = "SELECT name, value FROM metadata"
    SQL_READ_TILE_FORMAT = "SELECT value FROM metadata where name = 'format'"
    SQL_MATCHING_TILE_COUNT = "SELECT COUNT(*) FROM tiles WHERE zoom_level=? and tile_column=? and tile_row=?"
    end