2015.8.22
1.更新了谷歌地球卫星地图的路径,可以访问高清卫星地图了。更新后,必须重新生成下GMap.NET.Core才能有效果
2.关于如何获取谷歌地图和其它地图的地图路径:
点击Chrome浏览器的菜单(地址栏右侧,图标是三个横线的)按钮,选择:工具 -> 开发者工具,如下所示:
在开发者工具中,切换到Network(网络请求)页,此时工具会列出所有发生了的网络请求,请随便放缩一下地图,您会看到产生了很多新请求,标准的地图图片请求都是256x256大小的标准图片,选择其中的任意一个地图图片请求,右侧Preview就会列出该图片的网址和预览图。(注意:如果请求太多不好找,建议用底部的“Images”过滤功能来只显示图片,或者先用清空按钮清除现有请求,再缩放下地图刷新出新的图片)。
监测到的Google地图的图片请求如下所示:

3.如何配制地图源:http://www.miocool.com/forums/viewtopic.php?f=16&t=251

2015.10.30
1.谷歌卫星地图链接:http://www.google.cn/maps/vt?lyrs=s@187&gl=cn&x={5}&y={7}&z={8}
2016.1.24
1.偿试了对缓存路径的更改,把SQlitePureImageCache的缓存的internal更改为public,从而可以单独创建缓存,测试成功
2.在MainForm中创建了SQlite的缓存文件,更改了缓存的数据库,然后把primate主缓存改为现有路径,测试成功。
3.编写了一个搜索指定文件路径下的全部png的文件的模块,然后根据搜索到的路径来解析到缩放层级和X\Y编号,注意,因为陕西客户提供的切图的原点与GMAP.NET中的原点不一样,因些要找到所有当前层级的Y方向的瓦片数量,然后再减去从路径中解析到的Y编号再减1,这样得到正常的X\Y值。然后再把批量导入SQlite数据库中,这样便可以进行动态加载和浏览了!

2016.1.26
1.进展非常的顺利,成功添加了百度、高德和谷歌混合地图等,GIS数据方面非常的丰富。
2.关于地图瓦片图层方面,找到一篇非常强大的文章:http://www.360doc.com/content/14/0916/18/7931690_409974860.shtml
文章描述了地图体系结构和各种地图的瓦片链接计算公式,还提供了相应的瓦片路径。但在添加百度地图时发现,百度地图能显示,但瓦片是混乱的,估计是瓦片的索引方式不一样的原因。于是在网上搜索百度瓦片,又搜索到一篇非常好的文档,提供了如何在GMAP.NET中添加的代码类。我试着导入GMAP.NET,非常成功。
3.以下为百度地图的类代码,其中MakeTileImageUrl的代码和谷歌地图的不太一样,路径格式也有些不一样。using System;
using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.Projections;

namespace GMap.NET.MapProviders
{
public abstract class BaiduMapProviderBase : GMapProvider
{
public BaiduMapProviderBase()
{
MaxZoom = null;
RefererUrl = “http://map.baidu.com”;
Copyright = string.Format("?{0} Baidu Corporation, ?{0} NAVTEQ, ?{0} Image courtesy of NASA", DateTime.Today.Year);
}

