Facebook Twitter LinkedIn E-mail
magnify
Home Posts tagged ".Net Framwork"

WCF Test Client 中如何为添加array 类型参数

Windows Communication Foundation (WCF) Test Client (WcfTestClient.exe) 是随Visual Studio提供的用来测试WCF/Web Service一个GUI工具。

如何启动wcfTestClient.exe

一般是进入到 Visual Studio Tools —>Visual Studio Command Prompt (20xx) 命令行方式,键入 wcftestclient.

Add Service

启动 wcftestclient 后可以通过Add Service 添加对某个WebServcie 的URL链接 ,如下图

添加好对Web Service的引用后,该Web Service支持的方法就会列在左边的列表中,如果想调用某个方法,只要双击该方法, 工具就会在右上方显示该方法的调用接口,为Web方法填入参数,然后按“Invoke”调用该方法, 右下方在显示返回结果。

对于array 类型的参数,比如上图的 deleteStoreRequest 的 item参数为 StoreDeletionItem[] ,缺省 在item 的value 显示length=0, 此时如果需要设置数值的值,先将0 改成数组的个数,如length=1, 然后就可以点击下拉框,选中所需类型 StoreDeeletionItem ,就可以为数组中单个元素赋值。

 

桌面系统引路蜂地图开发包Ver2.1下载

桌面系统主要指用于Windows XP/Windows 7 ,Linux/Unix,Mac OS 等桌面系统上地图应用。主要以Java 和.Net Framework库的形式提供。允许程序员开发Java SE应用,C#应用,Mono GTK应用, WPF ,Silverlight应用等。同时由于Java和Mono的跨平台特性,基于引路蜂地图开发包的应用可以运行在Windows ,Linux ,Unix, Mac OS.

Java SE 平台

文档 下载
开发库 下载
实例代码 下载
开发指南 下载

.Net Framework

帮助文档 下载
.Net Framework引路蜂地图开发库 下载
.Net Framework引路蜂地图开发示例 下载
GTK Mono.Net Framework引路蜂地图开发示例 下载
引路蜂地图开发指南 下载
  1. Java SE引路蜂地图开发示例
  2. .Net Framework 中设置Web Proxy 的方法
  3. .Net Framework引路蜂地图开发示例
  4. 离线地图下载方法解析

在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);
	}
	
	
}
 

在Windows Mobile 显示透明 PNG的方法

同样在移植的过程中,发现 .Net compact Framework 不支持透明图像。原本具有透明属性的Png (含有 alpha通道),通过 Graphics.DrawImage 显示之后,不再具有透明特性。这对于地图分层显示带了麻烦。举例来说。带地名卫星地图一般是由两层图片叠加而成。

两个图片叠加形成最后的图片

当由于.Net Compact Framework缺省不支持透明图像,两幅图叠加是 道路图回彻底覆盖掉下面的卫星图。原来的透明色变成白色。 同样如果再有其它图层(比如路径),又覆盖掉道路图。
经过Google 搜索,有两种方法可以实现在Windows mobile 上透明图像的显示。

是通过IImagingFactory 接口

