上一篇介绍了如何在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 < )
{
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, );
}
} 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://github.com/luxiaoxun/MapDownloader

更新:GMap默认提供的google地图的“路径查找”和“地址解析”功能已经无效,可以通过集成地图服务的API去做,需要申请开发者key。

一些地图开发者网站:

高德:https://lbs.amap.com/api/webservice/summary/

腾讯:http://lbs.qq.com/index.html

百度:http://developer.baidu.com/map/index.html

谷歌:http://maps.googleapis.com/

参考:

https://greatmaps.codeplex.com/

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

  1. Django-2- 模板路径查找,模板变量,模板过滤器,静态文件引用

    模板路径查找 路径配置 2. templates模板查找有两种方式 2.1 - 在APP目录下创建templates文件夹,在文件夹下创建模板 2.2 - 在项目根目录下创建templates文件夹, ...

  2. AI工具(缩放工具)(路径查找器)(旋转工具)(镜像工具)5.12

    缩放工具:选择图形,点击工具栏缩放工具,”ENTER"输入缩放比例,“复制”完成缩放复制. 路径查找器:选择两个图形,“窗口”“路径查找器”“差集”:大圆减去小圆,留下圆环. “减去顶层”: ...

  3. python 模块路径查找 及 添加

    **** python 模块路径查找: 通过模块的__file__属性来确定: **** 模块路径添加: 方法一:函数添加1 import sys2 查看sys.path3 添加sys.path.ap ...

  4. 3/21 Django框架 模板路径及模板过滤器 1.模板路径查找

    3/21 Django框架 模板路径及模板过滤器 1.模板路径查找 先找settings.py里的TEMPLATES列表下的DIRS路径.如果APP_DIRS为True,还会到注册了的APP文件夹下依 ...

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

    在学习HTML的时候一定会遇到引入文件和链接跳转页面,比如:JS文件.CSS文件.Image图片.我们就会考虑是相对路径和绝对路径的问题.下面PHP程序员雷雪松就详细讲解下Web开发中的相对路径和绝对 ...

  6. php中include包含文件路径查找过程

    首先,“路径”分为三种: 1.绝对路径,以/开头(unix系统)或c:等盘符开头(windows系统). 2.相对路径,以.开头,有./(当前目录)和../(上级目录). 3.其他路径,不是绝对路径和 ...

  7. Action开发、通配符、路径问题和struts中常量用法

    1.action开发 开发的几种方式 (1).继承自ActionSupport,(如果用struts的数据效验功,能必须必须使用此功能,因为ActionSupport实现了数据效验的接口) publi ...

  8. webpack 配置别名,解决 import 时路径查找麻烦的问题

    在编写代码时,使用 import 导入别的文件,可能会遇到查找路径麻烦的问题 比如这里的 ../../ 还要去思考多少个 ../ 那么可以在 webpack 中,将 src 目录设置一个别名,方便文件 ...

  9. 数据结构开发(14):KMP 子串查找算法

    0.目录 1.KMP 子串查找算法 2.KMP 算法的应用 3.小结 1.KMP 子串查找算法 问题: 如何在目标字符串S中,查找是否存在子串P? 朴素解法: 朴素解法的一个优化线索: 示例: 伟大的 ...

随机推荐

  1. PHP判断用户操作系统(Android,ipad,iphone,windows)

    这段脚本可以运用在:针对不同的操作系统,把用户引导向相应的网站或做相应的处理. <?php // PHP 判断客户端平台(PC.安卓.iPhone.平板) // strpos() 函数返回字符串 ...

  2. 关于Jquery学习的几点反思

    1.应用的API插件时,先看说明文档,仔细看,多花点时间也没关系. 2.写出你要完成工作的几个步骤,细化你的工作.保证每一步结果都是正确(特别是在用你不会的东西的时候),这样看起来是在浪费时间,但是最 ...

  3. FileUpload1上传控件

    <asp:FileUpload ID="FileUpload1" runat="server" /> string fn = System.IO.P ...

  4. iOS drawRect 和 awakeFromNib

    今天想在一个view上绘制一个虚线边框,百度到的代码如下: CAShapeLayer *borderLayer = [CAShapeLayer layer]; borderLayer.frame = ...

  5. 网页中超链接的简化问题(如何避免超链接的get提交)

    废话不多,直接看例子吧: <a href="###?key=${*** }">跳转</a> 上面这个超链接被点击后,肯定会向某个控制器发送一个get请求,而 ...

  6. jQuery 调用jsonp实现与原理

    jQuery 调用jsonp实现与原理 您的评价:        收藏该经验     阅读目录 1.客户端代码 2.服务器端 通过jQuery实现JSONP 一般的ajax是不能跨域请求的,因此需要使 ...

  7. python之集合,函数,装饰器

    本节主要内容如下: 1. set集合 2. 函数 -- 自定义函数 -- 内置函数 3. 装饰器 一. set 集合: 一个无序且不重复的序列. tuple算是list和str的杂合(杂交的都有自己的 ...

  8. Effective C++ -----条款18:让接口容易被正确使用,不易被误用

    好的接口很容易被正确使用,不容易被误用.你应该在你IDE所有接口中努力达成这些性质. “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容. “阻止误用"的办法包括建立新类型.限 ...

  9. vmstat uptime 系统状态脚本

    #!/bin/bash # # Command :vmstat,uptime #Capture_Stats - Gather System Performance Statistics ####### ...

  10. Jquery选中行实现行中的Checkbox的选中与取消选中

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...