WPF下的地图解决方案

 

最近在做一个wpf的程序,需要在地图上不是很精确的定位湖北省(以及江西省)所有的移动基站以及小区,于是乎,关于在WPF下使用地图功能的技术选择,搞了很长时间,我自己知道的,有如下两种:

1:MapInfo

2:Gmap.net

第一个,虽然说是在WPF下使用,但是,MapInfo提供的还是winform得,也就是说,您需要在wpf里面,host一个winform的用户控件(当然,也可以使用Form.Show的方式打开一个winform的窗体),关于wpf,winform在同一系统中的使用,本人没有怎么研究过,只是在winform中嵌套过wpf,但是,还真没在wpf中嵌套winform。

第二个:开源组件,在codeplex上可以查到。。这个非常的不错,提供了google,微软,argGis等等等的地图,开源的东西,不一定功能非常的强,但是,可以满足很多基本需求,如果对代码研究的深入,还可以使用很多的国内各大型地图网站提供的地图功能,比如包括51地图,e都市等。使用过e都市的同志们都知道,哪种伪3D的地图,看起来是比平面的要舒服。当然,使用google的卫星地图也还是可以的。。。

 

关于两种的不同:

1:mapinfo就是地图不好看,二呢,如果要再地图上面显示一个自定义控件(wpf的),我还不知道能否实现,但是,mapinfo本身提供的功能,那是足够强大的,包括框选,定位等等,但是,对于本项目的一个需求点来说,不满足,那就是做不到拓扑功能(主要是指两个节点之间的连线,也许是我自己对mapinfo不熟悉,所以不知道有无该功能)

2:gmap.net,开源的东西,主要的好处是,地图选择多,可以扩展(比如可以使用e都市等。),还有个就是,比如,可以画出公交线路图的哦,最最最最爽的一个就是,可以支持地图的缓存,该组件,最大的一个好处就在这,但是,TMD的google,如果使用这个组件经常的连接它的地图服务器,会封ip地址的。。。同时,google提供的国内地图,特别是平面的那类型的,经纬度是有非常大的偏差的,但是,卫星地图没什么偏差。。不知道gmap.net的主人,以后会不会再加入其它的功能,如果能加入拓扑功能以及能够解决封ip的问题,那就真是舒服呀。。。。

 

最终,经过比较,还是选择mapinfo,主要是因为移动公司会提供gis地图。

。。。。。。

过段时间,在把两个不同应用的效果截图放到这个地方。。

以下是对这两种方案的一些问题的说明:

1:mapinfo,如果要使用右键菜单,则不要定义在wpf里,应该定义到winform窗体中,就其原因,也许是wpf,winform同时存在的话,winform好像永远在最上层。。

 2:关于在客户机器上不安装mapxtreme,而要让程序跑起来的问题。

     这个,好像我还做不到,因为TMD关系到太多的dll了 ,难得找,还是在客户机上安装吧。。。

为什么要考虑安不安装呢,因为,有的时候,客户,真不想在他们的机器上安装过多的软件环境(特别是那些当大领导的。),当然,变态的还包括不安装.net framework 而让程序能够跑起来。。。。

题外话:

不知道有没有这样的方案或者技术,在某台服务器上,安装软件的运行环境以及程序版本,客户端通过某种技术,运行一种类似于代理的程序,运行指定的程序,实际上呢,真正的程序运行还是在服务端,客户端只是显示服务端程序运行的界面???

 

应该这个可以满足:

Ctrix

 

 

 3:关于找不到mapinfo的dll的问题

   如果程序编译的时候,出现找不到dll的问题,那有可能因为您使用的是vs 2005,2005默认的对dll的复制到本地设置为True,修改的方法是在引用中,找到mapinfo的dll,然后,右键,属性,复制到本地,false.

4:关于wpf中对winform UI控件的异步调用

两断代码的比较:

1:使用了Dispatcher

 

ContractedBlock.gif ExpandedBlockStart.gif 异步ui操作
        private void CreateCurrentRegionLayer()
ExpandedBlockStart.gifContractedBlock.gif        
{
            GetRegionNeObjectDelegate GetRegionNeObjectDelegate 
= new GetRegionNeObjectDelegate(GetCurrentRegionNeObject);

            GetRegionNeObjectDelegate.BeginInvoke(
new AsyncCallback(delegate(IAsyncResult ar)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                DataTable table 
= GetRegionNeObjectDelegate.EndInvoke(ar);
                
if (table != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    Dispatcher.Invoke(
new Action(delegate()
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        SetCurrentPointBMPStyle();

                        MapInfoUserControl.AddPointsData(table, 
"longitude""latitude");
                        MapInfoUserControl.CreateLayer(table.TableName);
                        MapInfoUserControl.SetPointStyle(table.TableName, 
"blue-21G.bmp"32);
                    }
), null);
                }

            }
), null);
        }

 2:未使用Dispatcher

 

 

ContractedBlock.gif ExpandedBlockStart.gif 未使用Dispatcher
        private void CreateCurrentRegionLayer()
ExpandedBlockStart.gifContractedBlock.gif        
{
            GetRegionNeObjectDelegate GetRegionNeObjectDelegate 
= new GetRegionNeObjectDelegate(GetCurrentRegionNeObject);

            GetRegionNeObjectDelegate.BeginInvoke(
new AsyncCallback(delegate(IAsyncResult ar)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                DataTable table 
= GetRegionNeObjectDelegate.EndInvoke(ar);
                
if (table != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
//Dispatcher.Invoke(new Action(delegate()
                    
//{
                        SetCurrentPointBMPStyle();

                        MapInfoUserControl.AddPointsData(table, 
"longitude""latitude");
                        MapInfoUserControl.CreateLayer(table.TableName);
                        MapInfoUserControl.SetPointStyle(table.TableName, 
"blue-21G.bmp"32);
                   
// }), null);
                }

            }
), null);
        }

现分别对两种方法的疑问:

第一种:Dispatcher是wpf里面特有的对UI线程的东西,但是,居然还可以适合于Winform的控件

第二种:这样写,居然运行不报错,按理说,也应该有个什么不能够访问UI线程的错误撒,虽然没有异常抛出 ,但是,界面还是没有任何显示的。也就是说,对ui层的操作,根本就不起作用。

转载于:https://www.cnblogs.com/yanchanggang/archive/2009/11/02/1594691.html

你可能感兴趣的:(WPF下的地图解决方案)