缓存不可用时,如何在Gmap.net的离线模式下使用mbtile地图?

时间:2019-05-15 05:30:28

标签: c# winforms gmap.net mbtiles

我正在使用已成功实现mbtile映射的Gmap.net。当系统中首次提供互联网连接时,当在“ C:\ Users \ manish.jain \ AppData \ Local \ GMap.NET ”中首次创建文件夹GMap.NET时,此方法在计算机中运行良好。此时;创建多个文件夹,如下所示:

  1. DllCache
  2. GeocoderCache
  3. IpGeoCacheDB
  4. leafletjs
  5. PlacemarkCache
  6. RouteCache
  7. TileDBv5
  8. UrlCache

但是在脱机模式下执行相同操作时,只有两个文件夹位于与以下位置相同的位置:

  1. DllCache
  2. TileDBv5

在这种情况下,我在地图的每个图块上都得到了消息

"Exception:Buffer cannot be null. Paremeter name: buffer"

我已附上相同的快照。 enter image description here

我的要求是始终在离线模式下完成所有地图工作,因为在客户端没有可用的互联网连接。

请让我知道所有这些文件夹的含义和目的以及此问题的解决方案。我已将以下代码行用于Map的模式:

MainMap.Manager.Mode = AccessMode.ServerAndCache;

并从以下定义的位置加载mbtile:

MainMap = new Demo.WindowsForms.Map();
MainMap.MapProvider = new MBTilesMapProvider(@"C:\\India.mbtiles");
MainMap.MinZoom = MainMap.MapProvider.MinZoom;
MainMap.MaxZoom = MainMap.MapProvider.MaxZoom;

我为此问题进行了大量搜索,但在google或stackoverflow中找不到任何解决方案。请帮忙!

1 个答案:

答案 0 :(得分:0)

最后,在花了宝贵的4-5个小时尝试打开SQLite Connection时出现问题之后,我得到了这个问题的解决方案。我因为“无法打开数据库文件”而遇到异常。使用以下行已解决了此连接,其中在创建连接实例时需要传递parseViaFramework,如下所示:

using (SQLiteConnection conn = new SQLiteConnection(String.Format("Data Source={0};Version=3;", Path),true))

MBTileHelper.cs内部类:

public byte[] GetTileStream(long x, long y, int zoom)
    {
        byte[] retval = null;
        try
        {
            //using (SQLiteConnection conn = new SQLiteConnection(String.Format("Data Source={0};Version=3;", Path)))
            using (SQLiteConnection conn = new SQLiteConnection(String.Format("Data Source={0};Version=3;", Path),true))
            {
                conn.Open(); // Here I was getting an exception.
                using (SQLiteCommand cmd = new SQLiteCommand() { Connection = conn, CommandText = String.Format("SELECT * FROM tiles WHERE tile_column = {0} and tile_row = {1} and zoom_level = {2};", x, y, zoom) })
                {
                    SQLiteDataReader reader = cmd.ExecuteReader();
                    if (reader.Read())
                    {
                        byte[] bytes = reader["tile_data"] as byte[];
                        retval = bytes;
                    }
                }
            }
        }
        catch(Exception ex)
        {
            retval = null;
        }
        return retval;
    }