GMap.Net开发之地址解析与路径查找

上一篇介绍了如何在GMap地图上添加多边形,这篇介绍下如何使用在线的地图服务进行“地址解析”和“路径查找”。

先看地址解析,GMap中的地址解析主要用到GeocodingProvider中的如下方法:

//根据关键字得到一组坐标
GeoCoderStatusCode GetPoints(string keywords, out List<PointLatLng> pointList); 

//根据关键字得到一个坐标
PointLatLng? GetPoint(string keywords, out GeoCoderStatusCode status);

//根据坐标得到一组地址
GeoCoderStatusCode GetPlacemarks(PointLatLng location, out List<Placemark> placemarkList);

//根据坐标得到一个地址
Placemark GetPlacemark(PointLatLng location, out GeoCoderStatusCode status);

先定义一些变量:

        private GMapOverlay locations = new GMapOverlay("locations"); //放置搜索结果的图层
        private GeocodingProvider gp; //地址编码服务
        List<PointLatLng> searchResult = new List<PointLatLng>(); //搜索结果
        PointLatLng start = PointLatLng.Empty; //路径开始点
        PointLatLng end = PointLatLng.Empty;   //路径结束点

        mapControl.Overlays.Add(locations); //不要忘了添加使用的图层

地址解析的准确度和当前使用的地图服务有很大关系,一般使用什么MapProvider就使用该MapProvider提供的服务。

如我使用的是GoogleChinaMap,就使用google的地址解析:

            mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地图

            gp = mapControl.MapProvider as GeocodingProvider;
            if (gp == null) //地址转换服务,没有就使用OpenStreetMap
            {
                gp = GMapProviders.OpenStreetMap as GeocodingProvider;
            }
            GMapProvider.Language = LanguageType.ChineseSimplified; //使用的语言,默认是英文

地址解析一般有2种情况,第一种就是根据坐标点得到该点对应的地址信息,在map的double click中,我们得到双击点的地址信息:

        void mapControl_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                PointLatLng point = mapControl.FromLocalToLatLng(e.X, e.Y);
                GeoCoderStatusCode statusCode = GeoCoderStatusCode.Unknow;
                Placemark? place = gp.GetPlacemark(point, out statusCode);
                if (statusCode == GeoCoderStatusCode.G_GEO_SUCCESS)
                {
                    GMapMarker marker = new GMarkerGoogle(point, GMarkerGoogleType.green);
                    marker.ToolTipText = place.Value.Address;
                    marker.ToolTipMode = MarkerTooltipMode.Always;

                    locations.Markers.Add(marker);
                }
            }
        }

效果图如下:

第二种情况就是根据地址得到对应的坐标点,输入字符串地址,在地图上得到对应的位置点,可能有多个,就做个了comboBox保存所有查询得到的结果,每次选择一个地址的时候,将地图的中心位置移到对应的Marker的位置,代码如下:

        private void buttonSearch_Click(object sender, EventArgs e)
        {
            searchResult.Clear();
            locations.Markers.Clear();
            this.comboBoxSearchResult.Items.Clear();

            string searchStr = this.textBoxSearch.Text;
            GeoCoderStatusCode statusCode = gp.GetPoints(searchStr, out searchResult);
            if (statusCode == GeoCoderStatusCode.G_GEO_SUCCESS)
            {
                foreach (PointLatLng point in searchResult)
                {
                    GMarkerGoogle marker = new GMarkerGoogle(point, GMarkerGoogleType.arrow);

                    GeoCoderStatusCode placeMarkResult = new GeoCoderStatusCode();
                    Placemark? place = gp.GetPlacemark(point, out placeMarkResult);
                    locations.Markers.Add(marker);
                    this.comboBoxSearchResult.Items.Add(place.Value.Address);
                }
                mapControl.ZoomAndCenterMarkers(locations.Id);
            }
        }

        private void comboBoxSearchResult_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.comboBoxSearchResult.SelectedIndex < 0)
            {
                return;
            }
            locations.Clear();
            GMarkerGoogle marker = new GMarkerGoogle(searchResult[this.comboBoxSearchResult.SelectedIndex], GMarkerGoogleType.red);
            locations.Markers.Add(marker);
            mapControl.Position = this.searchResult[this.comboBoxSearchResult.SelectedIndex];
        }

效果图:

只是简单的测了下,还是比较准确的。。

