引路蜂地图也提供对.Net Framework平台的支持,可以开发桌面地图应用,由于Mono C#的跨平台特性,使用Visual Studio 和Mono引路蜂地图开发包开发的地图应用可以运行于Windows ,Lunix,Unix,Mac OS等平台。开发桌面应用比开发移动应用要容易的多,屏幕,内存等方面都比移动平台要宽裕的多。
下面使用一个简单的应用来介绍一下.Net Framework引路蜂地图开发。示例截图如下
设置引路蜂地图开发包License
引路蜂开发包License分两部分,一个为License文件guidebee.lic ,另一部分为License文件对应的注册码,需在程序运行前初始化
//set the map licence info.
LicenceManager licenceManager = LicenceManager.GetInstance();
long[] keys = new []{ -0x64fa2841ac936ab3L, 0x492e8e7bf7876c44L, -0x3bb9b3e2a8e4c94dL,
0x224a4785c48a8eb3L, 0x3a36fc72ad775a85L, -0x93b87a82371b0ddL, };
licenceManager.AddLicence("GuidebeeMap_DotNet", keys);
设置.Net Framework平台相关图形系统实现
引路蜂地图开发包,在设计时尽量做到平台无关性,将一些平台相关的部分,如图形系统以接口形式定义,如IFont,IGraphics,AbstractGraphicsFactory,IImage。这样在应用到具体平台时,加上平台相关的实现,可以实现同一个库应用到不同的平台。这些平台实现是以源码提供的,如在Java SE平台,提供了JavaSEFont,JavaSEGraphics,JavaSEGraphicsFactory和JavaSEImage类定义,可以参见引路蜂地图API概述。
初始化地图对象及设置服务回调函数
//optional, get the tile url from server.
MapType.UpdateMapTileUrl();
MapLayer.SetAbstractGraphicsFactory(NETGraphicsFactory.GetInstance());
MapConfiguration.SetParameter(MapConfiguration.WorkerThreadNumber, 32);
_mapImage = MapLayer.GetAbstractGraphicsFactory().CreateImage(768, 768);
_mapGraphics = _mapImage.GetGraphics();
_mapTileDownloadManager = new MapTileDownloadManager(this);
_rasterMap = new RasterMap(2048, 2048, _mapType, _mapTileDownloadManager);
//_rasterMap.SetCurrentMapService(DigitalMapService.CloudmadeMapService);
//DigitalMapService.GetSearchOptions().LanguageId = "zh-cn";
_rasterMap.SetScreenSize(768, 768);
_mapTileDownloadManager.Start();
_rasterMap.SetMapDrawingListener(this);
_rasterMap.SetGeocodingListener(this);
_rasterMap.SetRoutingListener(this);
上述代码设置地图工作线程数为16,一般来说增加工资线程数可以提高地图下载及响应速度。
创建地图对象,设置显示区域(屏幕)大小。此外地图服务如查询地址,获取路径都是采用异步方式,通过设置回调函数如setRoutingListener,setGeocodingListener,setReverseGeocodingListener等来通知应用 。
设置地图中心和地图类型
var center = new GeoLatLng(-31.948275, 115.857562);
_rasterMap.SetCenter(center, 15, _rasterMap.GetMapType());
上述代码将地图中心设置在32.0616667, 118.7777778,地图类型为Bing中国地图,缩放级别为4级,引路蜂内部支持20多种地图类型,并支持自定义地图类型。
地图缩放
RasterMap的 ZoomIn,ZoomOut用来放大和缩小地图,setZoom可以设置地图级别。
地图平移
RasterMap 有两个方法可以用于平移地图,panTo 将地图移动到指定经纬度坐标,panDirection(dx,dy) 将地图从当前位置平移dx,dy 个象素。 下列示例可以上,下,左,右平移地图。
地址查询
地址查询(或称为地址编码)是将输入的地名(如南京林业大学)转换成对应的经纬度坐标然后将其显示在地图上。
所有的地图服务都是采用异步方式调用,在调用RasterMap.getLocation(address)前,需要设置好返回结果时的回调函数RasterMap.setGeocodingListener,回调函数接口定义为IGeocodingListener。 回调方法为public void done(String query,MapPoint[] result) ,如果查询结果不为空,则reusult 为查询结果的数组。示例中将地图转到第一个查询结果。
对于MapAbc 地图服务,还可以指定城市编码,如南京编码为25。
public void getLocation(int citycode,String query, IGeocodingListener listener);
路径查询
可以通过RasterMap的getDirection()方法来查询路径,和查询地址类似,路径查询的结果也是通过回调函数的方式来通知应用程序的,下面的例子返回南京到北京的路径。返回结果存放在MapDirection中,MapDirection包含了路径的详细信息,包括路径的每个步骤,长度,时间,方向等。
地图服务可以选择使用Google 地图服务,CloudMade地图服务,在中国还可能选择MapAbc地图服务,缺省使用Google 地图服务。
getDirections()具有三个重载函数,例子中是采用的文字描述方式。上述示例采用了from: address1 to: address2 的格式, CloudMade地图服务和MapAbc地图服务则必需采用 经度1,纬度1,经度2,纬度2和格式。
为避免混淆,可以使用下述格式。
public void getDirection(GeoLatLng[] waypoints, IRoutingListener listener);
其中 waypoints 为途径点坐标数组经纬值,可以支持多点路径查询。
此外对于MapAbc 地图服务,还可以指定城市编码,如南京编码为25。
public void getDirection(int citycode,String query, IRoutingListener listener);
本地查询
本地查询可以查询指定区域内诸如宾馆,邮局等用户感兴趣的地方。其使用方法和地址查询非常类似。
本地查询方法public void getLocations(String address,int start,GeoLatLng center,GeoBounds bound, IGeocodingListener listener);
指定中心点和查询区域。本地查询可以多次返回结果,start为查询结果起始顺序,每次返回结果在SearchOptions 中定义,缺省每次返回4个。
选择地图服务
引路蜂地图服务缺省使用Google地图服务,但你也可以选择其它地图服务,比方说当Google服务离线时,您可以选择MapAbc的地图服务,另外要注意的是中国地图是有偏移的。如果想使用无偏移的中国地图,一是采用地图偏移校正算法,另外一个是使用CloudMade地图服务。
所前所述,引路蜂地图开发包在设计时将地图图片显示和地图服务两部分设计成相对独立的两部分,Google中国地图图片,Bing中国地图图片,MapAbc中国地图图片是有偏移的地图图片,CloudMade(OpenStreet)中国地图图片是无偏移的。而Google中国地图服务,MapAbc中国地图服务是有偏移,CloudMade地图服务是无偏移的。所以在选择地图类型和地图服务类型时,要么都选择有偏移,要么都选择无偏移。否则地图在显示路径时或地址时就不匹配。
下面列表是合法的组合:
地图类型 (MapType) | 地图服务类型 (DigitalMapService) |
GOOGLECHINA | GOOGLE_MAP_SERVICE |
MICROSOFTCHINA | GOOGLE_MAP_SERVICE |
MAPABCCHINA | GOOGLE_MAP_SERVICE |
OPENSTREETMAP | CLOUDMADE_MAP_SERVICE |
GOOGLECHINA | MAPABC_MAP_SERVICE |
MICROSOFTCHINA | MAPABC_MAP_SERVICE |
MAPABCCHINA | MAPABC_MAP_SERVICE |
地址反编码
地址反编码是通过经纬度查询对应的地名,
注意使用字符串经纬度格式时,纬度在前,经度在后,如果反了,则返回的地名或能为空或都跑到外国去了。结果也是一个数组,一般到第一个结果,后面结果是更大的区域或是距离相对较远的地名。
.Net Framework
帮助文档 | 下载 |
.Net Framework引路蜂地图开发库 | 下载 |
.Net Framework引路蜂地图开发示例 | 下载 |
GTK Mono.Net Framework引路蜂地图开发示例 | 下载 |
引路蜂地图开发指南 | 下载 |
在Mac OS上,如果使用Mono GTK,可能会碰到下例错误
the sing(Graphics g=Gtk.DotNet.Graphics.FromDrawable(area.GdkWindow) may throws
System.EntryPointNotFoundException: gdk_x11_drawable_get_xdisplay
有一个临时的解决方案是通过bmp文件的方式来解决,正式的方法是通过Cario图形系统实现 GTKImage,GTKFont,GTKGraphics ,GTKGraphicsFactory。
protected virtual void OnPicMapCanvasExposeEvent (object o,
Gtk.ExposeEventArgs args)
{
DrawingArea area = (DrawingArea) o;
/*using(Graphics g=Gtk.DotNet.Graphics.FromDrawable(area.GdkWindow)){
g.DrawImage((Bitmap)_mapImage.GetNativeImage(),0,0);
}*/
_rasterMap.Paint(_mapGraphics);
DrawImage(area,(Bitmap)_mapImage.GetNativeImage());
}
private void DrawImage(DrawingArea area,System.Drawing.Image image){
try{
String filename="dummy.png";
image.Save(filename,ImageFormat.Png);
Pixbuf pixbuf=new Pixbuf(filename);
area.GdkWindow.DrawPixbuf(area.Style.WhiteGC,
pixbuf,0,0,0,0,pixbuf.Width,pixbuf.Height,RgbDither.None,0,0);
}catch(Exception e){
Console.WriteLine(e.Message);
}
}