    public override PureProjection Projection{get { return MercatorProjection.Instance; }}GMapProvider[] overlays;public override GMapProvider[] Overlays{get{if (overlays == null){overlays = new GMapProvider[] { this };}return overlays;}}
}
public class BaiduMapProvider : BaiduMapProviderBase
{public static readonly BaiduMapProvider Instance;readonly Guid id = new Guid("EF3DD303-3F74-4938-BF40-232D0595EE86");public override Guid Id{get { return id; }}readonly string name = "百度交通地图";public override string Name{get{return name;}}static BaiduMapProvider(){Instance = new BaiduMapProvider();}public override PureImage GetTileImage(GPoint pos, int zoom){string url = MakeTileImageUrl(pos, zoom, LanguageStr);return GetTileImageUsingHttp(url);}string MakeTileImageUrl(GPoint pos, int zoom, string language){zoom = zoom - 1;var offsetX = Math.Pow(2, zoom);var offsetY = offsetX - 1;var numX = pos.X - offsetX;var numY = -pos.Y + offsetY;zoom = zoom + 1;var num = (pos.X + pos.Y)%8 + 1;var x = numX.ToString().Replace("-", "M");var y = numY.ToString().Replace("-", "M");//http://q3.baidu.com/it/u=x=721;y=209;z=12;v=014;type=web&fm=44string url = string.Format(UrlFormat, num, x, y, zoom, "014", "web", "44");Console.WriteLine("url:" + url);return url;}//static readonly string UrlFormat = "http://shangetu1.map.bdimg.com/it/u=x={1};y={2};z={3};v=009;type=sate&fm=46&udt=20130506";//以下为百度的卫星地图链接//http://shangetu1.map.bdimg.com/it/u=x=101237;y=37702;z=19;v=009;type=sate&fm=46&udt=20130506//百度交通地图// http://online1.map.bdimg.com/onlinelabel/?qt=tile&x=1562&y=359&z=13&styles=pl&udt=20160204&scaler=1&p=1static readonly string UrlFormat = "http://online1.map.bdimg.com/onlinelabel/?qt=tile&x={1}&y={2}&z={3}&styles=pl&udt=20160204&scaler=1&p=1";//运行后需要往左侧缩放才能看到地图//static readonly string UrlFormat = "http://q{0}.baidu.com/it/u=x={1};y={2};z={3};v={4};type={5}&fm={6}";}
public class BaiduSitellteMapProvider : BaiduMapProviderBase
{public static readonly BaiduSitellteMapProvider Instance;readonly Guid id = new Guid("EF3DD303-3F74-4938-BF40-232D0595EE85");public override Guid Id{get { return id; }}readonly string name = "百度卫星地图";public override string Name{get{return name;}}static BaiduSitellteMapProvider(){Instance = new BaiduSitellteMapProvider();}public override PureImage GetTileImage(GPoint pos, int zoom){string url = MakeTileImageUrl(pos, zoom, LanguageStr);return GetTileImageUsingHttp(url);}string MakeTileImageUrl(GPoint pos, int zoom, string language){zoom = zoom - 1;var offsetX = Math.Pow(2, zoom);var offsetY = offsetX - 1;var numX = pos.X - offsetX;var numY = -pos.Y + offsetY;zoom = zoom + 1;var num = (pos.X + pos.Y) % 8 + 1;var x = numX.ToString().Replace("-", "M");var y = numY.ToString().Replace("-", "M");//http://q3.baidu.com/it/u=x=721;y=209;z=12;v=014;type=web&fm=44string url = string.Format(UrlFormat, num, x, y, zoom, "014", "web", "44");Console.WriteLine("url:" + url);return url;}static readonly string UrlFormat = "http://shangetu1.map.bdimg.com/it/u=x={1};y={2};z={3};v=009;type=sate&fm=46&udt=20130506";//以下为百度的卫星地图链接//http://shangetu1.map.bdimg.com/it/u=x=101237;y=37702;z=19;v=009;type=sate&fm=46&udt=20130506//百度交通地图// http://online1.map.bdimg.com/onlinelabel/?qt=tile&x=1562&y=359&z=13&styles=pl&udt=20160204&scaler=1&p=1//static readonly string UrlFormat = "http://online1.map.bdimg.com/onlinelabel/?qt=tile&x={1}&y={2}&z={3}&styles=pl&udt=20160204&scaler=1&p=1";//运行后需要往左侧缩放才能看到地图//static readonly string UrlFormat = "http://q{0}.baidu.com/it/u=x={1};y={2};z={3};v={4};type={5}&fm={6}";}

}

2016.3.14
1.添加了搜狗和搜搜地图

2016.3.20
1.因为苹果电脑只有C盘,因此这个核心控件中加入了把瓦片地图导入E盘的功能,导致在苹果电脑中无法运行,然后把这个核心控件的这行代码屏蔽了。

2016.3.24
1.调整了地图的显示次序,因为百度地图偏移比较大,因此调整到后面去,把几种常见的地图调整到前面。

2016.3.28
1.经过测试,发现叠加瓦片地图时,谷歌地图可以看到20层以后的数据,而bing map确只有到19层,现在正在解决这个问题。已经解决了这个问题,原来只要在画图函数中的另一个分支判断中加入画切片图的功能就可以了。

2.GMap.NET.Core.dll和GMap.NET.WindowsForms.dll每次重新生成后都要手动D:\VS2010源码\51CTO下载-greatmaps2016.3.28修改\greatmaps\GMap.NET.WindowsForms\bin\Debug拷过去,这点有些不方便。
3.添加了直接读取文件夹导入瓦片的功能,这样就不用数据库了。
4.其实不用把png的白色底色剔除,只要把底图画出,现在上面画自己的切片图层就可以了,这样白边的问题也解决了!

2016.4.15
1.发现一款非常强大的切图工具,在网上下载了好几个切图的,如map tile\dstile等,都不好使用,发现http://www.cnblogs.com/xwgli/archive/2013/04/27/3046166.html这篇文章里有个关键信息,下载到 http://research.microsoft.com/en-us/um/redmond/projects/mapcruncher/ 这里下载MapCruncher,然后用了下,非常好,可以实现切图,不过有些卡。切出来的切片有点不一样,经过研究发现,原来它是用QuadTileKey来表示的。参考:http://beniao.blog.51cto.com/389148/291726
2.然后修改了核心类,实现了这种瓦片格式的读取,把x\y\z转换为quadkey就可以了。

2016.4.27
1.经过测试又发现了一个问题,当完全没有网络时,软件没有缓存到任何瓦片地图的情况下,自定义的高清切片地图竟然也没法使用,这是一个比较严重的bug,出现的原因已经查明了,应该是在判断底图是为为空上出了点问题。
2.drawmap下的t是从Matrix中获取的,t又是从tilepoint中获取的,当没有联网又没任何缓存时为t为空,这样就导致了无法加载自定义的瓦片。最后换成原始的tilepoint就搞定了,但测试只能显示到18级地图,接下来要解决这个bug.
3.经过几小时的努力,终于解决了这个问题。其实代码中有很多空值的判断,需要搞清这些值的判断,在什么地方执行何种代码,这样就清楚了代码的运行过程。另外要加强瓦片地图动态加载算法的研究,开发出效率更强更高的算法。

2016.5.25
1.终于通过IIS服务器发布局域网的切片地图,然后在软件中加入了一个LocalBingMapProvider的类,成功实现了从局域网中读取切片地图的功能。
2.研究了geoserver和mapserver,非常强大,但mapserver占用了80端口,使得IIS服务器报错不能启动,最后把IIS服务器的端口改为8055,然后本机可以访问,但手机等局域网其它电脑无法访问,原来是防火墙的问题,把防火墙设置为对8055端口开放就可以了。【开始】打开【控制面板】,选择【WINDOWS 防火墙】,进入在防火墙界面,选择左侧边栏的【高级设置】在弹出的高级安全Windows防火墙界面中,选择左侧边栏的【入站规则】,然后在右侧边栏选择【新建规则】在弹出的窗口中完成如下操作:
选择【端口】,下一步;
选择【TCP】以及【特定本地端口】,填入要开放的端口号(或开放所有端口,可以以逗号分隔多个端口),下一步;
【允许连接】,下一步;
网络类型全部勾选,下一步;
【名称】中填入自定义名称,如:IIS 【完成】。
http://jingyan.baidu.com/article/335530da89540a19cb41c3cb.html
3.BingMapProvider的 MaxZoom = 21,否则只能访问到19级图片。

2016.10.7
1.导入切片地图时之前只能导入单一的切片,再次导入其它切片时,原有的切片会消失,因此设置了一个可以导入多个切片的功能,采用数组的方式导入,然后在多个切片文件夹下寻找切片图。因为测试需要多个切片图,而电脑中一时找不到多个切片集,因此还没办法测试。经过后来测试没有问题。
2.为GMapPolygon类添加了DataRow属性,这样导入到地图时把对应的access行传递到DataRow属性中。画点时,当点在多边形内,就把这个DataRow传递给GMapMarkerBS自定义类的DataRow属性,然后在导出时就可以导出小班属性了,非常强大。面向对象的编程就是这么任性。

2016.10.31
1.又认识一款叫geoWebCache的软件,可以直接把切片变成WMS服务供Openlayer等调用。开始我以为是geoserver里的一个功能,原来是不同的软件呢。geoserver也非常的强大,我已经上手了。
2.说好1000元给辽宁的客户做的代码,客户先给了500,但当录制好视频和代码发过去时,客户说太简单了。可是看看我上面写的升级日志,真的有这么简单么。有源码,又有视频解说,当然觉得简单。看来今后得留一手,不然每次都吃这样的大亏。
20161225

  1. 从gitub中下载了一个greatmap源码,发现里面竟然有mapcruncher的源码。测试了下,可以实现切片的功能。而微软的官下载已经无法正常下载这个软件件,或者下载后提示版本过期无法使用。
  2. 但这个源码生成的是bingmap格式的jpg文件,经过坚苦的测试和修改,所它改成了png格式的切片,但仍然无法正常导入我开发的大奇地图。原理是有个类没写好,使用forlderlist来读取多个文件参数过程中,忽略了mapcruncher生成的切片图,于是又修改了greatemap中的GMapcontrol类的核心代码,经过测试可以读取切片了。这样我就掌握了从卫图切片到读取转换一条龙的核心技术,非常强大!

2017501
1.实现了加载高德地图卫星地图和路网地名叠加的地图。花费了大概8小时的不间断时间,晚饭都是吃的泡面。高德地图并不像谷歌地图那样,提供卫星地图和路网地名相互叠加的切片,通过网络开发者工具,捕获到的是卫星地图的URL和一个乱七八糟的地名小切图地址,研究了半天,只能解析出卫星地图和路网的地址,然后实现了卫星地图和路网的叠加。但是地名确没有了。然后只能想别的办法。经过测试,发现 static readonly string UrlFormat = “http://webst04.is.autonavi.com/appmaptile?style=6&x={0}&y={1}&z={2}”;这个地址中的style=6是卫星地图的地址,style=7和8都是路网的地址,但有些不一样,7是不透明的背景有些颜色,8是透明的png图。然后测试了一下,果然能够叠加。
2.叠加的方法之前在叠加本地无人机拍摄的图时,修改的是底层的GMapControl类,但这样扩展起来太麻烦了。于是想到修改MapProvider类,然后发现,AMapProvider中有个override的方法,就是获取 到的地图数据传递给 public override PureImage GetTileImage(GPoint pos, int zoom),于是在这里面加载了一个把瓦片混合在一起的方法, BlendImage(new Bitmap[] { bottomBitmap }, ref mixBitmap);混合后又有问题,出现无法访问MemoryStream的缓冲区的错误,调试了半天,几个小时的坚苦调试后,发现问题出在这里:if (ms.Length > 0)
{
pi = TileImageProxy.FromStream(ms);
}
MemoryStream responseStream = Stuff.CopyStream(ms, false);
MemoryStream 一定要用这个方法来获取 ,否则就会出现:无法访问MemoryStream的缓冲区的错误。这个方法也是参考了GetTileImageUsingHttp里的方法,不然还真搞不定!

2017502
1.经过测试还发现一个问题:新的高德混合地图离线缓存不能用,这样就没办法离线使用,因此这个技术难点今天也要突破一下。
2.在高德地图的provider类中加了一行代码,经测试,可以实现地图的缓存显示了。 Cache.Instance.ImageCache.PutImageToCache(BitmapToBytes(mixBitmap),this.DbId, pos, zoom);这行代码是从谷歌地图GoogleMapProvider中找到的,因为之前测试发现谷歌地图有缓存可以离线,但soso地图和高德地图不可以,于是查看谷歌地图的代码发现了这行代码,然后改了下参数,果然有用。不过缓存调用动态算法之类的还有待于不断的探索学习,这样才能开发出更加灵活的应用。同时,要注意多用面向对象的方法,以便今后扩展方便。另外要大胆尝试,这样才有更多的经经验。比如cache类,不太敢用,怕会出错,之前一直是想着要什么地方传递参数。后来才发现这个类是一个单件类,只要调用Cache.Instance就可以用起来。因此编程要不断的总结经验,理论与实践相结合才会有更好的解决方法。要多思考为什么这样做。

2017511
1.实现了高德地图的路网与谷歌地球的卫星地图叠加的功能,非常强大,就是上次混合地图的基础上做的,并且是用面向对象的方法实现,避免了修改底层代码。
2.实现后在这个电脑上测试不了,因为没有翻墙,结果两个地图都无法显示。但我把软件拷到翻墙过后的电脑时,地图可以显示了!
2017526
1.添加了谷歌地图的夜色地图,链接没有错,总是显示:无法连接到远程服务器 —> System.Net.Sockets.SocketException: 由于目标计算机积极拒绝,无法连接。 117.169.4.157:443 ,因为这个错误折腾了几个小时,晚饭都没有吃。最后才发现,是杀毒软件和防火墙禁用了443端口的问题,并且防火墙设置后要重启才能生效,似乎注销系统都不能生效!
2.另外,浏览器可以访问程序无法访问url还可以是这个问题: request.UserAgent = “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 133; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CIBA; InfoPath.2)”;
request.Method = “GET”;
设置下就可以了!
3.不用完全禁用防火墙和杀毒软件,只要设置防火墙的准入和准出端口规则,添加443端口就可以了!后来经过测试发现,还是要完全关闭防火墙才能用!
2017526
1.添加了谷歌地图的夜色地图,链接没有错,总是显示:无法连接到远程服务器 —> System.Net.Sockets.SocketException: 由于目标计算机积极拒绝,无法连接。 117.169.4.157:443 ,因为这个错误折腾了几个小时,晚饭都没有吃。最后才发现,是杀毒软件和防火墙禁用了443端口的问题,并且防火墙设置后要重启才能生效,似乎注销系统都不能生效!
2.另外,浏览器可以访问程序无法访问url还可以是这个问题: request.UserAgent = “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 133; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CIBA; InfoPath.2)”;
request.Method = “GET”;
设置下就可以了!
3.不用完全禁用防火墙和杀毒软件,只要设置防火墙的准入和准出端口规则,添加443端口就可以了!

201764
1.终于实现瓦片的动态数字图像处理,这样理论上可以处理无限大小的图片,不占用大量的内存。实现方法是在GMapProvider中GetTileImageUsingHttp函数中把获取的单个瓦片数据进行数字图像处理后再传递给这个函数返回。代码如下:
Image bitmap= Image.FromStream(responseStream, true);
Bitmap b = new Bitmap(bitmap);
b= ajustment.ColorBalance(b, 0, -255,0);
byte[] bte = convertByte(b);
Stream mss= BytesToStream(bte);
ret.Data =Stuff.CopyStream(mss,false);
2.在实现这个功能中遇到了很多bug,处理了几个小时,终于实现了这个功能。主要的bug有:无法访问memoryStream内部缓冲区,这个时候只能用Stuff.CopyStream来拷贝内存区域。还有一个就是: Image bitmap = Image.FromStream(responseStream, true);总是提示参数无效。
3.另外还有个bug,就是设置地图的模式为severonly时,地图的动态图像处理有效果,但cacheonly时或者混合模式时,就会出现没效果或者有的图像处理了,从缓存中加载的没有处理的情况。如果要实现都处理的话,从缓存中读取的也要改下。

20171102
1.GMap.net提供了强大的缓存地图数据处理架构,可以把地图存储为SQlite的格式,刚好这个项目要用到离线地图,因此我又开始研究这个离线地图缓存的问题。这个缓存是SQLite数据库,可以用SQlite的可视化工具打开,研究里面的结构。结构如下图:
这里有一个重要的字段Type,就是地图的类型,是一个int值。现在的问题是,我用地图下载器下载下来的地图用的是高德地图,导入后并不能访问。于是我把GMap.net里面的这个数据库架构和这个下载的数据库进行比对,发现除了Type不一样外,其它都是一样的。那么怎么知道地图的int值呢?通过这个代码分析,查找关联引用得到如下代码: PrimaryCache.GetImageFromCache(provider.DbId, pos, zoom);注意那个provider.DbId就是地图的类型,这样我就可以MainMap.MapProvider.DbId.ToString()来获取地图类型了。另外
那个DbId = Math.Abs(BitConverter.ToInt32(HashProvider.ComputeHash(Id.ToByteArray()), 0));
需要GUID的时候,可以完全由算法自动生成,不需要一个权威机构来管理。
★GUID理论上能产生全球唯一的值,对于以后的数据导入很方便。
那个Id.ToByteArray()就是GUID

2.然而研究了半天发现,下载的是高德地图,但这个用的也是高德地图,把数据库拷入不能访问,读取到的地图是空白的。后来才发现,原来这个源码架构被之前的客户修改过底层,导致当设置地图的缓存路径后,地图的缓存路径会在软件目录中加入这个文件夹:
然后要把下载的数据直接放到这里就可以读取访问了。折腾了半天走了很多弯路啊,原来是dll版本不一样,里面的底层代码不一致导致的。
3.已经把成都市区的范围下载下来了,可以离线部署,并且发现这个是数据库方式,其实后续扩展也很方便,要往里面加卫星地图只要写数据库就可以了,重复区域覆盖就可以了。
4.把要用到的软件和资源一起放源码目录,这样当备份源码或者拷贝到其实电脑工作时,就不会找不到资源数据了,这种习惯非常好。不过也带来了一些问题,如源码包过于庞大的问题。这时可以给源码包里建立不同的文件夹,有些数据很少更新,有的像源码目录就另外单独一个文件夹,这样当备份数据时只要把源码或者更新了的部分拷过去,而其它没有更新的不用拷贝,这样就节省了大量的备份时间。

20171119
1.

我发现那个类还可以从多个缓存中读取,自动搜索目录下的所有gmdb数据库