再来看看路径查找,GMap中的路径查找主要用到RoutingProvider的如下方法:

//avoidHighways:是否避免走高速公路
//walkingMode:是否步行
//zoom:查找路径时的zoom,貌似越大路径越准确

//根据起止点start、end和当前的zoom查找路径
MapRoute GetRoute(PointLatLng start, PointLatLng end, bool avoidHighways, bool walkingMode, int Zoom);

//根据出发点地址start、目的点地址end和当前的zoom查找路径
MapRoute GetRoute(string start, string end, bool avoidHighways, bool walkingMode, int Zoom);

先在地图上添加2个Marker,确定“起点”和“终点”:

        void mapControl_OnMarkerClick(GMapMarker item, MouseEventArgs e)
        {
            if (item is GMapMarkerImage)
            {
                currentMarker = item as GMapMarkerImage;
                currentMarker.Pen = new Pen(Brushes.Red, 2);
            }
        }

        private void buttonSetStart_Click(object sender, EventArgs e)
        {
            if (currentMarker != null)
            {
                start = currentMarker.Position;
            }
        }

        private void buttonSetEnd_Click(object sender, EventArgs e)
        {
            if (currentMarker != null)
            {
                end = currentMarker.Position;
            }
        }

再通过RoutingProvider得到起点和终点之间的路径:

        private void buttonFindRoute_Click(object sender, EventArgs e)
        {
            RoutingProvider rp = mapControl.MapProvider as RoutingProvider;
            if (rp == null)
            {
                rp = GMapProviders.OpenStreetMap; // use OpenStreetMap if provider does not implement routing
            }

            MapRoute route = rp.GetRoute(start, end, false, false, (int)mapControl.Zoom);
            if (route != null)
            {
                // add route
                GMapRoute r = new GMapRoute(route.Points, route.Name);
                r.IsHitTestVisible = true;
                locations.Routes.Add(r);

                // add route start/end marks
                GMapMarker m1 = new GMarkerGoogle(start, GMarkerGoogleType.green_big_go);
                m1.ToolTipText = "Start: " + route.Name;
                m1.ToolTipMode = MarkerTooltipMode.Always;

                GMapMarker m2 = new GMarkerGoogle(end, GMarkerGoogleType.red_big_stop);
                m2.ToolTipText = "End: " + end.ToString();
                m2.ToolTipMode = MarkerTooltipMode.Always;

                objects.Markers.Add(m1);
                objects.Markers.Add(m2);

                mapControl.ZoomAndCenterRoute(r);
            }
        }

效果图:

这里使用的google的地图服务,却没有使用google的API,GMap的作者通过解析浏览器访问google地图服务器和地图服务的URL(其他地图也一样),得到了每次访问的URL的格式和传入参数的格式,并找到了规律,确定如何传入参数和解析返回结果而封装了这些类和API,做了这个开源的项目,有兴趣的可看其源代码,还是很有收获的。。。

 

参考:

https://greatmaps.codeplex.com/

 

作者:阿凡卢

出处:http://www.cnblogs.com/luxiaoxun/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

http://www.cnblogs.com/luxiaoxun/p/3494756.html

时间: 2024-11-02 00:27:10

GMap.Net开发之地址解析与路径查找的相关文章

iOS开发入门:性能优化–查找和解决僵尸对象

内存泄漏是当一个对象或变量在使用完成后没有释放掉,那么如果我们走了另外一个极端情况会什么样呢?这就导致过渡释放(over  release)问题,从而使对象"僵尸化",对象称为僵尸(zombies)对象.一个对象已经被释放过了,或者调用者没有这个对象的所有权而释放它, 都会造成过渡释放,产生僵尸对象. 僵尸对象或许对很多人听起来很恐怖.也很陌生,如果要说起EXEC_BAD_ACCESS异常,可能大家并不陌生.试图调用僵尸对象方法应用会崩溃(应用直接跳出),并抛出异常EXEC_BAD_A

ios开发-IOS开发使用自定义字体路径问题求大神

问题描述 IOS开发使用自定义字体路径问题求大神 在项目开发中,我需要实现服务器管理UI风格,返回给我一个TTF格式的自定义字体包,我在加载里面的字体,问题就是服务器返给我的TTF字体包,我保存在沙盒里面读取不到.网上也找了很多资料,都没有答案,请问大神该怎么样解决.或者说我怎么把下载的字体加载到我的工程中 解决方案 http://blog.sina.com.cn/s/blog_9bf8abf301018pbr.html 解决方案二: iOS开发 - 使用自定义字体ios 使用自定义字体IOS使