using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace DotNetPocketStreet.Drawing
{
enum ImageLockMode
{
ImageLockModeRead = 0x0001,
ImageLockModeWrite = 0x0002,
ImageLockModeUserInputBuf = 0x0004
};
// Pulled from gdipluspixelformats.h in the Windows Mobile 5.0 Pocket PC SDK
public enum PixelFormatID : int
{
PixelFormatIndexed       = 0x00010000, // Indexes into a palette
PixelFormatGDI           = 0x00020000, // Is a GDI-supported format
PixelFormatAlpha         = 0x00040000, // Has an alpha component
PixelFormatPAlpha        = 0x00080000, // Pre-multiplied alpha
PixelFormatExtended      = 0x00100000, // Extended color 16 bits/channel
PixelFormatCanonical     = 0x00200000,
PixelFormatUndefined     = 0,
PixelFormatDontCare      = 0,
PixelFormat1bppIndexed   = (1 | ( 1 << 8) | PixelFormatIndexed | PixelFormatGDI),
PixelFormat4bppIndexed   = (2 | ( 4 << 8) | PixelFormatIndexed | PixelFormatGDI),
PixelFormat8bppIndexed   = (3 | ( 8 << 8) | PixelFormatIndexed | PixelFormatGDI),
PixelFormat16bppRGB555   = (5 | (16 << 8) | PixelFormatGDI),
PixelFormat16bppRGB565   = (6 | (16 << 8) | PixelFormatGDI),
PixelFormat16bppARGB1555 = (7 | (16 << 8) | PixelFormatAlpha | PixelFormatGDI),
PixelFormat24bppRGB      = (8 | (24 << 8) | PixelFormatGDI),
PixelFormat32bppRGB      = (9 | (32 << 8) | PixelFormatGDI),
PixelFormat32bppARGB     = (10 | (32 << 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical),
PixelFormat32bppPARGB    = (11 | (32 << 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatGDI),
PixelFormat48bppRGB      = (12 | (48 << 8) | PixelFormatExtended),
PixelFormat64bppARGB     = (13 | (64 << 8) | PixelFormatAlpha  | PixelFormatCanonical | PixelFormatExtended),
PixelFormat64bppPARGB    = (14 | (64 << 8) | PixelFormatAlpha  | PixelFormatPAlpha | PixelFormatExtended),
PixelFormatMax           = 15
}
// Pulled from imaging.h in the Windows Mobile 5.0 Pocket PC SDK
public enum BufferDisposalFlag : int
{
BufferDisposalFlagNone,
BufferDisposalFlagGlobalFree,
BufferDisposalFlagCoTaskMemFree,
BufferDisposalFlagUnmapView
}
// Pulled from imaging.h in the Windows Mobile 5.0 Pocket PC SDK
public enum InterpolationHint : int
{
InterpolationHintDefault,
InterpolationHintNearestNeighbor,
InterpolationHintBilinear,
InterpolationHintAveraging,
InterpolationHintBicubic
}
// Pulled from gdiplusimaging.h in the Windows Mobile 5.0 Pocket PC SDK
public struct BitmapData
{
public uint Width;
public uint Height;
public int Stride;
public PixelFormatID PixelFormat;
public IntPtr Scan0;
public IntPtr Reserved;
}
// Pulled from imaging.h in the Windows Mobile 5.0 Pocket PC SDK
public struct ImageInfo
{
public uint GuidPart1;  // I am being lazy here, I don't care at this point about the RawDataFormat GUID
public uint GuidPart2;  // I am being lazy here, I don't care at this point about the RawDataFormat GUID
public uint GuidPart3;  // I am being lazy here, I don't care at this point about the RawDataFormat GUID
public uint GuidPart4;  // I am being lazy here, I don't care at this point about the RawDataFormat GUID
public PixelFormatID pixelFormat;
public uint Width;
public uint Height;
public uint TileWidth;
public uint TileHeight;
public double Xdpi;
public double Ydpi;
public uint Flags;
}
// Pulled from imaging.h in the Windows Mobile 5.0 Pocket PC SDK
[ComImport, Guid("327ABDA7-072B-11D3-9D7B-0000F81EF32E"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComVisible(true)]
public interface IImagingFactory
{
uint CreateImageFromStream();       // This is a place holder, note the lack of arguments
uint CreateImageFromFile(string filename, out INativeImage image);
// We need the MarshalAs attribute here to keep COM interop from sending the buffer down as a Safe Array.
uint CreateImageFromBuffer([MarshalAs(UnmanagedType.LPArray)] byte[] buffer, uint size, BufferDisposalFlag disposalFlag, out INativeImage image);
uint CreateNewBitmap(uint width, uint height, PixelFormatID pixelFormat, out IBitmapImage bitmap);
uint CreateBitmapFromImage(INativeImage image, uint width, uint height, PixelFormatID pixelFormat, InterpolationHint hints, out IBitmapImage bitmap);
uint CreateBitmapFromBuffer();      // This is a place holder, note the lack of arguments
uint CreateImageDecoder();          // This is a place holder, note the lack of arguments
uint CreateImageEncoderToStream();  // This is a place holder, note the lack of arguments
uint CreateImageEncoderToFile();    // This is a place holder, note the lack of arguments
uint GetInstalledDecoders();        // This is a place holder, note the lack of arguments
uint GetInstalledEncoders();        // This is a place holder, note the lack of arguments
uint InstallImageCodec();           // This is a place holder, note the lack of arguments
uint UninstallImageCodec();         // This is a place holder, note the lack of arguments
}
// Pulled from imaging.h in the Windows Mobile 5.0 Pocket PC SDK
[ComImport, Guid("327ABDA9-072B-11D3-9D7B-0000F81EF32E"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComVisible(true)]
public interface INativeImage
{
uint GetPhysicalDimension(out Size size);
uint GetImageInfo(out ImageInfo info);
uint SetImageFlags(uint flags);
uint Draw(IntPtr hdc, ref Rectangle dstRect, IntPtr NULL); // "Correct" declaration: uint Draw(IntPtr hdc, ref Rectangle dstRect, ref Rectangle srcRect);
uint PushIntoSink();    // This is a place holder, note the lack of arguments
uint GetThumbnail(uint thumbWidth, uint thumbHeight, out INativeImage thumbImage);
}
// Pulled from imaging.h in the Windows Mobile 5.0 Pocket PC SDK
[ComImport, Guid("327ABDAA-072B-11D3-9D7B-0000F81EF32E"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComVisible(true)]
public interface IBitmapImage
{
uint GetSize(out Size size);
uint GetPixelFormatID(out PixelFormatID pixelFormat);
uint LockBits(ref Rectangle rect, uint flags, PixelFormatID pixelFormat, out BitmapData lockedBitmapData);
uint UnlockBits(ref BitmapData lockedBitmapData);
uint GetPalette();  // This is a place holder, note the lack of arguments
uint SetPalette();  // This is a place holder, note the lack of arguments
}
}

调用方法如下

using (Graphics gxBuffer = Graphics.FromImage(backBuffer))
{
// Since we nop'd OnPaintBackground, take care of it here
gxBuffer.Clear(this.BackColor);
// Ask the Image object from Imaging to draw itself.
IntPtr hdcDest = gxBuffer.GetHdc();
Rectangle dstRect = new Rectangle(100, 100, 148, 148);
imagingResource.Draw(hdcDest, ref dstRect, IntPtr.Zero);
gxBuffer.ReleaseHdc(hdcDest);
// Ask the Image object from Imaging to draw itself.
/*IntPtr*/ hdcDest = gxBuffer.GetHdc(); // This is redundant, but keeps the necessary code together
/*Rectangle*/ dstRect = new Rectangle(50, 70, 50+132, 70+132);
imagingImage.Draw(hdcDest, ref dstRect, IntPtr.Zero);
gxBuffer.ReleaseHdc(hdcDest);
}
// Put the final composed image on screen.
e.Graphics.DrawImage(backBuffer, 0, 0);

文档可参考 http://msdn.microsoft.com/en-us/library/aa452202.aspx

另外一种方法还是采用Manged code, 对于预先知道透明色值的图像,比如地图API中的路径,背景色总为0xFFE0E0E0
可以使用下面方法

ImageAttributes _imageAttributes = new ImageAttributes();
Color color = Color.FromArgb(0xE0E0E0);
_imageAttributes.SetColorKey(color, color);
Rectangle dstRect =
 new Rectangle(x, y, netImage.GetWidth(), netImage.GetHeight());
gxBuffer.DrawImage(netImage._bitmap, dstRect, 0, 0,
                           netImage.GetWidth(),
netImage.GetHeight(),
GraphicsUnit.Pixel, _imageAttributes);

最终结果如下图

 

.Net Framework 中设置Web Proxy 的方法

正在进行Map API到 .Net Framework 平台移植。 涉及到 Http Connection. 其中可能用到 Web proxy的设置。
有两种简单的方法。

WebProxy proxy = new WebProxy("proxy address", port);  
proxy.Credentials = new NetworkCredential("user name", "password ", "domain");  
WebRequest.DefaultWebProxy = proxy; 

还有一种是设置全局 Web Proxy

WebProxy webProxy = new WebProxy("proxy url", 8080);  
NetworkCredential networkCredential 
 = new NetworkCredential("user name", "password", "domain");  
webProxy.Credentials = networkCredential;  
GlobalProxySelection.Select = webProxy; 

对于 Desktop 还可以在 App.config 中配置。 这里主要说明在 Windows Mobile 平台上可用的方法。

 

.Net Framework引路蜂地图开发示例

引路蜂地图也提供对.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);

设置Java SE平台相关图形系统实现

引路蜂地图开发包,在设计时尽量做到平台无关性,将一些平台相关的部分,如图形系统以接口形式定义,如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 

地址反编码

地址反编码是通过经纬度查询对应的地名,

注意使用字符串经纬度格式时,纬度在前,经度在后,如果反了,则返回的地名或能为空或都跑到外国去了。结果也是一个数组,一般到第一个结果,后面结果是更大的区域或是距离相对较远的地名。