        var dbs = Directory.GetFiles(dir, "*.gmdb", SearchOption.AllDirectories);

#else
var dbs = Directory.GetFiles(dir, “.gmdb");
#endif
foreach(var d in dbs)
{
if(d != db)
{
Attach(d);
}
}
}
}
自动搜索路径下所有
.gmdb数据库,然后把得到的路径添加到AttachedCaches中
public void Attach(string db)
{
if(!AttachedCaches.Contains(db))
{
AttachedCaches.Add(db);
RebuildFinnalSelect();
}
}
再遍历 foreach(var c in AttachedCaches)
{
finnalSqlSelect += string.Format(”\nUNION SELECT Tile FROM db{0}.TilesData WHERE id = (SELECT id FROM db{0}.Tiles WHERE X={{0}} AND Y={{1}} AND Zoom={{2}} AND Type={{3}})", i);
attachSqlQuery += string.Format("\nATTACH ‘{0}’ as db{1};", c, i);
detachSqlQuery += string.Format("\nDETACH DATABASE db{0};", i);

        i++;}

用了UNION来联合SQL语句来实现多个数据库的联合查询,值得学习。

20171120
1.客户给了一个用别的地图下载软件下载的数据库mbtiles,然后分析发现其中的字段是不一样的。数据表的架构也是不一样的,
2.这样现成的SQLiteCacehe类就无法读取这个数据库了,然后我自己编写了一个类,折腾了一天,测试了很久,终于实现了导入到地图中的功能。本来这个功能并不难,但难就难在SQLite的数据库读取的SQL语言是不一样的,直接在SQliteExplorer中用这个语句SELECT tile_data FROM main.tiles WHERE tile_row=10 AND tile_column=12 AND zoom_level=4是可以读取的,但在VS2013中用代码读取时就出错,问题显示no such column,然后百度发现原来这些列的名称要加上引号。开始我以为是单引号,结果测试了半天都没有效果,浪费了大量的时间。后来才发现要用双引号才有用,如下语句才能正确的读取:
SELECT “tile_data” FROM “tiles” WHERE “tile_row”=10 AND “tile_column”=12 AND “zoom_level”=4
static readonly string singleSqlSelect = "SELECT " + ““tile_data”” + " FROM main.tiles WHERE " + ““tile_row”” + "={1} AND " + ““tile_column”” + “={0} AND " + ““zoom_level”={2}”;
finnalSqlSelect += string.Format(”\nUNION SELECT " + ““tile_data”” + " FROM db{0}.tiles WHERE " + ““tile_row”” + "={{1}} AND " + ““tile_column”” + "={{0}} AND " + ““zoom_level”” + “={{2}}”, i);
通过这次训练,又加深了对数据库编程的学习了解,从原来模糊的概念和理论正式转入实战。而之前学习的数据库操作的理论也是非常重要的,正好可以用上,如什么事物、存储过程、锁等都有了一些基本的概念。还有数据库设计上的什么主健、外键什么的,今后要加强下理论的学习。

3.修改了cacheLocation的路径,不自动建议国家语言层次zh这样的目录,不自动添加TileData这层目录,所以数据库直接放到文件夹下,然后设置这个文件夹为缓存cachelocation就可以了。
导入地图后发现,XY对不上号,原来这个地图的架构是mapbox的,后来研究发现,它的行是一样的,但列的次序是倒过来的。
然后 GSize myGSize = GoogleMapProvider.Instance.Projection.GetTileMatrixSizeXY(zoom);
获取当前缩放的XY矩阵宽度,然后再把列的次序倒序。
com.CommandText = string.Format(finnalSqlSelect, pos.X, myGSize.Height - pos.Y-1, zoom, type);
另外,SQL代码的行列反掉了,也要换下: static readonly string singleSqlSelect = "SELECT " + ““tile_data”” + " FROM main.tiles WHERE " + ““tile_row”” + "={1} AND " + ““tile_column”” + “={0} AND " + ““zoom_level”={2}”;注意:{1}为row,{0}为column.
finnalSqlSelect += string.Format(”\nUNION SELECT " + ““tile_data”” + " FROM db{0}.tiles WHERE " + ““tile_row”” + "={{1}} AND " + ““tile_column”” + "={{0}} AND " + ““zoom_level”” + “={{2}}”, i);

4.另外在编写代码过程中,经常会出现MainForm不稳定,然后出现什么遇到问题崩溃,接着窗体控件全部消失,这是件很让人泄气的事情,总不可能重写窗口吧。好在其它之前的源码有备份,直接把窗体相关的三个代码拷过来替换就可以了。所以最好把MainForm代码备份一下,以便出现问题时好替换。控件缓存是从内存读取的,我估计是这样的,然后本地dll关联的控件你替换了,但窗体的控件缓存还是内存里的,于是与磁盘交互时就找不到了

20171121
1.添加了 ///
/// 获取地图类型属性表,如bounds,center,minzoom,maxzoom,name,type,version,description,farmat等
///
///
public DataTable getMapAttributeTable()
的方法

20171122
1.当我在界面上设置serveronly后,就出现各种类型的地图混合出现的问题,

改回cache模式后也这样,但重启软件后就不存在这个问题了。原因是当设置ServerOnly后,程序会调用另一个缓存机制。所以如果要离线使用,整个过程都不能设置成其它的访问模式。
2.另外,mbtiles标准并非很完善,它竟然没有区分各种地图类型的标记,唯一区分的标记就是数据库文件名。所以当缓存目录中有多个不同类型的地图数据库时,就会出现调用混乱的情况。因此只能指定访问唯一的数据库才能避免这种情形。所以加入了指定文件的访问方式。
3.辽宁那边的客户在测试我写的那个读取缓存的类时,又出现了问题。后来排查了很久,我确定可能是缓存路径的问题。果然他发现了原来是缓存路径有多层目录,代码会自动从多层目录中找到mbtiles数据库,所以才出现了多种地图混合的问题。
然而好景不长,没过多久他又反馈说出问题了,说一开始小的数据库浏览没有问题,后来下载了一个大的数据库更大的地图范围,又出现了地图混合的问题。
switch (draw_style)
{
case 0:
{
ms.CacheLocationDirectory = Application.StartupPath + Path.DirectorySeparatorChar + “地图1”;
this.MainMap.Manager.PrimaryCache = ms;
}
break;

            case 1:{                ms.CacheLocationDirectory = Application.StartupPath + Path.DirectorySeparatorChar + "地图2";this.MainMap.Manager.PrimaryCache =ms;                                         }

后来我以上代码也出现了问题,然后试着改那个SQLCache的类,但改了半天,又出现窗体界面崩溃然后界面空白的问题,还好之前有处理经验,我把之前备份的窗体界面拷入过去,然后重新清理编译启动下又可以了,不过代码也要再重新拷入,所以最好把最新的窗体备份一下,这样就可以让崩溃后的窗体修复到最新。
后来客户和我用以上代码都发现了地图混合的问题,但数据库已经切换过来了,于是我考虑是内存中还有数据缓存的问题,因为单独的数据库我检查过了是不有被“污染”混合过的。然后我直接搜索memorycache,果然找到了相应的代码。 MainMap.Manager.MemoryCache.Clear();只要加入这一句就可以完美切换了。可是客户不久又发现了问题,说一开始还好,可到了后来地图又混合了。然后我说我只加了这么一个代码就解决了,客户不相信,交流沟通各说各的。最后远程给客户解决,但我这边刚好要带小孩,回了下老家,小孩感冒了,安安宝宝还呕吐了。不过为了解决这最后一公理,我还是决定让老婆看着小孩我远程给客户解决。但看过客户的代码确实没有问题,又是两边都怀疑是不是对方搞错了。为了证实自己这边没问题,就远程给客户演示,这一演示,果然发现我的代码里多了一行:
MainMap.ReloadMap();然后客户那边加上这行代码就解决了问题。 核心代码如下:MainMap.Manager.MemoryCache.Clear();
SetCacheLocation(0);
}
public void SetCacheLocation(int draw_style)
{
#region 设置地图背景
switch (draw_style)
{
case 0:
{

                    ms.CacheLocationDirectory = Application.StartupPath + Path.DirectorySeparatorChar + "地图1";this.MainMap.Manager.PrimaryCache = ms;MainMap.ReloadMap();}break;case 1:{ms.CacheLocationDirectory = Application.StartupPath + Path.DirectorySeparatorChar + "地图2";this.MainMap.Manager.PrimaryCache = ms; MainMap.ReloadMap();}break;

4.界面出现控件无法修改name属性,多是因为控件的名称重复了,有同名的控件存在。
5.不可访问,因为它受保护级别限制,把控件属性设置为public就可以了。

20180515
1.从昨天晚上6点多吃完饭开始,一直到现在凌晨,修复了一个重大的bug,这个bug还真的很难发现。这个bug是这样的,客户那边用无人机拍摄了很多卫星影像数据,结果批量叠加到地图上时,发现有部分数据丢失,经过反复的测试才发现,当有两个卫星影像重叠时,就会导致其中一个卫星影像的部分数据丢失。根据编程经验,我立马意识到这是因为在数据处理的过程中,当遇上相同的切片时,就跳出循环,导致这块地图中的后面的切片无法加载,于是就出现了这种情况。不过搞清楚这个问题就花了几个小时,好在客户那边也对编程有所了解,不然这样的一个问题沟通都是一个很大的问题。
2.经过反复的修改测试,终于可以实现批量导入多个地图切片块而不会出现数据丢失的问题。
public List getImageListFromTileXY(int zoom, int X, int Y)//从xy逆向构造文件路径
{
tileImagePathL.Clear();
GSize myGSize = this.MapProvider.Projection.GetTileMatrixSizeXY(zoom);
pathY = myGSize.Height - Y - 1;

       //    xypoint.Y = myGSize.Height - Convert.ToInt32(s[s.Length - 1].Replace(".png", "")) - 1;//Y的相反foreach (string tilefoldertemp in tilefolderlist){if (tilefoldertemp != null && tilefoldertemp != ""){if (tilefoldertemp.Contains("Layer_NewLayer"))//如果是mapCruncher的切片{tileImagePath = tilefoldertemp + Path.DirectorySeparatorChar + TileXYToQuadKey(X, Y, zoom) + ".png";}else{tileImagePath = tilefoldertemp + Path.DirectorySeparatorChar + zoom.ToString() + Path.DirectorySeparatorChar + X.ToString() + Path.DirectorySeparatorChar + pathY.ToString() + ".png";}//if (!File.Exists(tileImagePath))//{//    tileImagePath = "";//}if (File.Exists(tileImagePath)){tileImagePathL.Add(tileImagePath);}}}imaList.Clear();foreach(string s in tileImagePathL){if(s!=null && s!=""){imaList.Add(Image.FromFile(s));}}return imaList;}

以上代码传入XY的编号时,可以自动从不同的切片块中找到多个数据,然后在后续的画地图中把这多个编号都同时画出,这样就不会出现重叠的问题了。之前的处理方法是当找到一个地图瓦片就break跳出循环,这样就导致后面的地图切片不能加载到里面。

GMap.net升级日志相关推荐

  1. Windows升级日志文件可以删除吗?

    有用户发现Windows系统升级之后就会自动生成一个日志文件,这些日志文件可以删除吗?答案是可以的,这些日志文件删除之后不会对系统的运行造成任何影响. 风林火山 Ghost Win10 64位 绿色安 ...

  2. 一款开源的二维地图软件,在GMap.net基础上进行了有效的扩展,曾经产生过非常大的商业价值,里面含有升级日志,有助于再次开发

    重磅消息:酝酿已久的大奇地图软件开源了,目前开源的是2016年5月30号的版本,本软件可采用VS2010或更高版本打开,C#语言开发,.net4.0或4.5平台,支持运行在win xp\win7\wi ...

  3. Natasha V1.3.6.0 的升级日志

    开源库满足于个人,而完善于大众. Natasha 自稳定版发布之后,众多老铁参与增强改进,感谢如下老铁的反馈: 1. 异常搜集 在 wenjq0911 建议下,添加了异常捕获,现 Natasha 的编 ...

  4. 【C】Natasha V1.3.6.0 的升级日志

    文章转载授权级别:C            预计阅读时间:8分钟 开源库满足于个人,而完善于大众. Natasha 自稳定版发布之后,众多老铁参与增强改进,感谢如下老铁的反馈: 1. 异常搜集 在 w ...

  5. 讯飞输入法android版升级日志,讯飞输入法Android版7.0 实力解锁三大输入难题

    现代人的手机不是通讯工具而是一个伴侣,原本为了帮助我们更好的享受生活.提高效率,但现实情况手机却让我们变得低头不语.讯飞输入法一直致力于解放人们的双手和双眼,通过拼音输入到语音输入的小小改变,帮我们抬 ...

  6. excel、kml相互转换升级日志

    大奇软件研发中心,版权所有,欢迎转载 软件作者:兴国县朱明软件工作室,官方网站:http://www.nasagis.com/ 天下之大奇地理信息系统,QQ群:天下之大奇软件1(群号:28938835 ...

  7. 【致远FAQ】升级问题之部署日志说明

    部署日志说明 1) 安装程序提示部署警告以及错误需要逐个确认. 2) 不能忽略警告以及错误直接上线使用. 若提示有警告/错误,研发升级护航项目/支持单存在,必须有研发负责人确认是否须要处理,并在流程中 ...

  8. 【6年开源路】海王星给你好看!FineUI v4.0正式版暨《FineUI3to4一键升级工具》发布!...

    去年10-28号,我发布了一篇文章<海王星给你好看!FineUI v4.0公测版发布暨<你找BUG我送书>活动开始>,标志着FineUI开始向4.0版本迈进.经过4个月3个公测 ...

  9. 手动升级oracle,ORACLE 10.2.0.1手动升级到10.2.0.4

    ORACLE 10.2.0.1手动升级到10.2.0.4 1.解压zip包以及查看目录权限 p6810189_10204_Linux-x86-64.zip oracle@single-10g:/u01 ...

最新文章

  1. 【Python】turtle库的小应用
  2. Docker 官方公共仓库 Docker Hub 遭攻击,恐19 万用户信息泄露;Intel 10核心新品要现身了?...
  3. 详解IOS开发应用之并发Dispatch Queues
  4. Docker安装MySQL 8 for Mac(图文详解)
  5. [论文阅读] | Graph U-Nets
  6. 河南联通中兴B860AV1.2_S905M-B_线刷刷机固件及教程
  7. 数学分析教程(科大)——4.2笔记+习题
  8. 一些wincap函数说明
  9. C++下的utility
  10. vue实现九宫格抽奖
  11. 嵌入式linux ota,嵌入式Linux的OTA更新,基本原理和实现
  12. hypermesh 连接单元_HRS连接器U.FL-R-SMT-1(10)插座样图查询
  13. 腾讯云对象存储的完整教程,java将文件上传到腾讯云上后返回可以访问的连接
  14. 20个超炫的HTML5 /CSS3免费网页设计模板
  15. git忽略文件的规则
  16. shell 十三问:
  17. Centos 7.6下安装teamview
  18. 东软睿道实训心得:女生更好学好技术
  19. verilog学习笔记- 4)Modelsim 软件的安装、使用
  20. STM32系统时钟的配置钟FLASH预取指的作用

热门文章

  1. 解决spring的事物注解失效问题
  2. eclipse内存设置Linux,Eclipse CDT Linux下内存分析 补记
  3. English--音标初识--phonetic symbol
  4. Python自动化办公:xlrd万字教程
  5. SpringBoot+Lombok使用
  6. Android等待2秒执行,每隔2秒执行
  7. 关于Qt翻译功能的一些小想法
  8. 使用python爬取喜马拉雅音频数据并保存
  9. 精品基于Python实现的医院挂号系统医生
  10. 基于强化学习的期权量化交易回测系统4