using DevExpress.XtraMap; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.IO; using System.Threading.Tasks; using System.Data.SQLite; using System.Data.Common; using System.Runtime.InteropServices; using System.Windows.Forms; using Ips.Library.Basic; namespace Ips.Library.DxpLib { public class SqliteTileGenerator : IImageTileSource { public SqliteTileGenerator(string filename = null) { FileName = filename.IfNullOrWhitespace(DefaultDBTileFile); ConnectionString = string.Format("Data Source=\"{0}\";Page Size=32768;Pooling=True", FileName); } public static string DefaultDBTileFile = Path.Combine(IpsPath.RootDir,"AppData","map","map.dat"); public string Name => nameof(SqliteTileGenerator); public bool CanDisposeSourceImage => true; public string FileName { get; set; } public string ConnectionString { get; private set; } public int MapType { get; set; } = 1082287436;//MapConsts.NormalMapNum; public const string querySql = "SELECT Tile FROM TilesData WHERE id = (SELECT id FROM Tiles WHERE X={0} AND Y={1} AND Zoom={2} AND Type={3})"; public Image GetImage(int x, int y, int level, Size size) { Image ret = null; using (var con = new SQLiteConnection()) { con.ConnectionString = ConnectionString; con.Open(); using (var cmd = con.CreateCommand()) { cmd.CommandText = string.Format(querySql, x, y, level, MapType); using (DbDataReader rd = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess)) { if (rd.Read()) { long length = rd.GetBytes(0, 0, null, 0, 0); byte[] tile = new byte[length]; rd.GetBytes(0, 0, tile, 0, tile.Length); using (MemoryStream ms = new MemoryStream(tile, 0, tile.Length, false, true)) { ret = Image.FromStream(ms); } tile = null; } rd.Close(); } } } return ret; } } }