GMap.net开发升级日志20150822-20170511

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=44
        string 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}";
    
}
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=44
        string 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.实现后在这个电脑上测试不了,因为没有翻墙,结果两个地图都无法显示。但我把软件拷到翻墙过后的电脑时,地图可以显示了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值