驱动开发-为什么inf文件路径正确,就是在给挂载的镜像添加驱动的时候显示“在指定路径下找不到驱动程序包”

问题描述 为什么inf文件路径正确,就是在给挂载的镜像添加驱动的时候显示"在指定路径下找不到驱动程序包" 为什么inf文件路径正确,就是在给挂载的镜像添加驱动的时候显示"在指定路径下找不到驱动程序包" 解决方案 仔细再检查下相对路径.换一个计算机试试看.看看是不是环境的问题. 你提供的信息有限,没办法进一步判断. 解决方案二: 开发-为什么inf文件路径正确,就是在给挂载的镜像添加驱动的时候显示"在指定路径下找不到驱动程序包"-linux挂载is

java android开发-在解决构建路径错误之前不能构建该项目

问题描述 在解决构建路径错误之前不能构建该项目 JAVA初学者,目前正参考<第一行代码>学习中. 在创建HelloWorld应用的时候出现了如下所示报错,项目图标有感叹号出现. 如图示错误为在解决构建路径错误之前不能构建该项目开发-在解决构建路径错误之前不能构建该项目-构建android开发环境"> 下图是SDK manager的内容 我没有下载sample的extra.此外最下面的extra有一个broken source package不知道该如何修复.不知道上面问的构建路

Web开发中的相对路径和绝对路径

相对路径 相对路径,就是相对于当前文件的目标文件位置.这样有个好处就是,当你整个项目移动时,你项目内文件之间的相对关系没有改变,你之前设置的路径任然是准确的.例如:Web服务器文件夹a下面有index.html和image.jpg两个文件.index.html文件里引入image.jpg,只要这两个文件的相对位置没有变(也就是说还是在文件夹a下面),那么无论上传到Web服务器的哪个位置,这个路径都是正确的.在相对路径里面,./表示同级目录,../表示上级目录. 绝对路径 绝对路径是指目录下的绝对

Web 开发常用工具 大家自己查找下载_相关技巧

1.regex-coach --正则表达式工具 开发常用工具 大家自己查找下载_相关技巧-excel常用技巧"> 2. IECookiesView--IE的cookie查看工具 3.Flex Trace Panel --Flex开发日志观察工具 4.IE Development Toolbar --微软提供的IE开发插件 5.sIEve--javascript内存泄漏检测工具 6.HttpAnalyzer--HTTP抓包工具

Illustrator利用混合工具和路径查找器制作魅族标志教程

给各位Illustrator软件的使用者们来详细的解析分享一下利用混合工具和路径查找器制作魅族标志的教程. 教程分享:                   好了,以上的信息就是小编给各位Illustrator的这一款软件的使用者们带来的详细的利用混合工具和路径查找器制作魅族标志的教程解析分享的全部内容了,各位使用者们现在看到这里了,小编相信各位是非常的清楚了绘制方法了吧,那么大家就快去按照小编的教程自己去绘制下魅族标志吧.

Illustrator使用路径查找器联集功能教程

给各位Illustrator软件的使用者们来详细的解析分享一下使用路径查找器联集功能的教程. 教程分享: 1.打开Adobe Illustrator.   2.新建一个文档,大小设置为A4.   3.选择矩形工具,描边色设置为无,填色设置为红色.   4.使用矩形工具在画布中绘制一个矩形.   5.选择椭圆工具,描边色设置为无,填色设置为红色.   6.如图,在矩形上方绘制一个正圆.   7.打开[窗口]-[路径查找器].   8.使用选择工具框选两个图形,点击路径查找器面板中的[联集]按钮,将

GMap.Net开发之自定义Marker使用方法

 这篇文章主要介绍了GMap中Marker的使用方法,有需要的朋友可以参考一下 自定义Marker,可以理解为在地图上自定义图标(Custom Marker),先看看GMap的地图和图标的显示方式:   开发之自定义Marker使用方法-">   Map控件上可以添加Overlay(图层),可以添加多个图层,先添加的图层在下面显示.   图层上可以添加GMapMarker,当然也可以添加GMapPolygon和GMapRoute,后续介绍.   在地图的使用中常要求的功能就是添加自定义图标