c# - 当缓存不可用时,如何在 Gmap.net 的离线模式下使用 mbtile 地图?
问题描述
我正在使用 Gmap.net,其中我已成功实现了 mbtile 地图。当系统中互联网连接可用时,首次在“ C:\Users\manish.jain\AppData\Local\GMap.NET ”中创建文件夹 GMap.NET 时,这在机器上运行良好。此时; 有多个文件夹创建如下:
- DllCache
- 地理编码器缓存
- IpGeoCacheDB
- 传单
- 地标缓存
- 路由缓存
- TileDBv5
- 网址缓存
但是,当在脱机模式下执行相同的操作时,只会在同一位置创建两个文件夹:
- DllCache
- TileDBv5
在这种情况下,我在地图的每个图块上都收到了消息
"Exception:Buffer cannot be null. Paremeter name: buffer"
我的要求是始终在离线模式下完成所有地图工作,因为在客户端没有可用的互联网连接。
请让我知道所有这些文件夹的含义和目的以及此问题的解决方案。我已将这行代码用于 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 中找不到任何解决方案。请帮忙!
解决方案
最后,在尝试打开 SQLite 连接时出现问题的宝贵 4-5 小时后,我得到了这个问题的解决方案。我收到“无法打开数据库文件”的异常。此连接已使用以下行解决,其中 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;
}
推荐阅读
- java - 如何在 Spring Boot 中创建自定义 @PreAuthorize MethodSecurity?
- javascript - 修改函数内全局变量的值
- java - Android Retrofit response.body() 始终为空
- orocommerce - 为 OroCommerce 获取不记名令牌返回错误 405 方法不允许
- python - 在 Numpy 中添加 (2,) 和 (2, 1) 数组
- javascript - 一种使用 node.js 直接对等数据传输的方法?
- spring - spring 功能绑定在spring cloud中将多个输入命名为一个输出
- javascript - 两个孩子有相同的钥匙……反应(离子),虽然钥匙是唯一的
- python - 我正在尝试使用 GUI 进行快速排序,但我的代码已损坏
- android - Android广播接收器在应用程序未运行或未启动时甚至在运行时都不会触发