当缓存不可用时,如何在 Gmap.net 中以离线模式使用 mbtile 地图?
How to use mbtile map in offline mode in Gmap.net when cache is not available?
我正在使用 Gmap.net,我已经在其中成功实现了 mbtile 地图。当第一次在“C:\Users\manish.jain\AppData\Local\GMap.NET”中创建文件夹 GMap.NET 时,这在机器上工作正常系统中可用。此时;有多个文件夹创建如下:
- DllCache
- 地理编码器缓存
- IpGeoCacheDB
- leafletjs
- 地标缓存
- 路由缓存
- TileDBv5
- 网址缓存
但是当同样的事情在离线模式下执行时,只有两个文件夹创建在与以下位置相同的位置:
- DllCache
- TileDBv5
在这种情况下,我在地图的每个图块上都收到消息
"Exception:Buffer cannot be null. Paremeter name: buffer"
我附上了相同的快照。
我的要求是始终在离线模式下完成所有地图工作,因为客户端没有可用的互联网连接。
请让我知道所有这些文件夹的含义和用途以及此问题的解决方案。我已经将这行代码用于地图模式:
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 或 Whosebug 中找不到任何解决方案。请帮忙!
在尝试打开 SQLite Connection 时出现问题后,我花了宝贵的 4-5 个小时终于找到了这个问题的解决方案。我得到一个异常 "Cannot open database file"。此连接已使用以下行解决,其中需要在创建连接实例时传递 parseViaFramework,如下所示:
using (SQLiteConnection conn = new SQLiteConnection(String.Format("Data Source={0};Version=3;", Path),true))
里面 MBTileHelper.cs class :
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;
}
我正在使用 Gmap.net,我已经在其中成功实现了 mbtile 地图。当第一次在“C:\Users\manish.jain\AppData\Local\GMap.NET”中创建文件夹 GMap.NET 时,这在机器上工作正常系统中可用。此时;有多个文件夹创建如下:
- DllCache
- 地理编码器缓存
- IpGeoCacheDB
- leafletjs
- 地标缓存
- 路由缓存
- TileDBv5
- 网址缓存
但是当同样的事情在离线模式下执行时,只有两个文件夹创建在与以下位置相同的位置:
- DllCache
- TileDBv5
在这种情况下,我在地图的每个图块上都收到消息
"Exception:Buffer cannot be null. Paremeter name: buffer"
我附上了相同的快照。
我的要求是始终在离线模式下完成所有地图工作,因为客户端没有可用的互联网连接。
请让我知道所有这些文件夹的含义和用途以及此问题的解决方案。我已经将这行代码用于地图模式:
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 或 Whosebug 中找不到任何解决方案。请帮忙!
在尝试打开 SQLite Connection 时出现问题后,我花了宝贵的 4-5 个小时终于找到了这个问题的解决方案。我得到一个异常 "Cannot open database file"。此连接已使用以下行解决,其中需要在创建连接实例时传递 parseViaFramework,如下所示:
using (SQLiteConnection conn = new SQLiteConnection(String.Format("Data Source={0};Version=3;", Path),true))
里面 MBTileHelper.cs class :
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;
}