GMap.Net添加百度和高德地图瓦片源
来源:互联网 发布:mysql给root所有权限 编辑:程序博客网 时间:2024/05/16 18:21
GMap.NET is great and Powerful, Free, cross platform, open source .NET control. Enable use routing, geocoding, directions and maps from Coogle, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac, Yandex, Mapy.cz, Maps.lt, iKarte.lv, NearMap, OviMap, CloudMade, WikiMapia, MapQuest in Windows Forms & Presentation, supports caching and runs on windows mobile!
它与很多地图厂商API不同的是,它里面有很多底层的实现,缓存,地图Tile的管理,路线,坐标转换等等,因此很有研究价值。并且,GMAP.NET是可以在Windows Form, WPF和Windows Mobile上运行的。
GMAP.NET目前是支持openstreetmap, google, bing,yahoo,ovi等地图的,但对于国内的地图支持寥寥,这篇博客http://www.cnblogs.com/enjoyeclipse/archive/2013/01/13/2858392.html只是从是通过编码转换实现了地图编码转换,但是此举只可实现浏览功能,但是无法实现地图的正反编码功能,在参考http://www.cnblogs.com/kekec/p/3159970.html这篇博客中对百度地图投影分析的基础上,我实现了百度地图投影接口,百度地图瓦片投影公式介绍:
图片(x,y,z)像素(m,n)[注:像素坐标以左上角为原点,x轴向右,y轴向下]的经纬度[单位:度]分别为:
-----------------------------------------------------------------------------
已知经纬度(单位:度),求瓦片编号x,y:
实现代码:
1、经纬度到像素坐标系的转换
public override GPoint FromLatLngToPixel(double lat, double lng, int zoom) { GPoint ret = GPoint.Empty; lat = Clip(lat, MinLatitude, MaxLatitude); lng = Clip(lng, MinLongitude, MaxLongitude); GSize s = GetTileMatrixSizePixel(zoom); long mapSizeX = s.Width; long mapSizeY = s.Height; double xMercatorTileNum = (Math.Pow(2.0, zoom - 26) * (Math.PI * lng * Axis / 180.0)); double xAxisPixelLength = xMercatorTileNum * 256; ret.X = (long)(mapSizeX * 0.5 + xAxisPixelLength); double yMercatorTileNum = (Math.Pow(2.0, zoom - 26) * Axis * Math.Log(Math.Tan(Math.PI * lat / 180.0) + 1.0 / Math.Cos(Math.PI * lat / 180.0))); double yAxisPixelLength = yMercatorTileNum * 256; ret.Y = (long)(mapSizeY * 0.5 - yAxisPixelLength); return ret; }
2、像素坐标系到经纬度坐标的转换
public override PointLatLng FromPixelToLatLng(long x, long y, int zoom) { PointLatLng ret = PointLatLng.Empty; GSize s = GetTileMatrixSizePixel(zoom); double mapSizeX = s.Width; double mapSizeY = s.Height; double xMercatorBaidu = x - 0.5 * mapSizeX; double yMercatorBaidu = -y + 0.5 * mapSizeY; double xTileNum = xMercatorBaidu / 256; double yTileNum = yMercatorBaidu / 256; int tileXNum = (int)Math.Floor(xTileNum); int tileYNum = (int)Math.Floor(yTileNum); double xRelativeTileCoord = xMercatorBaidu % 256 / 256; xRelativeTileCoord = xRelativeTileCoord > 0 ? xRelativeTileCoord : 1 + xRelativeTileCoord; double yRelativeTileCoord = yMercatorBaidu % 256 / 256; yRelativeTileCoord = yRelativeTileCoord > 0 ? 1 - yRelativeTileCoord : -yRelativeTileCoord; long xPixelCoord = (long)(xRelativeTileCoord * 256); long yPixelCoord = (long)(yRelativeTileCoord * 256); double tileNumX = (tileXNum + (double)xPixelCoord / 256); ret.Lng = (Math.Pow(2.0, 26 - zoom) * (tileNumX)) / (Math.PI * Axis) * 180; double eIndex = Math.Pow(2.0, 26 - zoom) * (tileYNum + 1 - (double)yPixelCoord / 256) / Axis; ret.Lat = 360 * Math.Atan(Math.Pow(Math.E, eIndex)) / Math.PI - 90; return ret; }
3、显示效果
- GMap.Net添加百度和高德地图瓦片源
- 基于GMap.Net的地图瓦片下载工具
- Gmap.net百度地图开发
- C#|GMap.NET控件基本使用-高德地图
- GMap.net在winform中调用高德地图
- 深入理解最强桌面地图控件GMAP.NET --- 百度地图
- 百度地图、高德地图、谷歌地图离线瓦片下载研究(一)
- 仿GMap.NET方式的Java版离线地图瓦片下载
- GMap.Net开发之在地图上添加多边形
- GMap.Net开发之在地图上添加多边形
- GMap.Net使用(3)之地图添加
- 初识高德地图和百度地图
- 百度瓦片地图制作
- GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件
- GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件
- GMap.Net地图绘点
- GMap.net地图下载器
- 关于百度地图和高德地图,关于地图坐标系
- 构造函数初始化器
- 字符串转10进制,10进制转字符串,并移16进制数显示
- MyActivityl类
- Netty为啥可靠(二)
- Java——内部类
- GMap.Net添加百度和高德地图瓦片源
- 几何水题_HDU_5206
- 函数
- Android实战技巧之二十四:横竖屏切换
- 贝塞尔曲线工具
- 方程
- 科普]原码,反码,补码由来
- 【瞎搞】 HDU 5207 Greatest Greatest Common Divisor
- 极限